Java集合--List集合
collection大致结构体系
先来介绍一下collection的功能:
Collection的功能: 1,添加功能: boolean add(Object obj):添加一个元素 boolean addAll(Collection c):添加一个元素的集合 2,删除功能: void cler():移除所有的元素 boolean remove(Object):移除一个元素 boolean removeAll(Collection c):移除一个集合的元素,只要一个元素被移除,就返回True 3,判断功能: boolean contains(Object c):判断集合是否包含元素 boolean containsAll(Collection c):判断集合中是否包含指定的集合元素,只有包含所有的元素,才叫包含 boolean isEmpty():判断集合是否为空 4,获取功能: Iterator<E> iterator():迭代器 5,长度功能: int size():元素的的个数 6,交集功能: boolean retainAll(Collection c):移除此collection中未包含在指定collection中的所有元素。 集合A和集合B做交集,最终结果保存在集合A中,返回值表示A是否发生变化
collection继承了Iterator(迭代器),是的collection可以遍历,Iterator是一个接口,包含以下三个方法:
- hasNext()
- next()
- remove()
Iterator并没有具体的实现方法,因为collection中有多种类型,每一种类型的遍历方式都不同,所以每个集合的遍历都在自己的类中实现。
List集合的特点是:有序存储,即存储顺序和取出顺序相同,可以重复
常用的List有:ArrayList、Vector、LinkedList
- ArrayList:底层数据结构是数组,线程不安全,查询较快、增删慢
- LinkedList:底层是链表,线程不安全,增删较快,查询慢
- Vactodiyir:底层是数组,线程安全,查询较快、增删慢
ArrayList:
- 当不指定容量时,初始容量为10,并且在第一次插入ArrayList时,数组会扩容
- add方法有两个,一个直接在尾部添加,一个在指定位置添加。add(e),在尾部添加,每次添加需要判断容量是否够
- 如果需要扩容,会扩容1.5倍。然后调用copyOf()方法转移到新数组
- add(index, e),首先检查数组是否越界,然后扩容,调用arraycopy()方法插入,arraycopy是用C/C++写的,效率较高
- get() 检查下标,返回元素
- set(index, e) 检查角标,替换新值,返回旧值。
- remove(index) 检查角标,删除元素,计算需要移动的个数,并移动。设置为null,等待GC的回收
总结:
- ArrayList是动态扩容的数组,在增删的时候需要拷贝复制
- 初始容量为10,扩容时扩容1.5倍
- 不是线程安全的,可以存储null值
Vector与ArrayList的比较:
- Vector 是一个比较旧的集合类,底层实现也是数组,相对于ArrayList是线程安全的
- Vector扩容时是原来的1倍,ArrayList是0.5倍,每次扩容它的内存消耗都要大于ArrayList
- Vector所有的方法是同步的,性能会损失
LinkedList:
- 底层实现是双向链表,LinkedList实现了Deque接口,因此可以操作LInkedList像操作队列和栈一样
- add(e) 在链表最后添加元素
- remove() 删除元素时实际上使用equals看看 元素是否在里面,然后删除元素,双链表的删除
- get(index) 会首先判断下标位置,如果小于长度的一般,则从头开始遍历,否则就会从尾部遍历
- set(index, e) 与get方法类似,先判断下标,是从头遍历还是从尾遍历
总结:
- 一般情况,查询多用ArrayList,增删多用LinkedList, 个别极端情况下比如(ArrayList末尾增加、删除元素是要快于linkedList)
以上是个人学习总结,参考了公众号Java3y大佬的文章,原文源码讲解很详细,大佬的文章没得说,学习Java的话很值得去看一看,推荐一波~
大佬Github:https://github.com/ZhongFuCheng3y/3y