Java集合进阶——单列集合

一.集合结构框架

1.单列集合Collection

单列集合是一次存储一个数据的集合

⑴结构框架

01418382a99a4f8686b2c76f9d9e0286.png

 List系列集合:添加的元素是有序,可重复,有索引

Set系列集合:添加的元素无序,不重复,无索引

2.双列集合Map

双列集合是一次存储一对数据的集合

二. Collection

1.概念

Collection是单列集合的顶层父接口,它的功能是全部单列集合都可以继承使用

2.常见方法

94686eb33d9c49fdb6f10e48ec38a89d.png

⑴方法细节

Ⅰ.boolean add(E e)

细节①:如果向List系列集合添加元素,方法永远返回true,因为可重复

细节②:如果向Set系列集合添加元素,如果当前添加元素不存在,会返回false,表示添加失败,因为不可重复

Ⅱ. remove

因为Collection里面定义的是共性的方法,所以不能通过索引删除,只能通过元素对象删除

Ⅲ. comtains

方法底层是通过equals方法判断对象是否一致的

如果集合存储的是自定义对象,想要通过contains方法查询元素是否存在,就要在JavaBean类中重写equals方法

3. Collection的三种遍历方式(集合通用)

⑴迭代器遍历

迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式

特性:不依赖索引

Iterator中的常用方法

boolean hasNext()   判断当前位置是否有元素

E next()  获取当前位置元素,并将迭代器对象移向下一个位置

Collection集合获取迭代器

Iterator< E> Iterator()   返回迭代器对象

6ee54da5dd8245ca827c8137adf08e10.png

迭代器细节:

①一个迭代器对象只能遍历一次

②遍历时不能用集合的方法进行添加或删除

用集合方式添加或删除元素可能会导致指针异常从而程序报错

如果想要删除元素,可以使用Iterator类中的remove方法(没有add添加方法)

d28a4443acbd45099c6b5473578fef0b.png

⑵增强for遍历

增强for是JDK5之后出现的,其底层就是迭代器

所有的单列集合和数组才能用增强for遍历

格式:

for(数据类型 变量名:数组或集合){}

2dcf5ef442554457b4b1086097461e06.png

⑶Lambda表达式遍历

void forEach( Consumer<? super E> action)

根据ArrayList类中的forEach方法,可以看到方法的底层是普通for遍历

701a10a9ec8e4a9ba4682cccb9e436aa.png

要利用forEach遍历,我们就要实现Consumer接口并重写accept方法

54e6f466ca65479aa59974b6a9905414.png

三. List

1.概念

List类是一个接口,其父接口是Collection,因此Collection中的方法List都继承了

List系列集合有序,可重复,有索引

因为List有所以,所以多了很多操作索引的方法

2.特有方法

864182f048f6494f8793c23b4bffd1c9.png

3. List的5种遍历方式

① 迭代器遍历

②增强for遍历

③Lambda表达式遍历

④普通for

⑤列表迭代器ListIterator

ListIterator是Iterator的子接口

aa2996879abd44b4b9874bfe538f6aa6.png

其中比Iterator多了一个add添加元素的方法,因此在ListIterator迭代器遍历时,我们可以使用迭代器的添加和删除方法

c910e879457e4785951522dc3e931bc3.png

其代码与Iterator迭代器的遍历逻辑基本一致 

b9abcb25e16c44afa53799ea0069343c.png

四. ArrayList

ArrayList集合底层是数组实现的

1.底层细节

①ArrayList可以自定义集合长度

每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。

若自定义长度为0或空参,则会默认创建一个长度为0的数组,当添加元素时再换为长度为10的数组

11dd08551e16409ab050614b7ed42667.png

2.方法摘要

e3e37608e80d474cb070b57c7907e832.png

⑶底层原理实现

https://blog.csdn.net/m0_74808313/article/details/130376172

五. LinkedList

1.概念

LinkedList是List接口的链表实现类

此类实现Deque接口,为add, poll提供先进先出队列操作,以及其他堆栈和双端队列操作

LinkedList集合底层数据结构是双链表,所有的操作都是按照双重链表的需要执行的

2.特有方法

LinkedList底层数据结构是双链表,查询慢,但是首位操作的速度是极快的

6faab971943c43c9b470e5cf2c0d6a44.png

3.底层原理实现

①单向链表

https://blog.csdn.net/m0_74808313/article/details/130295707

②双向链表

https://blog.csdn.net/m0_74808313/article/details/130320890

六. Set

1.概念

Set类是一个接口,其父接口是Collection,因此Collection中的方法Set都继承了,其中的方法与Collection基本一致

4058504642ee4c9d876b87c3ffd62c5c.png 

⑴Set集合的重要实现类

HashSet:无序,不重复,无索引

LinkedHashSet:有序,不重复,无索引

TreeSet:可排序,不重复,无索引

2.方法摘要

affaad0b2e324600ac9d673e3d52f027.png 

3.Set的三种遍历方式

①迭代器

②增强for

③Lambda表达式

七.HashSet

1.概念

HashSet实现Set接口,由哈希表(HashMap)支持

也就是其底层采取哈希表存储数据

HashSet特点:无序,不重复,无索引

2.方法摘要

f7bf988d92914e59afce574403dc2bd9.png

3.底层原理

数组+链表+红黑树

⑴引用构造方法时,方法底层会创建一个默认长度为16,加载因子为0.75的数组

⑵添加元素时,方法会根据元素的哈希值跟数组的长度计算出应存入的位置

⑶判断当前位置是否有元素

如果没有元素则直接存入;如果有元素则会通过equals方法比较元素属性值是否一样,一样的话表示元素重复,不存;不一样的话存入数组,形成链表

cb8401448cba4220ba568fd2be0a3fbf.png

细节:当链表长度超过8且数组长度大于等于64时,链表会自动转换为红黑树,从而提高查找效率

八. LinkedHashSet

1.概念

LinkedHashSet具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代

其底层数据结构依然是哈希表,只是每个元素多了个双链表记录存储的顺序

2.方法摘要

LinkedHashSet是HashSet的子类,其完全继承了父类中的方法

27c17486e125437683235fa9db492d92.png 

04ac3462cc3148949c1d0ce41307a629.png

3.底层原理

其底层数据结构依然是哈希表,其原理实现与HashSet一致,只是每个元素多了个双链表记录存储的顺序

7a0ced50b6e54cb2994e2e8e820e4a85.png

九. TreeSet

1.概述

基于 TreeMap 的 NavigableSet 实现。使用元素的自然/默认顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法

TreeSet集合的底层结构是基于红黑树的数据结构实现排序的,增删改查性能都很好

TreeSet特点:可排序,无索引,不重复

2.TreeSet默认排序规则

①对于数值类型

默认按照从小到大的顺序进行排序

②对于字符,字符串类型

按照字符在ASCll表中的数字升序进行排序

7378bbb6bf5d480099b328850327d870.png

③对于自定义对象类型

方式一:Javabean类实现Comparable接口指定比较规则

如图:我在自定义的Student类中实现了Comparable接口并指定比较规则

ea81a0dd58434a53841214d9bb36e96f.png 991e1a6a675f4502847185268d102bc2.png

方式二:比较器排序

创建TreeSet对象时传递比较器Comparator指定规则

如图:在创建TreeSet对象时实现Comparator接口并重写compare方法指定比较规则

fd461ed0c2ed48fca750a50849ed97ac.png

3.方法摘要

TreeSet实现Set接口,其方法与Set中的方法基本一致

 

 

  • 19
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤姆大聪明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值