1List集合

List集合的概述

  • 有序集合,这里的有序指的是存取顺序
  • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
  • 与Set集合不同,列表通常允许重复的元素

List集合的特点

  • 存取有序
  • 可以重复
  • 有索引

List接口的常用方法

方法名

描述

void add(int index,E   element)

在此集合中的指定位置插入指定的元素

E remove(int   index)

删除指定索引处的元素,返回被删除的元素

E set(int index,E   element)

修改指定索引处的元素,返回被修改的元素

E get(int   index)

返回指定索引处的元素

2List实现类-ArrayList

底层是数组结构实现,查询快、增删慢、线程不安全的

jdk8ArrayList源码分析

java 有序容器 有序list java_数组

源码中 int newCapacity = oldCapacity + (oldCapacity >> 1);

如果此次的添加导致底层elementData数组容量不够,则扩容。 默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。

所以开发过程时,知道大概的数据量时,建议使用带参的构造器:ArrayList list = new ArrayList(int capacity)

JDK7默认底层创建了长度是10的Object[]数组elementData,jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。

3List实现类-LinkedList

底层是链表结构实现,查询慢、增删快

特有方法

方法名  

说明

public void addFirst(E e)

在该列表开头插入指定的元素

public void addLast(E e)

将指定的元素追加到此列表的末尾

public E getFirst()

返回此列表中的第一个元素

public   E getLast()

返回此列表中的最后一个元素

public E removeFirst()

从此列表中删除并返回第一个元素

public   E removeLast()

从此列表中删除并返回最后一个元素

体现了LinkedList的双向链表存储

private static class Node<E> { E item;//本node存储信息 Node<E> next;//下一个node元素存储信息 Node<E> prev;//上一个node元素存储信息 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }

 

java 有序容器 有序list java_java_02

4常见面试题

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