本文共 1956 字,大约阅读时间需要 6 分钟。
JAVA集合框架中常用的集合及特点(适用场景、实现原理)
JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类。本文将就Java Collections Framework中常用的集合及其特点、适用场景、实现原理进行介绍,供学习者参考。当然,要真正深入理解Java的集合实现,还是要推荐去阅读JDK的源码。
Java提供的众多集合类由两大接口衍生而来:Collection接口和Map接口
Collection接口
Collection接口定义了一个包含一批对象的集合。接口的主要方法包括:
size() – 集合内的对象数量
add(E)/addAll(Collection) – 向集合内添加单个/批量对象
remove(Object)/removeAll(Collection) – 从集合内删除单个/批量对象
contains(Object)/containsAll(Collection) – 判断集合中是否存在某个/某些对象
toArray() – 返回包含集合内所有对象的数组
等
Map接口
Map接口在Collection的基础上,为其中的每个对象指定了一个key,并使用Entry保存每个key-value对,以实现通过key快速定位到对象(value)。Map接口的主要方法包括:
size() – 集合内的对象数量
put(K,V)/putAll(Map) – 向Map内添加单个/批量对象
get(K) – 返回Key对应的对象
remove(K) – 删除Key对应的对象
keySet() – 返回包含Map中所有key的Set
values() – 返回包含Map中所有value的Collection
entrySet() – 返回包含Map中所有key-value对的EntrySet
containsKey(K)/containsValue(V) – 判断Map中是否存在指定key/value
等
在了解了Collection和Map两大接口之后,我们再来看一下这两个接口衍生出来的常用集合类:
List类集合
List接口继承自Collection,用于定义以列表形式存储的集合,List接口为集合中的每个对象分配了一个索引(index),标记该对象在List中的位置,并可以通过index定位到指定位置的对象。
List在Collection基础上增加的主要方法包括:
get(int) – 返回指定index位置上的对象
add(E)/add(int, E) – 在List末尾/指定index位置上插入一个对象
set(int, E) – 替换置于List指定index位置上的对象
indexOf(Object) – 返回指定对象在List中的index位置
subList(int,int) – 返回指定起始index到终止index的子List对象
等
List接口的常用实现类:
ArrayList
ArrayList基于数组来实现集合的功能,其内部维护了一个可变长的对象数组,集合内所有对象存储于这个数组中,并实现该数组长度的动态伸缩
ArrayList使用数组拷贝来实现指定位置的插入和删除:
插入:
删除:
图片.png
LinkedList
LinkedList基于链表来实现集合的功能,其实现了静态类Node,集合中的每个对象都由一个Node保存,每个Node都拥有到自己的前一个和后一个Node的引用
LinkedList追加元素的过程示例:
ArrayList vs LinkedList
ArrayList的随机访问更高,基于数组实现的ArrayList可直接定位到目标对象,而LinkedList需要从头Node或尾Node开始向后/向前遍历若干次才能定位到目标对象
LinkedList在头/尾节点执行插入/删除操作的效率比ArrayList要高
由于ArrayList每次扩容的容量是当前的1.5倍,所以LinkedList所占的内存空间要更小一些
二者的遍历效率接近,但需要注意,遍历LinkedList时应用iterator方式,不要用get(int)方式,否则效率会很低
Vector
Vector和ArrayList很像,都是基于数组实现的集合,它和ArrayList的主要区别在于
Vector是线程安全的,而ArrayList不是
由于Vector中的方法基本都是synchronized的,其性能低于ArrayList
Vector可以定义数组长度扩容的因子,ArrayList不能
CopyOnWriteArrayList
转载地址:https://blog.csdn.net/weixin_32875295/article/details/114756556 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!