java collection集合特点知识点详解
在 Java 中,Collection
是所有集合类的根接口,它定义了一组对象的基本操作。Java 集合框架提供了丰富的实现类(如List
、Set
、Queue
),具有以下核心特点:
一、统一的接口设计
1. 核心接口层次
Collection (根接口)
├── List (有序可重复)
├── Set (无序不重复)
└── Queue (队列,FIFO)
List
:元素有序、可重复,支持索引访问(如ArrayList
、LinkedList
)。Set
:元素无序、唯一(如HashSet
、TreeSet
)。Queue
:遵循先进先出(FIFO)原则(如LinkedList
、PriorityQueue
)。
2. 共性方法
所有Collection
实现类都支持以下操作:
add(E e); // 添加元素
remove(Object o);// 移除元素
contains(Object o); // 判断是否包含
size(); // 返回元素数量
isEmpty(); // 判断是否为空
clear(); // 清空集合
iterator(); // 获取迭代器
toArray(); // 转换为数组
二、动态扩容机制
- 自动调整大小:大部分集合类(如
ArrayList
、HashMap
)会在元素数量超过容量时自动扩容。 - 扩容策略:
ArrayList
:初始容量为 10,扩容时新容量 = 旧容量 × 1.5。HashMap
:初始容量为 16,负载因子 0.75,扩容时新容量 = 旧容量 × 2。
三、线程安全与非线程安全
1. 非线程安全实现
ArrayList
、HashSet
、HashMap
等:性能高,但不支持多线程并发访问。
List<String> list = new ArrayList<>(); // 非线程安全
2. 线程安全实现
Vector
、Hashtable
:早期线程安全类,通过synchronized
实现,性能较低。Collections.synchronizedXXX()
:将非线程安全集合转换为线程安全集合。
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
java.util.concurrent
包:CopyOnWriteArrayList
、ConcurrentHashMap
:高效的线程安全集合,采用写时复制或分段锁机制。
四、高效的迭代与遍历
1. 迭代器(Iterator
)
- 所有集合都支持通过
iterator()
方法获取迭代器,实现统一遍历。
Iterator<String> it = list.iterator();
while (it.hasNext()) {System.out.println(it.next());
}
2. for-each
循环
- 语法糖,底层依赖迭代器实现。
for (String element : list) {System.out.println(element);
}
五、丰富的数据结构实现
1. List
的实现类
ArrayList
:基于动态数组,随机访问快(O (1)),插入 / 删除慢(O (n))。LinkedList
:基于双向链表,插入 / 删除快(O (1)),随机访问慢(O (n))。
2. Set
的实现类
HashSet
:基于哈希表,无序,元素唯一。TreeSet
:基于红黑树,有序(自然排序或自定义排序)。LinkedHashSet
:基于哈希表 + 链表,保持插入顺序。
3. Map
的实现类
HashMap
:键值对存储,无序,允许null
键和null
值。TreeMap
:基于红黑树,按键有序。LinkedHashMap
:保持插入顺序或访问顺序。
六、泛型支持
- 类型安全:Java 5 引入泛型后,集合可以指定存储的元素类型。
List<String> list = new ArrayList<>(); // 只能存储String类型
list.add("Java");
// list.add(123); // 编译错误
七、与数组的互操作性
- 集合转数组:通过
toArray()
方法。
List<String> list = Arrays.asList("A", "B", "C");
String[] array = list.toArray(new String[0]);
数组转集合:通过Arrays.asList()
方法。
String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);
八、性能特点对比
操作 | ArrayList | LinkedList | HashSet | TreeSet |
---|---|---|---|---|
随机访问 | O(1) | O(n) | - | - |
插入 / 删除尾部 | O(1) | O(1) | O(1) | O(log n) |
插入 / 删除中间 | O(n) | O(1) | - | - |
查找元素 | O(n) | O(n) | O(1) | O(log n) |
九、常见注意事项
-
null
值处理:ArrayList
、HashMap
允许存储null
,而TreeSet
、TreeMap
不允许(因依赖比较器)。
-
equals()
和hashCode()
:- 若元素需存储在
HashSet
或HashMap
中,必须正确重写equals()
和hashCode()
方法。
- 若元素需存储在
-
fail-fast 机制:
- 当集合在迭代过程中被修改时,会抛出
ConcurrentModificationException
。
- 当集合在迭代过程中被修改时,会抛出
Java 集合框架通过统一接口、丰富实现和高效算法,为开发者提供了灵活且高性能的数据结构选择,适用于各种场景。合理选择集合类型(如ArrayList
vs LinkedList
、HashMap
vs TreeMap
)是优化代码性能的关键。
相关文章:
java collection集合特点知识点详解
在 Java 中,Collection 是所有集合类的根接口,它定义了一组对象的基本操作。Java 集合框架提供了丰富的实现类(如List、Set、Queue),具有以下核心特点: 一、统一的接口设计 1. 核心接口层次 Collection …...
ngx_http_realip_module 模块概述
一、使用场景 日志记录 记录真实客户端 IP 而非反向代理的 IP,有助于流量分析和安全审计。访问控制 基于真实 IP 实现防火墙规则(allow/deny)或限流,而非误将上游 IP 视为客户端。GeoIP、WAF、限速等功能 模块化的上游真实 IP 支…...
自定义CString类与MFC CString类接口对比
接口对比表格 功能分类 你的 CString 接口 MFC CString 接口(ANSI) 一致性 差异说明 构造函数 CString() CString(const char*) CString(char) CString(const CString&) CString() CString(LPCSTR) CString(TCHAR) CString(const CString&…...

华为OD机试真题——考勤信息(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

Go语言测试用例的执行与分析
在软件开发过程中,测试用例是确保代码质量的关键环节。Go语言作为一种现代的编程语言,它内置了强大的测试框架,可以帮助开发者轻松编写和执行测试用例。本文将介绍如何在 Go 语言中编写、执行测试用例,并对测试结果进行分析。 ## …...
vue3 vite 路由
如路由是这种格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…...

MyBatis:动态SQL
文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档: https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦,例如拼接…...

游戏引擎学习第280天:精简化的流式实体sim
回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用,能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了,但实际上还…...
femap许可与多用户共享
随着电磁仿真技术的发展,Femap作为一款领先的工具,在多个领域中发挥着不可替代的作用。然而,对于许多团队和企业来说,如何高效、经济地管理和使用Femap许可证成为了一个亟待解决的问题。本文将探讨Femap许可与多用户共享的概念、优…...

王树森推荐系统公开课 排序03:预估分数融合
融合预估分数 p c l i c k ⋅ p l i k e p_{click} \cdot p_{like} pclick⋅plike 有实际意义,等于在曝光中点赞的概率。 p c l i c k ⋅ p c o l l e c t p_{click} \cdot p_{collect} pclick⋅pcollect 同理。 按多种排名做 ensemble sort。 某电商的融…...

网络I/O学习-poll(三)
一、为什么要用Poll 由于select参数太多,较于复杂,调用起来较为麻烦;poll对其进行了优化 二、poll机制 poll也是一个系统调用,每次调用都会将所有客户端的fd拷贝到内核空间,然后进行轮询,判断IO是否就绪…...

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)
金丝雀部署简介: 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发…...
【git config --global alias | Git分支操作效率提升实践指南】
git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中,Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中,我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …...
chrome源码中WeakPtr 跨线程使用详解:原理、风险与最佳实践
base::WeakPtr 在 Chromium 中 不能安全地跨线程使用。这是一个很关键的点,下面详细解释原因及正确用法。 🔍原理与使用 ✅ 先说答案: base::WeakPtr 本质上是**线程绑定(thread-affine)**的。不能在多个线程之间创建…...
【Go】从0开始学习Go
文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素(核心三部分)1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...
Windows 安装显卡驱动
1.第一步:打开Nvidia 官网驱动下载页面 2.第二步:选择相关信息, 玩游戏选择,GeForce Game Ready ,创意设计、摄影直播 选择 NVIDIA Studio 驱动程序 (NVIDIA Studio Driver - WHQL.) 2.第三步࿱…...
模块与包的导入
一、导入官方库 我们复盘下学习python的逻辑,所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 类别典型库解决的问题学习门槛基础工具os、sys、json操作系统交互、序列化数据(如读写 JSON 文件)低科学计算n…...

Google设置app-ads.txt
问题: 应用上架后admob后台显示应用广告投放量受限,需要设置app-ads.txt才行。 如何解决: 官方教程: 看了下感觉不难,创建一个txt,将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…...

docker安装rockerMQ
参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址: https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…...

交叉引用、多个参考文献插入、跨文献插入word/wps中之【插入[1-3]、连续文献】
我们在写论文时,需要插入大量参考文献。 有时,一句话需要引用多个文献,如:[1-3]或者[1,3,4]这种形式多个文献插入、跨文献插入。 在上一篇文章中,我们提到可以直接打“-”或者“,”,但是word导出…...

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲
PLC双人舞:ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析:施耐德PLC与AB PLC的互联互通 在现代工业自动化中,设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关,将施耐德P…...
Image and depth from a conventional camera with a coded aperture论文阅读
Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…...

缺乏团队建设活动,如何增强凝聚力?
当一个团队缺乏系统性的建设活动时,成员之间容易产生疏离感、误解与信任缺失,最终影响整体执行力和目标达成。要有效增强团队凝聚力,应从设计高参与感的团队活动、结合业务与人文目标、营造持续共创的文化机制、推动跨层级协作互动等层面着手…...
特征筛选方法总结
非模型方法 一.FILTER过滤法: 1.缺失值比例(80%以上缺失则删除)/方差 注意: 连续变量只删方差为0的,因为变量取值范围会影响方差大小。 离散类的看各类取值占比,如果是三分类变量可以视作连续变量。 函数:V…...

力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素
这道题直接用最笨的办法来做的,用递归来做,我们定义一个全局变量vector<int> element,然后使用中序遍历,每当碰到一个非空节点就将其加入到向量中,这样依赖当向量中的元素小于k时,就返回0,…...
pinia.defineStore is not a function
错误信息表明 pinia.defineStore 不是一个函数,这通常意味着 pinia 没有被正确导入或初始化。 解决方案 检查 Pinia 的导入 确保你从 pinia 中正确导入了 defineStore。正确的导入方式应该是: javascript import { defineStore } from ‘pinia’; 如果你使用的是 createPin…...
入职软件开发与实施工程师了后........
时隔几个月没有创作的我又回来了,这几个月很忙,我一直在找工作,在自考(顺便还处理了一下分手的事),到处奔波,心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生,做我不愿意做的普通…...
PCL点云库点云数据处理入门系列教材目录(2025年5月更新....)
PCL点云库点云数据处理入门系列教材目录 基础阶段 第 1 讲:PCL库简介和安装(Win10/11VS2019PCL 1.12.0)第 2 讲:PCL库中点云基本知识和数据类型结构第 3 讲:PCL库中点云数据格式PCD和PLY及其输入输出(IO&…...

Linux面试题集合(5)
把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时,搜寻ab字符 /ab 用more和less如何查看文件 more: CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …...

python动漫论坛管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...