news 2026/5/2 20:18:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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:无容量队列,插入操作必须等待对应删除操作,一对一传递数据

应用场景

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 20:15:09

当数字笔记遇上专业手写:Xournal++如何重塑跨平台创作体验

当数字笔记遇上专业手写&#xff1a;Xournal如何重塑跨平台创作体验 【免费下载链接】xournalpp Xournal is a handwriting notetaking software with PDF annotation support. Written in C with GTK3, supporting Linux (e.g. Ubuntu, Debian, Arch, SUSE), macOS and Window…

作者头像 李华
网站建设 2026/5/2 20:14:16

5步掌握R3nzSkin:英雄联盟皮肤自定义终极指南

5步掌握R3nzSkin&#xff1a;英雄联盟皮肤自定义终极指南 【免费下载链接】R3nzSkin Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3n/R3nzSkin R3nzSkin是一款开源的英雄联盟换肤工具&#xff0c;允许玩家在游戏中自定义英雄皮…

作者头像 李华
网站建设 2026/5/2 20:13:18

Ultralytics LLM:将YOLO工程哲学带入大语言模型应用开发

1. 项目概述&#xff1a;当计算机视觉巨头拥抱大语言模型如果你在AI领域&#xff0c;尤其是计算机视觉方向摸爬滚打过&#xff0c;那么“ultralytics”这个名字对你来说一定如雷贯耳。它旗下的YOLO系列&#xff0c;从v5到v8&#xff0c;再到最新的v11&#xff0c;几乎重新定义了…

作者头像 李华
网站建设 2026/5/2 20:09:26

GLM API 介绍 - Ace Data Cloud

简介 Ace Data Cloud 提供了一整套强大的 GLM&#xff08;Generative Language Model&#xff09;API&#xff0c;支持 Zhipu AI 的全系列大型语言模型。该平台允许用户以 OpenAI 兼容的格式集成 GLM 模型&#xff0c;涵盖推理、对话、视觉等多种应用场景。本文将手把手教你如…

作者头像 李华