当前位置: 首页 > news >正文

Java字符串与集合核心知识点大全

Java字符串与集合核心知识点大全

一、字符串:StringStringBuilderStringBuffer

1.底层实现

String:Java 8及之前底层基于char[]字符数组实现,Java 9及之后优化为byte[]字节数组,通过编码标识区分字符编码,节省内存。String 被final修饰,数组引用不可修改,代表字符串不可变,每次字符串拼接、修改都会生成新的 String 对象。

StringBuilder / StringBuffer:底层均基于可变的动态字符数组(Java9+ byte[]),无 final 修饰,支持动态扩容。二者底层数组默认初始容量为16,修改字符串时不会创建新对象,直接操作底层数组。

2.线程安全

String:线程安全。对象不可变,多线程只读场景下不会产生并发修改问题。

StringBuffer:线程安全。几乎所有公有方法都被synchronized修饰,保证多线程环境下字符串操作的原子性,但是锁机制会带来性能损耗。

StringBuilder:线程不安全。方法无同步锁,多线程并发修改会出现数组覆盖、数据丢失等问题,仅适用于单线程场景。

3.性能对比

性能优先级:StringBuilder > StringBuffer > String

  • String:频繁拼接、修改字符串时,大量创建临时对象,触发频繁GC,性能极差。仅适合字符串常量、少量只读场景。
  • StringBuffer:同步锁带来额外开销,性能中等,适配多线程频繁修改字符串场景。
  • StringBuilder:无锁设计,开销最小,单线程下字符串拼接、修改首选。

4.核心适用场景

  • String:字符串极少修改、常量定义、参数匹配场景
  • StringBuilder:单线程大量字符串拼接、格式化、动态组装场景
  • StringBuffer:多线程环境下动态修改字符串场景

二、Collection单列集合体系

Collection 是单列集合根接口,核心子接口:List(有序可重复)、Set(无序不可重复)。

1. ArrayList

底层实现

基于动态可变Object数组实现,实现了 RandomAccess 接口,支持随机快速访问。空参构造初始化时,默认赋值空数组,首次添加元素时才初始化容量为16,实现懒加载优化内存。

扩容机制

  • 触发条件:底层数组元素个数 == 数组容量
  • 扩容规则:默认扩容为原容量的1.5(int oldCapacity + (oldCapacity >> 1))
  • 扩容流程:创建新数组 + 复制原数组元素(Arrays.copyOf)

线程安全

线程不安全。多线程同时 add、remove 时,会出现元素覆盖、数组越界、数据丢失问题,无任何同步机制。

性能特点

随机查询速度极快,尾部增删效率高;头部/中间增删效率低,需要移动大量元素。

2. LinkedList

底层实现

基于双向链表实现,内部定义 Node 节点类,存储元素、前驱节点、后继节点指针,无固定容量、无需扩容。不实现 RandomAccess 接口,不支持随机访问。

扩容机制

无数组结构,无需扩容,新增元素仅需要创建节点、修改指针指向。

线程安全

线程不安全,多线程并发修改会导致链表指针混乱、数据异常。

性能特点

随机查询效率极低(需要从头遍历链表);任意位置增删效率极高,仅修改指针,无需移动元素。

3. HashSet

底层实现

底层基于HashMap实现,HashSet 的元素存储在 HashMap 的 key 位置,value 统一为固定常量 Object。依托 HashMap 的哈希机制实现元素无序、不可重复。

扩容机制

完全复用 HashMap 扩容规则:初始容量16,负载因子0.75,容量满时扩容为2倍。

线程安全

线程不安全,无同步机制,多线程并发添加元素可能导致数据覆盖、元素丢失。

去重原理

添加元素时,先调用hashCode()计算哈希值定位索引,若索引位置无元素则直接存入;若存在元素,再调用equals()对比内容,相同则覆盖,不同则链表挂载。

三、Map双列集合体系

Map 是双列集合根接口,存储 key-value 键值对,key 唯一、value 可重复,核心实现类:HashMap、TreeMap。

1. HashMap

底层实现(JDK1.8重点优化)

底层采用数组+链表+红黑树结构:数组为哈希桶,桶内元素较少时用单向链表,链表长度超过阈值且数组容量≥64时,链表转化为红黑树;元素减少时红黑树退化为链表。

扩容机制

  • 初始容量:16,默认负载因子:0.75
  • 扩容阈值:容量 × 负载因子(16×0.75=12),元素数量超过阈值触发扩容
  • 扩容规则:容量扩容为原来的2
  • 树化阈值:链表长度 >=8 且数组容量 >=64;退树阈值:红黑树节点数 <=6

线程安全

线程不安全。JDK1.7 多线程扩容会出现链表环、死循环、数据丢失;JDK1.8 优化了扩容逻辑,解决死循环问题,但仍存在数据覆盖、元素丢失的并发问题。

2. TreeMap

底层实现

底层基于红黑树实现,天然有序,可根据 key 的自然排序规则或自定义比较器排序。所有键值对存储在红黑树节点中,无数组、链表结构。

扩容机制

红黑树为动态树形结构,无扩容概念,新增元素通过红黑树的自平衡机制(变色、左旋、右旋)维持树平衡。

线程安全

线程不安全,无同步锁,多线程并发修改会破坏红黑树结构,导致数据异常。

核心特点

key 有序、可排序;查询、增删时间复杂度稳定 O(logn),性能略低于 HashMap。

四、Collections工具类高级用法

Collections 是集合静态工具类,专门用于操作 Collection、Map 集合,提供大量静态工具方法,区别于 Collection 集合接口。

1.线程安全包装

通过静态方法将非线程安全集合转为同步集合,底层通过包装类 + synchronized 代码块实现同步:

  • Collections.synchronizedList():包装 ArrayList、LinkedList
  • Collections.synchronizedMap():包装 HashMap、TreeMap
  • Collections.synchronizedSet():包装 HashSet、TreeSet

缺点:粒度粗,所有方法共用一把锁,并发性能差,仅适用于低并发场景。

2.空集合安全创建

返回不可变空集合,避免空指针异常,无需手动判空,节省内存:Collections.emptyList()emptyMap()emptySet()。创建的空集合不可增删修改

3.集合排序与最值

  • sort(List list):根据元素自然排序规则排序
  • sort(List list, Comparator c):自定义比较器排序,支持灵活排序规则
  • max()/min():获取集合最大、最小元素

4.不可变集合创建

unmodifiableList()/unmodifiableMap()/unmodifiableSet():将普通集合转为只读不可变集合,禁止新增、删除、修改元素,修改会直接抛出 UnsupportedOperationException,常用于常量集合封装。

5.批量操作

  • addAll(Collection c, T... elements):批量向集合添加元素
  • replaceAll():批量替换集合指定元素
  • frequency():统计集合中指定元素出现次数

五、并发集合底层原理与应用

JUC 并发集合位于 java.util.concurrent 包,专为高并发场景设计,相比 Collections 包装集合,锁粒度更细、并发性能更高、线程安全。

1. ConcurrentHashMap

底层原理

JDK1.8 底层依旧是数组+链表+红黑树,摒弃分段锁,采用CAS + synchronized锁桶机制:仅锁定当前操作的哈希桶,而非整个集合,锁粒度极小。

核心特性

  • key、value禁止为null,避免歧义;HashMap 支持 null 键值
  • 并发安全,高并发读写性能优异
  • 扩容机制与 HashMap 一致,支持并发扩容,多线程辅助迁移数据

应用场景

多线程环境下高频读写的键值对存储,是并发场景下 HashMap 的首选替代方案。

2. CopyOnWriteArrayList

底层原理

写时复制机制:底层基于数组实现,读操作无锁;写操作(add/set/remove)时,先复制一份新数组,在新数组上完成修改,修改完成后将原数组引用指向新数组。写操作使用 ReentrantLock 可重入锁保证线程安全。

核心特性

  • 读写分离:读无锁、写有锁,读性能极高
  • 数据最终一致性,非实时一致性:读操作读取的是修改前的旧数组快照
  • 内存开销大,每次写操作都会复制数组

应用场景

读多写少的并发场景,如配置缓存、白名单、黑名单列表,不适合大量写入的场景。

3. BlockingQueue阻塞队列

底层原理

阻塞队列是线程安全的队列,基于ReentrantLock + Condition条件锁实现,核心特性:队列满时,写入线程阻塞;队列空时,读取线程阻塞,天然适配生产者消费者模型。

核心实现类与特性

  • ArrayBlockingQueue:基于数组、有界阻塞队列,锁粒度粗,读写共用一把锁
  • LinkedBlockingQueue:基于链表、默认无界(可指定容量),读写分离两把锁,并发性能更高,线程池默认队列
  • SynchronousQueue:无容量队列,插入操作必须等待对应删除操作,一对一传递数据

应用场景

线程池任务队列、生产者消费者模式、流量削峰、异步任务缓冲等并发场景。

http://www.jsqmd.com/news/740165/

相关文章:

  • 别只盯着论文看!用Calib3D和Place3D,手把手教你搭建更可靠的自动驾驶感知系统
  • 第1篇:Java内存模型(JMM)与volatile——并发编程的基石
  • 如何5分钟解锁中兴光猫完整权限:zteOnu工具终极指南
  • 2026年3月艺术疗愈课程推荐,青少年一对一心理咨询/青少年心理咨询/心理咨询/一对一心理咨询,艺术疗愈机构口碑推荐 - 品牌推荐师
  • MySQL多表联查时,Column ‘xxx‘ is ambiguous 报错?别慌,3分钟教你彻底搞懂并解决它
  • IoTAutomationFramework_2.0 安卓测试自动化工具
  • 深入对比:Zynq上AXI UARTLite vs UART 16550,多路串口方案到底怎么选?
  • 2026年最新排名:中国质量协会六西格玛考试含金量怎么样(附避坑榜) - 众智商学院课程中心
  • [C# 笔记] 如何设置消息钩子 (以低级鼠标钩子为例)
  • 为什么选择优德营造Omakase设计打造你的日料餐厅?
  • 原神游戏数据采集与分析实战指南
  • 2026 选什么降 AI 软件不踩坑?看排行前先搞懂这 3 个降 AI 平台差异。 - 我要发一区
  • GSPO算法:序列级策略优化在旅行规划中的应用
  • **2026年5月六西格玛认证排行榜|黑带VS绿带含金量与报考评价** - 众智商学院课程中心
  • Linux系统PPP拨号全攻略:从串口调试到断线自动重连的完整实现
  • 04 接雨水 单调栈
  • Ultralytics LLM:将YOLO工程哲学带入大语言模型应用开发
  • 开源桌面示波器Haasoscope:FPGA+MCU架构与Python客户端全解析
  • 深度解析applera1n:基于checkm8漏洞的iOS激活锁绕过技术实现
  • 中山AI优化提供商哪家强?原来有这些选择!
  • OBS虚拟摄像头进阶玩法:除了共享屏幕,还能在腾讯会议里玩出什么花?
  • 毕业答辩前选哪款降 AI 软件?2026 排行前 5 让 AI 率降到 5% 以下! - 我要发一区
  • 第二章、application.properties文件的配置
  • 2026年5月六西格玛绿带黑带含金量排行|报考避坑榜Top5 - 众智商学院课程中心
  • Ubuntu Server 24.04下解决SunloginClient 向日葵依赖libgconf-2-4安装问题
  • SAP SD新手避坑:VA01创建销售订单报‘无定价过程’?手把手教你用OVKK搞定配置
  • 从Pikachu靶场看企业级Web安全:这些漏洞在真实业务中如何防御?
  • MAA明日方舟自动化助手完整指南:如何一键解放双手高效长草
  • 论文 AI 率从 78% 降到 3.2%!2026 排行前 3 降 AI 软件让你赶上答辩。 - 我要发一区
  • ESXi 7.0U3迁移实战:手把手教你用命令行把旧主机配置‘克隆’到新服务器