List集合框架

List集合框架

1.List的三个实现类

ArrayList:作为List接口主要实现类,线程不安全,效率高,底层使用object数组存储(Object[] elementData),可以通过Collections工具类使ArrayList变成线程安全的。

Vector:作为List的古老实现,线程安全,效率低, 底层使用object数组存储(Object[] elementData)。现在几乎不使用。

LinkedList:底层使用双向链表来存储,对于频繁的插入,删除操作,使用此类要比使用ArrayList效率高,但查询的效率要更低。

2.ArrayList的源码分析

2.1 jdk 7情况下

在初始化时直接就创建了一个长度为10的,如果在添加时底层的elementData数组长度不够的话,则扩容。

在默认情况下,扩容为原来的1.5倍,同时需要把原来数组中的数据复制到新的数组中。

2.2 jdk 8 中ArrayList的变化

ArrayList[] a = new ArrayList(),底层将Object[] elementData 初始化为{},并没有创建数组,在第一次调用add后,才创建长度为10的数组。
后序的添加,扩容与jdk7无异。
jdk 8 延迟了数组创建的时间,节省了内存。

3.LinkedList的源码分析

LinkedList底层使用了双向链表,里面有一个Node类,声明了Node类型的first,last。
Node的结构为:

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;
 }
}

剩下的add,remove都涉及到链表的算法。

4. List接口添加的方法

List接口作为Collection子接口,应该定义了Collection接口中所有方法,由于List是有序集合,List接口在Collection的基础上添加了下列方法:

  1. void add(int index, Object element):
    将元素element插入到List集合的index处。要注意,这个方法和Collection接口规定的方法不是一个方法,虽然他们的名字都是add,但函数返回值,参数都不一样,所以他们不是同一个方法。

  2. boolean addAll(int index,Collection c):
    将集合C所包含的所有元素都插入到List集合的index处。同样他和Collection接口规定的方法不是一个方法

  3. Object get(int index): 返回集合index处的元素。

  4. int indexOf(Object o): 返回对象O在集合中第一次出现的位置的索引。

  5. int lastIndexOf(Object o):返回对象O在集合中最后一次出现的位置的索引。

  6. Object remove(int index): 删除并返回index索引处的元素。

  7. Object set(int index, Object element):将index索引处的元素替换成element对象,并返回被替换的旧元素。

  8. List subList(int fromIndex,Object element): 返回从 fromindex(包含),到 toindex(不包含)处所有元素组成的子集合。就是切片了。

  9. void replaceAll(UnaryOperator operator):根据 operator指定的计算规则重新设计集合所有元素。

  10. void sort(Comparator c): 根据c参数

  11. ListIterator listIterator(): List不仅提供Iterator方法,还提供了listiterator方法,该方法返回一个ListerIterator接口的实现类,该接口继承了Iterator接口,在Iterator接口的基础上,添加了:

    • boolean hasPrevious(): 判断集合中某个元素是否有上一个元素。

    • Object previous(): 返回迭代器上一个元素

    • void add(Object o): 在上一次迭代元素的后面添加一个新元素。

从这些提供的方法不难看出,ListIterator还可以添加元素(Iterator只能remove),还可以反向迭代。要注意的是:ListIterator接口继承Iterator接口,所以Iterator有的方法它都有,不是只有上面三个方法,它也可以remove,也可以正向迭代。

常用方法

  • 增:boolean add(Object obj)

  • 删:Object remove(Object obj) / remove(int index)

  • 改:Object set(int index, Object element)

  • 查:Object get(int index);

  • 插:boolean add(int index, Object element)

  • 遍历:

    • Iterator迭代器

    • 增强for循环

    • 根据index,使用普通的循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值