Java中的数据结构

本文详细介绍了Java集合框架中的各种接口如Collection、Queue、List(包括ArrayList、LinkedList和Vector)、Set(HashSet和TreeSet)以及Map(HashMap和TreeMap)的特点、底层实现和使用场景,帮助读者理解如何根据需求选择合适的容器。
摘要由CSDN通过智能技术生成

1.集合的划分情况

89619ec2535d46bb8b60f62d9a743350.png

1.定义:

容器,存储多个数据。底层使用不同的数据结构进行存储,每种数据结构都有各自的特点。

2.Collection接口(集成迭代器接口,Collection的实现类可以使用迭代器)

1).Queue:队列
2).List:
1.ArrayList:

            底层实现:数组(数组扩容)

            特点:

                1.存储元素有序(存储顺序)

                2.存储元素允许重复

                3.查找效率高(底层的数组为连续的空间)

                4.删除,添加时效率低

                    涉及到元素的移动,数组的扩容(拷贝原数组中的数据)

                5.数组扩容时为原数组1.5倍

                6.线程不安全

2.LinkedList:

            底层实现:链表(双向链表,提高查询效率,可以从头结点或尾结点查找)

            特点:

                1.存储元素有序(存储顺序)

                2.存储元素允许重复

                3.查找效率低

                4.删除,添加时效率高

                    修改前后节点地址,不需要扩容

                5.不涉及扩容

                6.线程不安全

3.Vector:

            底层实现:数组(数组扩容)

            特点和ArrayList相似,线程安全

4.List接口实现类遍历方式

            1.普通for循环

            2.增强for循环

            3.迭代器

3).Set:
1.HashSet:

            底层实现:HashMap(以key-value形式存储,存储到散列表中)

            存储过程:

                将存储的元素作为底层HashMap存储时的key,value值自动的创建。

            特点:

                1.存储元素无序

                2.存储元素不允许重复

                3.没有提供获取元素方法,只能遍历获取(1.增强for循环 2.迭代器)

                4.线程不安全

2.TreeSet:

            底层实现:TreeMap(以key-value形式存储,存储到红黑树中)

            存储过程:

                 将存储的元素作为底层TreeMap存储时的key,value值自动的创建。

                 将key进行值的比较存储到红黑树的制定位置。

             特点:

                1.存储元素有序(值大小顺序)

                2.存储元素不允许重复

                3.没有提供获取元素方法,只能遍历获取(1.增强for循环 2.迭代器)

                4.线程不安全

2.Map接口(key-value形式存储)

1.HashMap:

        底层实现:

            1.jdk1.8之前:数组 + 链表

                1.扩容时使用头插

                2.散列表的数组扩容后为原数组的2倍

            2.jdk1.8及之后:数组 + 链表 + 红黑树 (红黑树可以提高查询的效率)

                1.重要的属性:

                    1.DEFAULT_INITIAL_CAPACITY=16:默认数组的初始换容量(没有指定数组长度使用该默认值)

                    2.MAXIMUM_CAPACITY=2^30:数组最大长度

                    3.DEFAULT_LOAD_FACTOR=0.75f:默认负载因子(数组长度*负载因子 = 扩容阈值)

                    4.TREEIFY_THRESHOLD=8:链表转换为红黑树的链表个数阈值

                    5.UNTREEIFY_THRESHOLD=6:红黑树转换为链表的链表个数的阈值

                    6.MIN_TREEIFY_CAPACITY=64:链表转换为红黑树的最小数组长度

                    7.threshold:阈值

                    8.loadFactor:负载因子

                2.构造方法:

                    1.new HashMap();

                        1.默认的负载因子为负载因子属性赋值

                        2.没有创建散列表底层的数组

                    2.new HashMap(数组长度);

                        1.默认的负载因子为负载因子属性赋值

                        2.计算了数组的长度(必须为2的n次幂)

                        3.没有创建散列表底层的数组

                    3.new HashMap(数组长度,负载因子);

                        1.指定的负载因子为负载因子属性赋值

                        2.计算了数组的长度(必须为2的n次幂)

                        3.没有创建散列表底层的数组

                3.put():

                    1.计算key的Hash值((h = key.hashCode()) ^ (h >>> 16),减少Hash冲突)

                    2.判断散列表中的数组是否为nll

                        1.null:(数组还未创建)

                            1.new HashMap();

                                1.创建长度为默认长度的数组(16)

                                2.扩容阈值为,默认负载因子*默认数组长度(16*0.75=12)

                            2.new HashMap(数组长度); | new HashMap(数组长度,负载因子);

                                1.计算了数组长度(必须为2的n次幂)为threshold赋值

                                    注意:

                                        只有该情况时,threshold才作为数组的长度

                                2.创建长度为2的n次幂的数组(指定的长度,不是2的n次幂自动转换为2的n次幂)

                                3.新数组长度*负载因子

                        2.非null:(数组已经创建了)

                            1.计算存储key-value的key的在数组中存储的位置

                            2.判断数组中该位置是否有节点

                                1.没有:(没有冲突),创建节点存储在该位置

                                2.有:(出现冲突)

                                    1.判断存在的key和要添加的key是否相同

                                        相同:新值替换旧值

                                    2.判断存在的节点是否为数节点

                                        是:添加到数中

                                    3.判断节点数是否大于等于8

                                        1.>=8:判断数组长度是否大于64

                                            1.是:变为红黑树

                                            2.否:数组扩容

                                        2.<8:直接添加当前链表的尾部

                        3.++size > threshold:判断散列表中元素个数+1后是否大于扩容阈值

                            1.是:扩容

                                数组长度扩容为原数组的2倍

                                将原数组中的节点放入新数组中

                            2.否:结束

                3.特点

                    1.存储元素无序

                    2.存储元素的key不可以重复

                    3.存储元素的value可以重复

                    4.散列表的数组每次扩容为原长度的2倍

                    5.线程不安全

2.TreeMap:

        底层数据结构:红黑树

        特点:

            1.存储元素有序(值大小顺序)

            2.存储元素的key不可以重复并且不能为null

            3.存储元素的value可以重复

            4.线程不安全

2.如何选择合适的存储容器

1.根据需求,不允许存储重复性元素时(Set)

2.根据需求,允许存储重复性元素时(List)

3.根据需求,存储键值对元素且对键值对元素无排序时(HashMap)

4.根据需求,存储键值对元素且对键值对元素有排序时(TreeMap)

2.ArrayList集合的声明 

  • 父级集合接口 <数据类型> 集合名称 = new 父级集合接口实现类<数据类型>()
  • List<Integer> list = new ArrayList<Integer>();

3.ArrayList集合方法的说明 

(1)Collection

c3d3a67b58974169a2b56b22a6764a7f.png

(2)List

8148147b393146f080c02028859aaffb.png (3)ArrayList集合中方法的汇总

94907c1bffda42568038ed40f84d51f0.png

(4)迭代器iterator()de使用

ab1054a9d9e7451aaf818ea5bff098d4.png

注意:在使用集合存储引用对象时,集合中存储的并不是实例本身,只是一个对象的引用而已

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值