JavaSE进阶

11.4 List接口

  • List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

11.4.1 List接口的方法

  • List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法
    • void add(int index, Object ele)
    • boolean addAll(int index, Collection eles)
    • Object get(int index)
    • int indexOf(Object obj)
    • int lastIndexOf(Object obj)
    • Object remove(int index)
    • Object set(int index, Object ele)
    • List subList(int fromIndex, int toIndex)

11.4.2 List接口的迭代器ListIterator

除了foreach和Iterator迭代器之外,List 额外提供了一个 listIterator() 方法,该方法返回一个 ListIterator 对象, ListIterator 接口继承了 Iterator 接口,提供了专门操作 List 的方法:

  • void add()
  • void set(Object obj)
  • void remove()

 

  • boolean hasPrevious()
  • Object previous()
  • int previousIndex()

 

  • boolean hasNext()
  • Object next()
  • int nextIndex()

11.4.3 List的实现类

ArrayList:底层实现是数组,线程不安全,效率高,所以,查询块,修改、插入、删除慢

LinkedList:底层实现是链表,线程不安全,效率高。所以,查询慢,修改、插入、删除快

Vector:底层实现是数组,线程安全,效率低。但是即使为保证 List 集合线程安全,也不推荐使用Vector。

 

ArrayList的JDK1.8之前与之后的实现区别?

JDK1.7:ArrayList像饿汉式,直接创建一个初始容量为10的数组

JDK1.8:ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组

1、ArrayList与Vector的区别?

  • 底层都是数组,Vector默认初始容量是10,ArrayList看版本.
  • ArrayList扩容增加原来的50%,Vector扩容增加原来的1倍。
  • ArrayList线程不安全,效率高,Vector线程安全,效率低。
  • Vector因为版本古老,支持Enumeration 迭代器。但是该迭代器不支持快速失败。而Iterator和ListIterator迭代器支持快速失败。如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的 remove 或 add 方法之外的任何其他方式),则迭代器将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就完全失败,而不是冒着在将来不确定的时间任意发生不确定行为的风险。

自学:Enumeration 迭代器的使用

2、LinkedList的特点

LinkedList:双向链表,除了保存数据,还定义了两个变量:

prev变量记录前一个元素的位置

next变量记录下一个元素的位置

例如:

对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。新增方法:

  • void addFirst(Object obj)
  • void addLast(Object obj)
  • Object getFirst()
  • Object getLast()
  • Object removeFirst()
  • Object removeLast()