Java List基础必知必会

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。即可以用索引来访问指定位置List中的元素。List集合默认按元素的添加顺序设置元素的索引,List集合允许塞数据类型不一样的元素
在这里插入图片描述

一、ArrayList

ArrayList为List集合类的典型实现,它是基于数组来实现的,内部封装了一个动态的、允许再分配的Object[]数组,默认长度为10,加载因子为1,一次扩容后的长度为原长度的1.5倍+1(例如对10进行扩容,扩容后的长度为10*1.5+1 = 16)。

二、Vector

Vector也是List集合类的典型实现,它是线程安全的,基于数组实现,不过他过于古老,一般不推荐使用。默认长度为10,加载因子为1,一次扩容后的长度为原长度的2倍。

三、LinkedList

LinkedList顾名思义,是基于链表实现的**,底层是双向循环链表**。
在此讲一下LinkedList与ArrayList的区别:
1.访问方面:ArrayList的访问效率要比LinkedList效率要高,LinkedList需要对链表进行遍历挨着找。
2.增删:对于ArrayList,最好的情况就是在把表最后的元素增删,最差的情况是把元素在表最前面增删(需要把后面的元素都进行移动),而对于LinkedList,在这方面就快很多。
3.空间浪费方面:ArrayList对于空间的浪费,主要是在一次扩容后,可能有相当一部分空间没有元素;LinkedList对于空间的浪费体现在每个元素都占用了一定的空间。

四、对于List的性能分析

一般来说,由于数组以一块连续内存区来保存所有的数组元素,所以数组在随机访问时性能最好,所有的内部以数组作为底层实现的集合在随机访问时性能都比较好;而内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。不过总体来说ArrayList的性能要比LinkedList要好。
对于遍历集合元素:ArrayList和Vector应该使用随机访问方法(get)来遍历集合元素,这样性能更好;而对于LinkedList集合,则应该采用迭代器(iterator)来遍历集合元素。
如果需要经常执行插入删除操作来改变包含大量数据的List集合的大小,建议使用LinkedList。
如果有多个线程需要同时访问List集合中的元素,不需要一定用Vector,可以用Collections将集合包装成线程安全的集合。

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/101154936