Este artículo analiza las respuestas de las preguntas más votadas en Stack Overflow. La persona que hizo esta pregunta obtuvo muchos puntos de reputación, lo que podría otorgarle permisos para hacer muchas cosas en Stack Overflow. Esto no tiene sentido para mí, pero primero echemos un vistazo a la pregunta.
La pregunta es «¿cómo convertir la siguiente matriz en una ArrayList?».
Element[] array = {new Element(1),new Element(2),new Element(3)}; |
1. Respuesta más popular y aceptada
La respuesta más popular y aceptada es la siguiente:
ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array)); |
Primero, echemos un vistazo a Java Doc para el método constructor de ArrayList.
ArrayList (Colección Extiende E> c): construye una lista que contiene los elementos de la colección especificada, en el orden en que los devuelve el iterador de la colección.
Entonces, lo que hace el constructor es lo siguiente:
1. Convierta la colección c en una matriz
2. Copie la matriz en la propia matriz posterior de ArrayList llamada «elementData»
Aquí está el código fuente de Contructor of ArrayList.
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } |
2. Siguiente respuesta popular
La siguiente respuesta popular es:
List<Element> list = Arrays.asList(array); |
No es el mejor, porque el tamaño de la lista devuelto por asList()
está arreglado. En realidad, la lista devuelta no es java.util.ArrayList
, pero una clase estática privada definida dentro java.util.Arrays
. Sabemos ArrayList
se implementa esencialmente como una matriz, y la lista devuelta por asList()
es una lista de tamaño fijo respaldada por la matriz original. De esta manera, si agrega o elimina elementos de la lista devuelta, se lanzará una UnsupportedOperationException.
list.add(new Element(4)); |
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList at collection.ConvertArray.main(ConvertArray.java:22)
3. Otra solución
Esta solución es del comentario de Otto a continuación.
Element[] array = {new Element(1), new Element(2)}; List<element> list = new ArrayList<element>(array.length); Collections.addAll(list, array); |
4. Indicaciones de la pregunta
El problema no es difícil, pero sí interesante. Todos los programadores de Java conocen ArrayList, pero es fácil cometer ese error. Supongo que por eso esta pregunta es tan popular. Si se hiciera una pregunta similar sobre una biblioteca Java en un dominio específico, sería menos probable que se hiciera tan popular.
Hay varias respuestas que brindan la misma solución. Esto también es cierto para muchas otras preguntas en Stack Overflow, ¡supongo que a las personas simplemente no les importa lo que digan los demás si les gustaría responder una pregunta!
Referencia: El enlace de la pregunta de stackoverflow