java集合的底层实现_java-集合学习-底层实现

Collection类关系图

2ffc3f3aa7b1a206b6761576ea2b277a.png

单向链表

由若干个节点组成,每个节点除了数据域之外还保存一个指向下个节点的指针域。

优点:

插入/删除元素时,不需要像数组一样还得扩容、复制/移动元素,只需要修改一下next指针域即可。

缺点:

访问时,总是从第一个结点依次向后访问,只能向后访问,不能向前访问。

双向链表

LinkedList底层采用双向链表

使用LinkedList模拟栈结构。栈结构特点:后进先出。

Push()

Pop()

使用LinkedList,模拟队列。队列:先进先出。

Offer()

Poll();

HashSet

底层是HashMap

TreeSet

可以对元素排序,要求元素必须是可以比较的。

TreeSet是先选择Comparator,没有Comparator再选择

Comparable。

TreeSet的底层是TreeMap

TreeSet如果比较两个元素相同,只能存在一个。

要非常注意,比较方法。TreeSet集合根据Comparator/Comparable的比较结果是否为0,来判断元素是否为同一个元素的。

==================================

3.5 Collection小结

Collection单个存储

基本操作:

add(o),   remove(o),  contains(o),  size(),

iterator()  ?  hasNext(),  next(), remove()

----List

特点:

有序,存储顺序与添加顺序一样

可重复,可以存储重复的数据

为每个元素指定一个索引值

新增的操作:

add(inex, o ), remove(index), get(index), set(index, newValue)

sort(Comparator)

--------ArrayList

底层是数组, 访问快,添加删除慢

初始化容量:10

扩容: 1.5 倍

--------Vector

底层是数组,  它是线程安全的, ArrayList不是线程安全的

初始化容量: 10

扩容: 2倍

--------LinkedList

底层是双向链表, 添加/删除效率高,访问慢

新增的操作:

addFirst(o) / addLast(o)removeFirst()/removeLast()

getFirst()/getLast()

push(o)/pop()

offer(o)/poll()

*******应用场景***************************************************

存储可以重复的数据选择List集合

如果以查询访问为主,选择ArrayList

如果频繁的进行添加/删除操作,选LinkedList

如果开发多线程程序,选择juc包中的CopyOnWriterArrayList

-------注意------------------------------------------------------------------------------------------------

List集合,在contains(o), remove(o)操作时,需要比较元素,调用equals()方法

如果在List存储自定义类型数据,需要重写equals()/hashCode()

----Set

特点:

无序:存储顺序与添加顺序可能不一样

不可重复,存储的数据不允许重复

--------HashSet

底层是HashMap

向HashSet添加元素就是把该元素作为键添加到底层的HashMap中

HashSet就是HashMap键的集合

--------TreeSet

TreeSet实现了SortedSet接口,可以对元素自然排序,要求元素必须 是可比较的

(1)在构造方法中指定Comaparator比较器

(2)没有Comaprator,需要让元素的类实现Comaparable接口

TreeSet是先选择Comparator,在没有Comparator的情况下,再选择Comparable

TreeSet底层是TreeMap

向TreeSet添加元素就是把该元素作为键添加到底层的TreeMap中

TreeSet就是TreeMap键的集合

******应用场景*******************************************************

如果存储不重复的元素使用Set集合

如果不需要排序就使用HashSet

如果需要排序就选择TreeSet

-----注意--------------------------------------------------------------------------------------------------

HashSet中的元素需要重写equals()/hashCode()方法

TreeSet集合中判断是否相同的元素, 根据Comparator/Comparable比较结果是否为0来判断

===========================================

Map是以键值对存储数据

04db23e25fcc68a580351c79587d4849.png

原文:https://www.cnblogs.com/Tpf386/p/11153728.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值