24、Java 集合

十一章:Java 集合


一、集合框架的概述

1、集合:就像一个容器,可以动态的把多个对象的引用放入容器中。简称 Java 容器

​ 说明:此时的存储,主要指的是内存层面的存储,不涉及到持续化的存储(.txt, .jpg, avi,数据库中)

2、数组在存储多个数据方面的特点:

​ >一旦初始化之后,长度就确定了

​ >一旦定义好,其元素的类型就确定了。我们只能操作指定类型的数据。比如: String[] arr; int[] arr1;

​ 数组在存储多个数据方面的缺点:

​ >一旦初始化,其长度就不可修改

​ >数组中提供的方法非常有限,对于添加、删除、插入数据等操作非常不便,效率也不高

​ >获取数据中实际元素个数的需求,数据没有线程的属性或方法可用

​ >数组存储数据的特点:有序、可重复。对于无序的、不可重复的需求,无法满足


二、集合框架:Collection 与 Map

CleanShot 2025-03-01 at 13.17.27

List ---->“动态”数组

Set----->高中讲的“集合”

Map---->高中函数: y=f(x) 可以 key 多对一 value 不可以 key 一对多 value


三、Collection 接口中的 方法的使用

CleanShot 2025-03-01 at 13.35.36

CleanShot 2025-03-01 at 13.35.57

像 Collection 接口的实现类中的对象中添加数据 obj 时,要求 obj 所在类要重写 equals

package com.java.kcw1;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/**集合元素的遍历操作,使用 Iterator* @author Jackson_kcw* @Time 2025-03-01  PM1:52*/
public class InteratorTest {@Testpublic void test1() {Collection coll1=new ArrayList();coll1.add("a");coll1.add("b");coll1.add("c");coll1.add(false);Iterator iterator = coll1.iterator();
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());//遍历操作while(iterator.hasNext()) {//next(): 指针下移;将下移以后集合位置上的元素返回System.out.println(iterator.next());}}
}

集合对象每次调用 iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前

内部定义了 remove(),可以在遍历的时候,删除集合中的元素。此方法不同于直接嗲用 remove

For-each

package com.java.kcw1;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;/**JDK5.0新增 foreach 循环,用于* @author Jackson_kcw* @Time 2025-03-01  PM2:19*/
public class ForTest {@Testpublic void test() {Collection coll=new ArrayList();coll.add("AA");coll.add("BB");coll.add(11); //自动装箱System.out.println(coll.size());//for( 集合元素的类型 局部变量:集合对象)for(Object obj:coll){System.out.println(obj);}}
}

List 接口概述:List 集合了类元素有序、可重复

面试题目:ArrayList\LinkedList\Vector 三者的异同

同:三个类都实现了 List 接口,存储数据的特点相同:元素有序、可重复

异:

ArrayList::作为 List 接口的主要实现类,线程不安全,效率高

LinkedList:对于频繁的插入和删除操作,使用效率比 ArrayList 高,底层使用双向链表存储

Vector:作为 List 接口的古老实现类;线程安全,效率低

List 接口中的常用方法

CleanShot 2025-03-01 at 14.42.47

总结常用方法:

增:add(Object obj)

删:remove(int index) / remove(Object obj)

改:set(int index,Object ele)

查:get(int index)

插:add(int index,Object ele)

长度:size()

遍历:一、Iterator 迭代器方式 二、for each 三、普通的循环


Set接口:存储无序的、不可重复的数据 —>高中讲的集合

​ HashSet: 作为 Set 接口的主要实现类;线程不安全;可以存储 null 值

​ LinkedHashSet:作为 HashSet 子类;遍历其内部数据时,可以按照添加的顺序遍历

​ TreeSet:可以按照添加对象的指定属性,进行排序

Set 接口没有额外一些方法,使用的都是 Collection 里面声明的方法

Set

以 HashSet 为例:

1、无序性:不等于随机性。存储的数据在底层数组中并非按照数据所以你的顺序添加,而是根据数据的 hash 值来确定的

2、不可重复性:保证添加的元素按照 equals()方法判断时,不能返回 true.即相同的元素只能添加一个

二、添加元素的过程:以 HashSet 为例:

​ 我们向 HashSet 添加元素 a,首先调用元素a 所在类的 hashCode()方法,计算 a 的哈希值,此哈希值接着通过某种算法计算出在 HashSet 底层数组中的存放完位置(即为:索引位置),判断数组在此位置是否已经有元素:

​ 如果此位置上没有其他元素,则元素 a 添加成功

​ 如果此位置有元素 b,则比较元素 a 与元素 b 的 哈希值:

​ 如果 hash 值不同,则元素 a 添加成功

​ 如果 hash 值相同,贼需要调用元素 a 所在类的 equals()方法:equals()返回 true,元素 a 添加失败

​ equals()返回 false,则元素 a 添加成功


向 TreeSet 里面添加的数据,要求是相同类的对象,不能添加不同类的对象



五、Map 接口


5-1、|—Map:双列数据,存储 key-value 的值 ---------类似高中的函数 :y=f(x)

​ |—HashMap:作为 Map 的主要实现类;线程不安全,效率高;可以存储 null 的 key 和 value

​ |----LinkedHashMap:保证在遍历 map 元素时,可以按照添加的顺序实现遍历

​ |—TreeMap:保证按照添加的 key-value 对 进行排序,实现排序遍历。此时考虑 key 的自然排序或定制排序

​ | —Hashtable:作为古老的实现类;线程安全,效率低;不可存储 null 的 key 和 value

​ |—Properties:常用来处理配置文件。key 和 value 都是 String 类型

HashMap 的底层: 数组+链表(jdk7 及之前)

​ 数组+链表+红黑树(jdk8)


5-2 Map 结构的理解

CleanShot 2025-03-01 at 16.32.48


5-3 HashMap 的底层实现原理

以 jdk7 为例说明:

HashMap map= new HashMap();

在实例化以后,底层创建了长度为 16 的一维数组 Entry[] table

…可能已经执行过多次 put…

map.put(key1,value1):

首先,调用 key1 所在类的 hashCode()计算 key1 哈希值,此哈希值经过某种算法计算以后,得到在 Entry 数组中的存放位置

如果此位置上的数据为空,此时的 key1-value1 添加成功

如果此位置的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较 key1 和已经存在的一个或多个数据的哈希值:

​ 如果 key1 的哈希值与已经存在的数据的哈希值都不相同,此时的 key1-value1 添加成功

​ 如果 key1 的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用 key1 所在类的 equals()方法,比较:

​ 如果 equals()返回 false:此时的 key1-value1 添加成功

​ 如果 equals()返回 true: 使用 value1 替换value2

JDK8 相较于 7 在底层实现方面的不同:

1、new HashMap():底层没有创建一个长度为 16 的数组

2、jdk8 底层的数组是:Node[],而非 Entry[]

3、首次调用 put 方法时,底层创建长度为 16 的数组

4、jdk7 底层结构只有数组加链表 jdk8 底层结构:数据+链表+红黑树

​ 当数组的某一个索引位置上的元素以链表形式存在的数据个数>8 且当前数组的长度>64,此时索引位置上的所有数据改为使用红黑树存储


CleanShot 2025-03-02 at 13.46.24

 这里面跳过了 hashMap 底层实现原理,这一部分讲的比较复杂和抽象,本人因为时间原因跳过了,但是建议再找文档或视频看看


5-4 Map接口中常用的方法

CleanShot 2025-03-02 at 14.04.37

CleanShot 2025-03-02 at 14.07.58


工具类 Collections:操作 Collection、Map 的工具类

CleanShot 2025-03-02 at 14.18.22


面试题:Collections 与 Collection 的区别

对比项CollectionCollections
定义Collection 是 java 的接口Collections 是 Java 提供的工具类
作用定义了 Java 集合的基本操作,如 List、Set等的父接口提供集合操作的工具方法,如排序、搜索、线程安全包装等
子类/实现方式List\Set\Queue 等结合框架的接口不能被继承,只能直接调用其静态方法
常见方法add()、remove()、size()等sort()、shuffle()、synchronizedList()等


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

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

相关文章

1114棋盘问题acwing(深度优先搜索)

题目描述 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。 要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放…

logback日志输出配置范例

logback日志输出配置范例 在wutool中,提供了logback日志输出配置范例,实现日志文件大小限制、滚动覆盖策略、定时清理等功能。 关于wutool wutool是一个java代码片段收集库,针对特定场景提供轻量解决方案,只要按需选择代码片段…

测试人员如何驱动开发?

软件开发中测试人员的作用正在从传统的缺陷发现者演变为开发过程的主动推动者。特别是在敏捷和 DevSecOps 环境中,测试人员如何通过参与需求、提供反馈和推动自动化来驱动开发,成为一个值得探讨的话题。本文将详细分析测试人员驱动开发的具体方式&#x…

大模型语料库的构建过程 包括知识图谱构建 垂直知识图谱构建 输入到sql构建 输入到cypher构建 通过智能体管理数据生产组件

以下是大模型语料库的构建过程: 一、文档切分语料库构建 数据来源确定: 首先,需要确定语料库的数据来源。这些来源可以是多种多样的,包括但不限于: 网络资源:利用网络爬虫技术从各种网站(如新闻…

oracle游标为什么没有共享,统计一下原因

-- Script Code为什么没共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防战——深入浅出Map/Set的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连,小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习Map/Set的底层实现 目录 问题一:hash会出现负数?数组越界 一:什么是二叉搜索树&#xff1f…

win10使用haneWIN NFS Server挂载NFS v2服务,u-boot通过NFS下载zImage

1. haneWIN NFS Server挂载NFS v2服务 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系统与目录结构

Linux系统中一切皆文件 bin 是Binary 的缩写, 这个目录存放着最经常使用的命令 boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件,自 己的安装别放这里。 cdrom 这个目录通常专门用来挂载光盘。当系统刚安装时&#x…

一文详解基于NarrotoAI的短剧短视频自动解说、混剪AI平台搭建

背景 前阵给孩子做电子相册学了点剪辑技术,就想凑个热闹剪剪短剧玩玩,一是学以 致用,再者也好奇短剧创作为啥这么火,跟个风。 初步了解情况后,发现我的剪辑技术已经落后了,行家们玩的主要是解说 &#xf…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

《Canvas修仙传·第三重天金丹境(下集)》 ——量子烟花与物理宇宙的混沌法则

各位道友久候!上集我们炼就了《灵蛇奇谭》的元神,今日将开启Canvas修仙路上最绚丽的篇章——掌控微观粒子的创世之力!(ノ≧∀≦)ノ 章前黑话词典 🔍 量子境术语表: 对象池(Object Po…

c++ namespace名字域空间

在C中,namespace 是一个非常重要的概念,用于组织代码,避免名称冲突。namespace(命名空间)是一个逻辑上的代码组织单元,用于将代码(类、函数、变量等)分组,从而避免命名冲…

获取阿里云OSS预签名URL下载(java)

1,引入依赖 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--AliSms--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-s…

中间件专栏之Redis篇——Redis的基本IO网络模型

Redis主要采用的是单线程的事件驱动模型&#xff0c;通过I/O多路复用来实现高效的并发请求处理。 一、单线程模型 Redis 采用 单线程模型 来处理所有请求&#xff0c;包括网络 I/O 和命令执行。虽然现代多核 CPU 能够并行处理任务&#xff0c;但 Redis 的设计原则是尽量避免多…

Python 线程同步

Python 线程同步 Python 线程同步 Python 线程同步 线程同步是一种确保两个或多个线程不同时执行同一块共享代码的机制。共享块中的代码通常是访问共享数据或资源&#xff0c;这种共享块被称作临界区。这个概念可以用下面的图清晰地表示出来&#xff1a; #mermaid-svg-2TivIuc…

Linux操作系统5-进程信号3(信号的捕捉流程,信号集,sigaction)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的保存, 用户态与内核态&#xff0c;内核空间&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;​​​​​​​myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点…

【机器学习chp10】降维——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目录 一、降维的意义与本质 1、意义 2、本质 3、常见降维方法 &#xff08;1&#xff09;线性降维 &#xff08;2&#xff09;非线性降维 二、基于重构的降维 1、PCA 2、核化PCA &#xff08;1&#xff09;实现过程 步骤一&#xff1a;数据映射与核函数定义 步骤二…

代码的解读——自用

代码来自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能总结 该脚本用于执行一个 弱监督语义分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三个阶段&#xff1a; Stage1&#xff1a;训…

Powershell和BTEQ工具实现带多组参数和标签的Teradata数据库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的Powershell代码程序和BTEQ工具&#xff0c;实现根据不同的输入参数&#xff0c;自动批量地将Teradata数据库的数据导出为CSV文件到指定目录上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数…

CF 118A.String Task(Java实现)

题目分析 输入一个字符串&#xff0c;遍历每一个字符&#xff0c;如果是元音字母就删除&#xff0c;辅音字母就在其前面增加一个.&#xff0c;且所有字母输出都是小写。 思路分析 将输入的字符串改为字符数组&#xff0c;考虑到任意位置插入的情况&#xff0c;所以主要选择Lin…