---- Colección conjunto de análisis de código fuente Entrevista

Colección de interfaz: un conjunto único, para el almacenamiento de un objeto de una

. 1, Lista de interfaz: almacenar una, los datos repetible ordenada. -> array "dinámica", vuelva a colocar la matriz original

2, la ArrayList: una clase de interfaz principal Lista de aplicación, flujos seguros, de alta eficiencia, el uso de objetos subyacente [] de almacenamiento elementData

2,1, análisis de código fuente ArrayList: JDK7

ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组elementData
list.add(123); //elementData[0] = new Integer(123);
...
list.add(11);//如果此次的添加导致底层elementData数组数组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有的数据复制到新的数组中。

Conclusión: Se recomienda para su uso con un constructor argumento del desarrollo: Lista ArrayList = new ArrayList (capacidad int)

2,2, jdk8 en ArrayList cambia:

ArrayList list = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度为10的数组
list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将123添加到elementData中去
//后续的添加和扩容操作与jdk 7无异

Conclusión: para crear objetos en JDK7 ArrayList es similar a un hombre hambriento solo ejemplo, y crear simples objetos similares perezosos en jdk8 ArrayList, la demora para crear la matriz, el ahorro de memoria.

. 3, la LinkedList: para la inserción frecuente, eliminación, uso de tal eficiencia superior a la ArrayList; capa inferior utilizando una memoria de lista doblemente enlazada

3,1, código fuente LinkedList análisis:

LinkedList list = new LinkedList();内部声明了Node类型的first和last属性,默认值为null
list.add(123);//将123封装到Node中,创建了Node对象。
其中,Node定义为:体现了LinkedList的双向链表的说法
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }

. 4, el vector: Como antigua clase implementación de la interfaz de lista, baja eficiencia flujos seguros, el uso de objetos subyacente [] de almacenamiento elementData

4,1, análisis de código fuente del Vector :

         JDK7 y jdk8 por Vector () crea cuando los objetos son creados con una longitud de la parte inferior de la matriz 10, en términos de expansión, la expansión a la predeterminada original dos veces la longitud de la matriz


Conjunto de interfaz: el almacenamiento de datos que no se repite al azar,

1, HashSet: como la clase principal que implementa la interfaz Set, thread-safe, pueden almacenar valores nulos

2, un LinkedHashSet: como una subclase de HashSet: atravesando su información interna para ser atravesado en orden de adición. Para la operación de recorrido frecuente, LinkedHashSet eficiente que HashSet.

. 3, TreeSet: propiedades pueden especificarse de acuerdo con el objeto agregado

3.1 TreeSet:

1, el requisito de datos TreeSet añadido es el objeto de la misma clase

2 Tanto Ordenar: ordenamiento natural (implementar la interfaz Comparable) y la costumbre de clasificación (Comparador)

3, en el orden natural, si los dos objetos de los mismos criterios de comparación como: compareTo () devuelve 0, ya no es igual a ().

4, Organización personalizada, si el mismo estándar para comparar dos objetos a: compare () devuelve 0, no hay iguales prolongadas ().

análisis de código fuente conjunto

Situado en el desorden: no hace aleatoriedad media. Los datos almacenados en la matriz de modo que la orden no se añade a los datos subyacentes, pero se determina basándose en un valor de hash de los datos

Nonrepeatability: garantizada se determina, de acuerdo con los elementos aditivos no pueden regresar verdaderos iguales (). Es decir: los mismos elementos se pueden añadir sólo una

El proceso de añadir elementos: a HashSet (lista + array) como un ejemplo:

Añadimos un elemento a un HashSet, el método primera llamada hashCode (), calcula un valor hash del elemento donde el elemento a, entonces el valor de hash calculado en la matriz de posición de almacenamiento HashSet subyacente (que está indexado por un algoritmo posición), determina si hay elementos en esta ubicación array:

    Caso 1 -> Si no hay otro elemento en esta posición, el elemento añadido de un éxito.
                    Si hay otros elementos B (o una pluralidad de elementos presentes en la forma de una lista enlazada) en esta posición, un valor hash del elemento y la comparación elemento B es:
    Escenario 2 -> Si los valores de hash no son idénticos, el elemento de una se agrega correctamente.
                            Si los valores de hash son los mismos, y por lo tanto una necesidad de llamar a la clase en la que el elemento es igual a () Método:
                                procedimiento vuelve a igual a true (), la adición de un elemento falla.
    Caso 3 -> es igual a () devuelve el método falsas, entonces el elemento añadido un éxito.

Para añadido éxito en términos de la caja 2 y Caso 3: un elemento ya presente en los datos en el índice especificado de la lista almacenada.
JDK7: un elemento en una matriz, los elementos del punto original.
jdk8: El elemento original en la matriz, seleccione elementos de un
resumen: hecha un lío

4.1 Conjunto de interfaz adicional sin definir un nuevo método, utilizando los métodos de la colección son declarados antes.

4.2 Requisitos:

    Reescribir el hashCode () y equals () para mantener la coherencia de lo posible: objetos iguales deben tener las mismas código hash
    método de reescritura dos puntas: el objeto que se utiliza como método para comparar Campo equals (), debe utilizarse se calcula el valor hashCode

¿Por qué método hashCode reescritura, hay 31 ese número?

1. Seleccionar el coeficiente de tiempo para elegir el mayor factor posible, ya que si la dirección de hash calculado el más grande, llamado "conflicto" menos y buscar la eficiencia mejorará. (Reducir los conflictos)

2, y 31 ocuparon 5bits, multiplicando la baja probabilidad resultante de desbordamiento de datos.

3,31 -1 pueden ser representados por i * 31 == (i << 5), ahora tiene mucho que ver el interior de la optimización de la máquina virtual-relacionado. (Para mejorar la eficiencia del algoritmo)

4, 31 es un número primo, el papel de los números primos es que si uso un número que se multiplica por este número primo, entonces el resultado final sólo puede estar fuera del propio número primo es divisible por 1 y multiplicando así! (Reducir los conflictos)

Publicado 67 artículos originales · ganado elogios 19 · vistas 9874

Supongo que te gusta

Origin blog.csdn.net/qq_41530004/article/details/103890766
Recomendado
Clasificación