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中的方法基本一致

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601111.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【I2C总线驱动】

一、I2C总线背景知识 SOC芯片平台的外设分为&#xff1a; 一级外设&#xff1a;外设控制器集成在SOC芯片内部二级外设&#xff1a;外设控制器由另一块芯片负责&#xff0c;通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit&#xff1a; 字面意思是用于“集成电路之间…

Linux系统安装Docker

1、安装环境 此处在Centos7进行安装&#xff0c;可以使用以下命令查看CentOS版本 lsb_release -a 在 CentOS 7安装docker要求系统为64位、系统内核版本为 3.10 以上&#xff0c;可以使用以下命令查看 uname -r 2、用yum源安装 2.1 查看是否已安装docker列表 yum list instal…

【Angular】什么是Angular中的APP_BASE_HREF

1 概述: 在这篇文章中&#xff0c;我们将看到Angular 10中的APP_BASE_HREF是什么以及如何使用它。 APP_BASE_HREF为当前页面的基础href返回一个预定义的DI标记。 APP_BASE_HREF是应该被保留的URL前缀。 2 语法: provide: APP_BASE_HREF, useValue: /gfgapp3 步骤: 在app.m…

leetcode代码记录(最长连续递增序列

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定…

2024/4/2—力扣—连续数列

代码实现&#xff1a; 思路&#xff1a;最大子数组和 解法一&#xff1a;动态规划 #define max(a, b) ((a) > (b) ? (a) : (b))int maxSubArray(int* nums, int numsSize) {if (numsSize 0) { // 特殊情况return 0;}int dp[numsSize];dp[0] nums[0];int result dp[0];fo…

【二分查找】Leetcode 寻找峰值

题目解析 162. 寻找峰值 题目中有一个很重要的提示&#xff1a;对所有有效的i都存在nums[i] ! nums[i1],因此这道题不需要考虑nums[mid] 和 nums[mid1]之间的相等与否的关系 算法讲解 1. 暴力枚举 我们按照顺序判断每个数字是否是当前的峰值&#xff0c;如果是直接返回&#…

网络基础——vrrp

前言&#xff1a;除了一个MPLS这个协议&#xff0c;其他的协议都差不多会在后面介绍&#xff0c;但是MPLS却不会介绍&#xff0c;因为自己本人学的不是很好&#xff0c;而且在企业网中&#xff0c;接触的机会也更少&#xff0c;除非是做ISP网络的&#xff0c;下面会先介绍VRRP和…

【4月最新】低至50/年,4G 618/3年 云服务器价格即将回调 ,搭建网站 博客 Linux练习 比虚拟机方便 附阿里云 京东云 腾讯云对比表

更新日期&#xff1a;4月8日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更…

金蝶BI方案的报表,主打做得快、易理解

金蝶做数据分析报表慢、步骤多、数据不够直观&#xff1f;但奥威-金蝶BI方案的报表就不一样了&#xff0c;不仅做得快&#xff0c;还十分好理解&#xff0c;因为它做出来的是随时可以按需自助的BI智能数据可视化分析报表。 有多快&#xff1f; 注册奥威BI SaaS平台&#xff0…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

谷歌seo最新优化方案是怎样的?

自从AI的出现&#xff0c;人们惊叹于AI的便利性&#xff0c;乃至网站内容都在使用AI更新&#xff0c;然而就在这个月&#xff0c;谷歌公布了最新的算法&#xff0c;这次更新真的是给了SEO界一个大震撼&#xff0c;尤其是对于那些依赖AI内容生成的网站来说&#xff0c;谷歌这次是…

Docker 集成 redis,并在nacos进行配置时需要注意点

安装redis镜像 docker pull redis:6.0.6redis配置文件 创建相关配置文件 mkdir /apps/redis cd /apps/redis touch redis.conf vim redis.confredis.conf内容&#xff1a; #开启保护 protected-mode yes #开启远程连接 bind 0.0.0.0 #自定义密码 port 6379 timeout 0 # 900s内…