Java-集合框架
文章目录
- 摘要
- Collection
- Collection集合遍历
- Iterator迭代器
- 增强for循环
- 排序
- List
- ArrayList
- LinkedList
- Vector
- Set
- HashSet
- Map
- 小结
摘要
Java的集合框架提供了一组用于存储、管理和操作数据的类和接口。这个框架提供了各种数据结构,如列表、集合、队列和映射,以满足不同的数据处理需求。
根据实现接口可以分为:Collection、Map两大类
Collection
Collection集合遍历
Collection所有的实现子类集合都可以通过以下两种方式进行元素遍历:
Iterator
迭代器- 增强
for
循环
详细的介绍如下:
Iterator迭代器
- Iterator称为迭代器,主要用于遍历Collection集合中的元素;
- 所有实现了Collection接口的集合子类都有一个Iterator()方法,返回Iterator对象,即迭代器;
执行原理:
Code:
Iterator iterator=[Collection].iterator(); //创建一个迭代器
while(iterator.hasNext()){ //循环,直到集合中没有元素为止System.out.println(iterator.next()); //获取下一个元素并打印出来
}
iterator()
:方法用于获取集合的迭代器对象,这个迭代器对象用于遍历集合中的元素。iterator.hasNext()
:它会不断检查迭代器是否有下一个元素。如果有下一个元素,则循环会继续执行。iterator.next()
:返回下一个元素,并将迭代器的位置移动到下一个元素。- 遍历完成后,next指针指向最后一个位置。
如果想要充值next指针,可以执行一下代码:
iterator=[Collection].iterator();
此时next
指针就会指向第一位。
增强for循环
- 增强for循环底层任然是Iterator迭代器;
- 可以理解为简化版的Iterator。
Code:
List list=new ArrayList();
。。。
//增强for循环
for(Object str:list){System.out.println(str);
}
排序
Comparable
接口和 Comparator
接口都是 Java 中用于排序的接口,它们在实现类对象之间比较大小、排序等方面发挥了重要作用:
- Comparable接口有一个
CompareTo(Object obj)
方法用来排序;- 用于比较当前对象和传入对象的顺序
- -1表示当前对象小于,0表示等于,1表示大于。
public class Person implements Comparable<Person> {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}/*** T重写compareTo方法实现按年龄来排序*/@Overridepublic int compareTo(Person o) {if (this.age > o.getAge()) {return 1;}if (this.age < o.getAge()) {return -1;}return 0;}
}public static void main(String[] args) {TreeMap<Person, String> pdata = new TreeMap<Person, String>();pdata.put(new Person("张三", 30), "zhangsan");pdata.put(new Person("李四", 20), "lisi");pdata.put(new Person("王五", 10), "wangwu");pdata.put(new Person("小红", 5), "xiaohong");// 得到key的值的同时得到key所对应的值Set<Person> keys = pdata.keySet();for (Person key : keys) {System.out.println(key.getAge() + "-" + key.getName());}}
输出:
5-小红
10-王五
20-李四
30-张三
-
Comparator接口有一个**
Compare(Object obj1,Object obj2)
**方法用来排序;- 用于比较两个对象;
- -1表示当前对象小于,0表示等于,1表示大于。
ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(-1); arrayList.add(3); arrayList.add(3); arrayList.add(-5); arrayList.add(7); arrayList.add(4); arrayList.add(-9); arrayList.add(-7); // 定制排序的用法 Collections.sort(arrayList, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);} }); System.out.println("定制排序后:"); System.out.println(arrayList);
List
特点:
- List集合类中元素是有序的(按插入顺序排序),且可以重复的(null也可以);
- 每个元素多有对应的索引
子类 | 描述 | 效率 |
---|---|---|
ArrayList | 基于动态数组的有序集合。 | 高 |
LinkedList | 基于双向链表的有序集合。 | 高 |
Vector | 与 ArrayList 类似,但是线程安全。 | 低 |
常见方法:
方法 | 说明 |
---|---|
add(E element) | 向列表末尾添加一个元素。 |
add(int index, E element) | 在指定位置插入一个元素。 |
get(int index) | 获取指定索引位置的元素。 |
set(int index, E element) | 替换指定索引位置的元素。 |
remove(int index) | 移除指定索引位置的元素。 |
size() | 获取列表的大小。 |
contains(Object obj) | 检查列表是否包含指定的元素。 |
indexOf(Object obj) | 获取指定元素在列表中的第一个出现位置的索引。 |
clear() | 清空列表中的所有元素。 |
toArray() | 将列表转换为数组。 |
addAll(Collection<? extends E> c) | 将另一个集合的所有元素添加到当前列表中。 |
ArrayList
数据结构:
ArrayList的数据结构由数组实现数据存储,如下图所示:
特点:
- 线程不安全(执行效率高),在多线程的情况下不建议使用。
源码分析:
-
ArrayList中维护了一个
Object
类型的数组elementData[]
,存储元素。transient Object[] elementData; // transient,表示该变量不会被序列化
-
创建ArrayList对象
默认使用的无参构造,则初始化容量为elementData=0,第一次添加元素,则扩容elementData=10,如果还需要扩容,则扩容elementData为1.5倍。List list=new ArrayList();
源码如下:
-
添加元素
list.add(元素);
源码如下:
LinkedList
数据结构:
- LinkedList底层实现了双向链表、双端队列特点。
特点:
- 可以添加任意元素(可以重复),包括null;
- 线程不安全,没有实现线程同步
Vector
数据结构:
- Vector底层是一个对象数组,
protected Object[] elementData;
特点:
- Vector是线程同步的,即线程安全,操作方法带有synchronized(支持线程同步和互斥);
public synchronized void addElement(E obj) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = obj;}
Set
特点:
- 无序(添加的顺序和访问的顺序不一致)、没有索引
- 不允许重读元素,最多包含一个null;
HashSet
数据结构:
HashSet的底层实际上是HashMap
,HashMap
的底层是(数组+链表+红黑树)

HashSet 中每个元素都被存储为键-值对,但值部分被设置为一个固定的常量PRESENT(通常是**Object
**类型的占位符),而不是实际的值。
```java
HashSet<String> set = new HashSet<>();
set.add("test");
```
底层键值对=`<test,PRESENT>`
扩容机制:
HashSet默认数组长度=11,每次扩充为原来的2n+1。
-
添加元素
- 当HashSet添加元素时,首先会计算元素的哈希码hashCode,并根据哈希码确定元素在哈希表中的位置;
//计算hashCode static final int hash(Object key) {int h;// key.hashCode():返回散列值也就是hashcode// ^:按位异或// >>>:无符号右移,忽略符号位,空位都以0补齐return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
-
判断链表是否有相同元素:对于多个对象来说hashCode可能相同,所以使用
equals()
方法来判断对象是否相同- 不相同:直接添加;
- 相同:不添加。
-
如果有链表长度>8,且table的长度>64,先进行扩容,然后将链表转为红黑树。
Map
小结
Java集合框架为开发人员提供了强大的工具,以满足各种数据处理需求。了解不同集合类型的特性和适用场景对于编写高效和可维护的Java应用程序至关重要。通过选择合适的数据结构和算法,开发人员可以更轻松地解决各种问题。
相关文章:

Java-集合框架
文章目录 摘要CollectionCollection集合遍历Iterator迭代器增强for循环 排序 ListArrayListLinkedListVector SetHashSet Map小结 摘要 Java的集合框架提供了一组用于存储、管理和操作数据的类和接口。这个框架提供了各种数据结构,如列表、集合、队列和映射&#x…...

联想携中国移动打造车路协同方案 助力重庆实现32类车联网场景
10月11日,联想集团在中国移动全球合作伙伴大会上首次分享了与中国移动等合作伙伴共同打造的5G车路协同案例——重庆两江协同创新区车路协同应用。联想利用基于5G智能算力技术,在总里程55公里路段实现了32类车联网场景。 据了解,重庆两江协同创…...

Rust入门基础
文章目录 Rust相关介绍为什么要用Rust?Rust的用户和案例 开发环境准备安装Rust更新与卸载Rust开发工具 Hello World程序编写Rust程序编译与运行Rust程序 Cargo工具Cargo创建项目Cargo构建项目Cargo构建并运行项目Cargo检查项目Cargo为发布构建项目 Rust相关介绍 为…...

民族民俗景区3d智慧旅游系统提升游客旅游体验和质量
随着科技的不断发展,传统的旅游方式正在逐渐被新的技术和系统所取代。网上3D沉浸式旅游体验凭借其身临其境的沉浸式体验优势,正成为旅游业的新宠。 网上3D沉浸式旅游体验是将旅游景区、度假区、休闲街区、科博馆等场所空间,利用VR全景制作、w…...

Webpack 解决:Error: error:0308010C:digital envelope routines::unsupported 的问题
1、问题描述: 其一、报错为: Error: error:0308010C:digital envelope routines::unsupported 中文为: 错误:错误:0308010C:数字信封例程::不支持 其二、问题描述为: 在项目打包的时候 np…...
JAVA操作Json的ObjectMapper类
JAVA操作Json的ObjectMapper类 市面上用于在 Java 中解析 Json 的第三方库,随便一搜不下几十种,其中的佼佼者有 Google 的 Gson以及本文的 jackson。 三者不相伯仲,随着掌握一个都能满足项目中的 json 解析操作,因为 Spring Boot…...
Docker--harbor
一,registry registry是私有仓库的核心,只有字符终端。 二,registry部署 #首先下载 registry 镜像 docker pull registry#在 daemon.json 文件中添加私有镜像仓库地址 vim /etc/docker/daemon.json {"insecure-registries": [&q…...

Flink中的时间和窗口
1.Flink的时间和窗口 在传统的批处理系统中,我们可以等到一批数据全部都到齐了之后,对其做相关的计算;但是在实时处理系统中,数据是源源不断的,正常情况下,我们就得来一条处理一条。那么,我们应…...
Ultra-Fast-Lane-Detection 车道线学习资料整理
目录 官方版本 两个优化 数据标注,降低参数量 1 数据标注 2降低参数量...
【Ubuntu】Ubuntu18.04终端卡顿问题
博主您好,我也遇到了类似的问题,但我找到了问题的原因: 在gnome-terminal中,按tab补全是默认开启了“咚咚咚”音效的,在gnome-terminal里把音效关掉就好了,主要是因为按tab时,NVIDIA的视频信号和…...

k8s强制删除pod、svc、namespace(Terminating)
如果名称空间、pod、pv、pvc全部处于“Terminating”状态时,此时的该名称空间下的所有控制器都已经被删除了,之所以出现pod、pvc、pv、ns无法删除,那是因为kubelet 阻塞,有其他的资源在使用该namespace,比如CRD等&…...
froeach迭代删除和List迭代删除问题
场景:我有一个 List<ISSLogMessage> records 数据,需要从里面删除指定内容数据 第一次写成 foreach(var item in records) {if (item.logMessage.Contains("上传通行记录"))records.Remove(item); } 直接报错,因为foreach 是个迭代器 直接移除它的对象会报…...
chromedriver下载地址
ChromeDriver下载地址: 淘宝镜像:https://registry.npmmirror.com/binary.html?pathchromedriver/ 官方镜像:https://sites.google.com/a/chromium.org/chromedriver/downloads在下载页面上,将看到一列Chrome浏览器的版本号和相…...

2ED2410-EM:12v / 24v智能模拟高侧MOSFET栅极驱动器
概述 12v / 24v智能模拟高侧MOSFET栅极驱动器。 特性 PRO-SIL ISO 26262-准备根据ISO 26262:2018条款8-13支持硬件元件评估的集成商。一个通道器件具有两个高侧栅极驱动器输出。3 Ω下拉,50 Ω上拉,用于快速开关开/关。支持背靠背MOSFET拓扑(共漏极和共源)。两个双向高侧模拟…...

什么是Fetch API?与传统的AJAX相比,有什么优势?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...
43.241.18.123哪些问题会导致服务器里面时间错误
我们在使用服务器的过程中,有时候可能会发现,服务器里面时间跟标准的时间对不上,那服务器里面时间错误可能由哪些问题引起: 硬件问题:服务器硬件中的时钟或电池可能损坏或失效,导致时间不准确或重置为默认…...

【ElasticSearch】更新es索引生命周期策略,策略何时对索引生效
大家好,我是好学的小师弟,今天和大家讨论下更新es索引生命周期策略后,策略何时对索引生效 结论: 若当前索引已应用策略A(旧),更新完策略A后,新的策略A会立即对原来的已经应用该策略的索引生效;若当前索引…...

卫星/RedCap/高算力/解决方案/创新金奖……移远通信为IOTE 2023再添新活力
9月20日,IOTE 2023第二十届国际物联网展深圳场震撼来袭。 作为IOTE多年的“老朋友”,移远通信在参展当天,不仅有5G RedCap、卫星通信、高算力、车载等高性能产品及终端展出,还携智慧出行、智慧生活、智慧能源、工业互联网等多领域…...

N9030B是德科技信号分析仪
181/2461/8938它能够实现对复杂信号的实时捕获、分析和处理。Keysight N9030B采用了最先进的技术和设计,为工程师和科学家们提供了一系列强大的功能,帮助他们更好地进行信号分析,以满足不断变化的应用需求。 Keysight N9030B采用了全新的硬件…...
Mysql索引原理
文章目录 一、Mysql索引原理1.1 mysql记录存储结构1.2 主键索引1.3 普通索引1.4 联合索引 一、Mysql索引原理 1.1 mysql记录存储结构 mysql默认使用innodb存储引擎存储数据。以页为最小单位存取数据,页的大小为16KB往mysql表中插入记录时:一个页中存放…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...