Java中的集合

一入Java情几许?大家好,我是深山夕照深秋雨。

在我们编程时,数据的存储是非常重要的。今天我们来介绍一下Java中的集合。集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。

集合的体系结构包括CollectionMap。Collection代表单列集合,每个元素(数据)只包含一个值。 Map代表双列集合,每个元素包含两个值(键值对)。

一、Collection

下面用一张图理清Collection集合体系:

接下来介绍各实现类的底层原理:

1.ArrayList集合的底层原理

ArrayList集合是基于数组实现的。

特点:查询速度快(注意:是根据索引查询数据快):查询数据通过地址值和索引定位,查询任意数据耗时相同;删除效率低:可能需要把后面很多的数据进行前移;添加效率极低:可能需要把后面很多的数据后移,再添加元素;或者也可能需要进行数组的扩容。

实现:利用无参构造器创建的集合,会在底层创建一个默认长度为0的数组添加第一个元素时,底层会创建一个新的长度为10的数组存满时,会扩容1.5倍如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

应用场景:希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据。

2.LinkedList集合的底层原理

Linkedlist集合是基于双链表实现的。

特点:查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的。

应用场景:希望记住元素的添加顺序,且增删首尾数据的情况较多。

应用实例:用来设计队列,栈。

3.HashSet集合的底层原理

HashSet集合是基于哈希表实现。 哈希表是一种增删改查数据,性能都较好的数据结构。

哈希表:JDK8之前,哈希表 = 数组+链表;JDK8开始,哈希表 = 数组+链表+红黑树。

实现:创建一个默认长度16的数组,默认加载因子为0.75,数组名table使用元素的哈希值对数组的长度求余计算出应存入的位置判断当前位置是否为null,如果是null直接存入如果不为null,表示有元素,则调用equals方法比较——相等,则不存。不相等,则存入数组。(JDK 8之前,新元素存入数组,占老元素位置,老元素挂下面;JDK 8开始之后,新元素直接挂在老元素下面)

当数组快占满时链表会过长,导致查询性能降低,此时要扩容。当数组存满到16*0.75=12时,就自动扩容,每次扩容原先的两倍。JDK8开始,当链表长度超过8,且数组长度>=64时,自动将链表转成红黑树

如果希望Set集合认为2个内容相同的对象是重复的,要重写对象的hashCodeequals方法。

应用场景:不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快。

4.LinkedHashSet集合的底层原理

LinkedHashSet依然是基于哈希表(数组、链表、红黑树)实现的。 但是,它的每个元素都额外的多了一个双链表的机制记录它前后元素的位置。

应用场景:希望记住元素的添加顺序,也没有重复元素需要存储,且希望增删改查都快。

5.TreeSet集合的底层原理

特点:不重复、无索引、可排序(默认升序排序 ,按照元素的大小,由小到大排序) 底层是基于红黑树实现的排序。

注意:对于数值类型:Integer , Double,默认按照数值本身的大小进行升序排序。 对于字符串类型:默认按照首字符的编号升序排序。 对于自定义类型如Father对象,TreeSet默认是无法直接排序的。

自定义排序规则:TreeSet集合存储自定义类型的对象时,必须指定排序规则,支持如下两种方式来指定比较规则。 方式一——让自定义的类(如爸爸类)实现Comparable接口,重写里面的compareTo方法来指定比较规则 方式二——通过调用TreeSet集合有参数构造器,可以设置Comparator对象(比较器对象,用于指定比较规则)。

应用场景:如果要对元素进行排序,也没有重复元素需要存储,且希望增删改查都快。

小结:

1、如果希望记住元素的添加顺序,需要存储重复的元素,又要频繁的根据索引查询数据? 用ArrayList集合(有序、可重复、有索引),底层基于数组的。(常用)

2、如果希望记住元素的添加顺序,且增删首尾数据的情况较多? 用LinkedList集合(有序、可重复、有索引),底层基于双链表实现的。

3.  如果不在意元素顺序,也没有重复元素需要存储,只希望增删改查都快? 用HashSet集合(无序,不重复,无索引),底层基于哈希表实现的。 (常用)

4.如果希望记住元素的添加顺序,也没有重复元素需要存储,且希望增删改查都快? 用LinkedHashSet集合(有序,不重复,无索引), 底层基于哈希表和双链表。

5.  如果要对元素进行排序,也没有重复元素需要存储?且希望增删改查都快? 用TreeSet集合,基于红黑树实现。

二、Map

下面用一张图理清Map集合体系:

相信大家已经看出来了,Map集合体系实现类的底层原理和Set里面的是类似的,这里就不一一赘述了。

好了,今天就聊到这里了,如果永远太久的话,我们明天见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值