Interfaz detallada de lista de colecciones

Interfaz de lista

|----Collection接口:单列集合,用来存储一个一个的对象
         |----List接口:存储有序的、可重复的数据。  -->“动态”数组,替换原有的数组
             |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储              		|----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
    		 |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

Además de los métodos heredados de la colección Collection, la colección List agrega algunos métodos para manipular los elementos de la colección según el índice.

método descripción
añadir vacío (índice int, objeto ele) Inserte el elemento ele en la posición del índice
boolean addAll (índice int, Collection eles) Agregue todos los elementos en eles comenzando desde la posición del índice
Obtener objeto (índice int) Obtener el elemento en la posición de índice especificada
int indexOf (Objeto obj) Devuelve la posición donde obj aparece por primera vez en la colección.
int lastIndexOf (Objeto obj) Devuelve la posición de la última aparición de obj en la colección actual.
Objeto eliminar (índice int) Elimina el elemento en la posición de índice especificada y devuelve este elemento
Conjunto de objetos (índice int, Object ele) Establezca el elemento en la posición de índice especificada en ele
Lista subLista (int fromIndex, int toIndex) Devuelve la subcolección de fromIndex a toIndex

Una de las clases de implementación de la interfaz List: ArrayList

ArrayList es una clase de implementación típica y una clase de implementación principal de la interfaz List

  • Esencialmente, ArrayList es una matriz de referencias de objetos de "longitud variable"
  • La colección List devuelta por el método Arrays.asList (...) no es una instancia de ArrayList ni una instancia de Vector. Arrays.asList (…) El valor de retorno es una colección List de longitud fija

¿Cuál es la diferencia entre la implementación de ArrayList antes y después de JDK1.8?

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

      	结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)
jdk 8:
	ArrayList list = new ArrayList();//底层Object[] elementData初始化为{}.并没有创建长度为10的数组		
		list.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementData[0]
        ...
        后续的添加和扩容操作与jdk 7 无异。

Implementación de la categoría de interfaz List dos: LinkedList

Para operaciones frecuentes de inserción o eliminación de elementos, se recomienda utilizar la clase LinkedList, que es más eficiente

Nuevo método:

  • void addFirst (objeto obj)
  • void addLast (Objeto obj)
  • Objeto getFirst ()
  • Objeto getLast ()
  • Objeto removeFirst ()
  • Objeto removeLast ()

LinkedList: Lista doblemente enlazada. No se declara ningún arreglo dentro, pero el primero y el último del tipo de nodo se definen para registrar el primer y último elemento. Al mismo tiempo, la clase interna Node se define como la estructura básica para almacenar datos en LinkedList. Además de guardar datos, Node también define dos variables:

  • La variable prev registra la posición del elemento anterior.
  • La siguiente variable registra la posición del siguiente elemento.
private static class Node<E> {
    
    
    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;
    }
}

Listar la categoría de implementación de la interfaz tres: Vector

Vector es una colección antigua y JDK1.0 la tiene. La mayoría de las operaciones son las mismas que ArrayList, la diferencia es que Vector es seguro para subprocesos.

Entre varias listas, es mejor usar ArrayList como la opción predeterminada. Al insertar y eliminar con frecuencia, use LinkedList; Vector siempre es más lento que ArrayList, así que trate de evitar usarlo.

Nuevo método:

  • addElement vacío (objeto obj)
  • void insertElementAt (Objeto obj, índice int)
  • void setElementAt (Objeto obj, índice int)
  • void removeElement (Objeto obj)
  • void removeAllElements ()

Preguntas de entrevista:

请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?
 
ArrayList和LinkedList的异同
二者都线程不安全,相对线程安全的Vector,执行效率高。
此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

ArrayList和Vector的区别
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。

Supongo que te gusta

Origin blog.csdn.net/qq_44346427/article/details/110729382
Recomendado
Clasificación