Java集合大家族(学习推荐版,通俗易懂)

2023-12-22 02:52

本文主要是介绍Java集合大家族(学习推荐版,通俗易懂),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4.集合(ArrayList)、其他集合框架及容器遍历方式

image-20231202163246119

1.ArrayList

注意:索引从0开始

该集合可以添加任意类型的数据,要约束添加数据的类型,需用泛型约束(jdk1.7开始支持泛型)

image-20231202163728487

删除+遍历集合方式1(i--)

image-20231202164642388

image-20231202164742612

这里还可以写list.remove(i)根据索引来删和根据内容来删效果都是一样的

注意:remove删除当前元素后,当前元素后面的所有元素会整体前移,所以上面代码这里要i--;

删除+遍历集合方式2(从最后索引开始倒着删)

image-20231202165305773

2.集合框架(Collection、Map)

image-20231206083218678

1.Collection接口集合(List、Set接口集合)

image-20231206083607485

*Collection常用方法及遍历(子类为List、Set)

Collection这个父类是有序、可重复、无索引的特点。

image-20231206084517320

这些方法子类及子孙类都可以使用,所以要学。

示例代码:

image-20231206083915101

image-20231206084042667

image-20231206084253625

image-20231206084435059

2.Collection的遍历方式
1.迭代器遍历(用于遍历无索引的容器)

image-20231206084816309

想象成迭代器从第一个元素的前面开始就好了,那么next方法就可以理解为后移一个,并返回该元素值

image-20231206085028888

2.增强for循环(本质迭代器遍历的简化写法)

image-20231206085336822

3.forEach(可用Lambda表达式简化代码,底层代码增强for)

image-20231206090238933

示例代码:

image-20231206085632086

image-20231206085930290

用Lambda表达式简化形式如下:

image-20231206090202998

3.List集合(ArrayList,LinkedList)

image-20231206091154540

image-20231206090620879

注意:List集合remove方法删除某元素后,某元素后的所有元素会前移。在遍历删除容器元素时,用该方法会有并发修改异常,所以只能用迭代器的.remove()方法进行遍历删除容器元素


image-20231206110325811

ConcurrentModificationException:并发修改异常。

1.迭代器Iterator遍历删除元素时删不干净的解决方法:用迭代器自己的remove()方法

image-20231206105953951

迭代器Iterator自己的remove方法,删除元素时,会回退到删除元素的位置。

2.增强for和forEach不能解决边遍历边删除容器元素的问题,所以要删除元素并遍历集合只能用迭代器Iterator

image-20231206110204843

image-20231206110253480

List子类可用直接该方法

image-20231206091003848

1.ArrayList(底层代码基于数组)

image-20231206091359252

image-20231206091513901

image-20231206091545473

示例代码:

image-20231206091646274

2.LinedList(基于双链表)

image-20231206092056590

image-20231206091917613

image-20231206092145768

还可以用来设计栈。

示例代码:

1.队列

image-20231206092300493

2.栈

image-20231206092425529

进栈/压栈用addFirst(参数)方法,出栈用removeFirst()方法。当然直接用pop()和push(参数)方法更直观,而且方法里面无需填参数,见下图代码

pop()和push()方法

image-20231206092859045

其本质还是调用addFirst()和removeFirst()方法,只不过被push()和pop()方法包装了而已,包装目的是为了符合压榨和出栈的方法名字的书写

4.Set集合(HashSet,LinkedHashSet,TreeSet)

image-20231206093648453

image-20231206095305309

有序无序是指添加数据时和输出数据时的顺序是否一样。

示例代码:

1.HashSet(无序及不重复,无索引)

image-20231206093738799

无序是指添加数据时和输出数据时的顺序不一样。输出结果会随机。

2.LinkedHashSet(有序及不重复,无索引)

image-20231206094959330

有序是指添加数据时和输出数据时的顺序一样。

3.TreeSet(可排序及不重复,无索引)

image-20231206094757280

可排序可以是升序,降序。

1.HashSet

基于哈希表(数组、链表和红黑树)

image-20231206100036067

哈希表(数组+链表)是一种增删改查性能都比较好的结构。

这里加载因子0.75是指当数组个数站该数组长度的0.75时,会对该数组进行扩容。

image-20231206100347454

注意:JDK8之前的数组元素的链表如果很长时,会影响查询速度。所以在在JDK8开始之后,当满足条件时(链表长度超过8,且数组长度大于等于64时)自动将链表转成红黑树。见下图

image-20231206101737100

image-20231206101916028

image-20231206101956017

HashSet底层原理总结:

无序底层实现就是得到该对象的哈希值然后求余某个数,所以得到的位置会不一样。

不重复底层实现就是求余某个数后,然后逐个比较该位置的链表元素,有重复的话就不添加了。

无索引底层实现就是java任务如果用数组索引去得到元素值的话,可能得不到自己想要的元素,所以索性就不提供索引访问数组了。


对象去重复性(重写hashCode和equals方法)

image-20231206102639186

image-20231206102742630

示例代码:

image-20231206102339166

从运行结果可以看到,姓名为蜘蛛精,年龄等于23,身高为169.6的两个对象被认为成一个对象,添加时只会添加一个。


了解哈希值概念

image-20231206095755985

image-20231206095843222

image-20231206095942760

2.LinkedHashSet

底层代码基于哈希表(数组、链表和红黑树)及双链表

image-20231206103416854

通过两个变量记住首尾元素的数组索引,这样遍历时会通过首元素的数组索引找到第一个元素,接着通过双链表访问下一个元素。

3.TreeSet

image-20231206104206559

image-20231206104153497

示例代码:

image-20231206104224498

image-20231206104546986

image-20231206104455125

2.Map接口集合(HashMap、LinkedHashMap和TreeMap实现类)

image-20231206114047222

image-20231206114353698

image-20231206114635236

Map集合常用方法(扩展方法putAll()可以将另一个map集合添加到本map去)

image-20231206120534940

示例代码:

image-20231206115730645

image-20231206115816532

不存在该键时,get方法会返回null

image-20231206115857403

image-20231206120020663

image-20231206120041504

image-20231206120149901

注意:values()方法获取map值的集合,其返回值为Collection,原因是值可以重复,而键不可以重复,所以keySet()方法会返回Set集合。


扩展方法:

image-20231206120447601

putall()方法可以将另一个map集合的全部数据添加到该map集合中去,若有重复的键会进行覆盖


Map集合的遍历方式

image-20231206120909762

1.键找值遍历

image-20231206120932288

示例代码

image-20231206121011454

2.键值对遍历(entrySet(),getKey(),getValue())

image-20231206121614544

示例代码

image-20231206121856250

3.forEach遍历(简洁,配合Lambda)

image-20231206123201302

示例代码:

image-20231206122024464

forEach源代码

image-20231206123038546

1.HashMap

image-20231206123429873

用的方法就一般就是父类Map的方法

只不过Set集合只要键,没要值而已

image-20231206123608047

用键的哈希值来求余,而不是用值,因为键是唯一的

image-20231206124210778

image-20231206124333975

示例代码:

重写equals和hashCode方法来判断对象是否相同,以保证map的键不重复

image-20231206124434098

2.LinkedHashMap

image-20231206124551037

image-20231206125049123

LinkedHashSet底层原理就是LinkedHashMap,只不过链表中只存储键,不存储值罢了。

image-20231206124645214

3.TreeMap

TreeSet底层原理就是TreeMap,只不过链表中只存储键,不存储值罢了。

image-20231206125445363

未让对象指定排序会报错:ClassCastException

image-20231206125602243

让对象自定义排序规则的方式1

image-20231206125531640

让对象自定义排序规则的方式2:TreeMap构造器内部new Comarpator指定排序规则

image-20231206125728151

3.集合的嵌套

集合中包括集合

image-20231206130406784

image-20231206130511791

遍历嵌套的集合

image-20231206130656129

这篇关于Java集合大家族(学习推荐版,通俗易懂)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/522358

相关文章

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与