news 2026/6/10 0:26:52

【2026.1.5】学习笔记之Java 集合-1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2026.1.5】学习笔记之Java 集合-1

目录

1. ArrayList 的扩容机制:它凭什么能“自动变大”?

2. 线程安全的 List:CopyOnWriteArrayList 的“写时复制”黑科技

3. Stream 流:从“遍历”到“加工”的飞跃

4. 数据结构的抉择:红黑树 vs 平衡二叉树 (AVL)

5. 补充:并发环境下的 Map 选择


1. ArrayList 的扩容机制:深度拆解

ArrayList的动态扩容是 Java 面试的必考点,重点在于“为什么”和“怎么做”。

  • 默认容量与延迟初始化:当你new ArrayList()时,系统并不会立刻分配 10 个空间,而是先给一个空数组。只有在第一次执行add操作时,才会真正分配 10 个单位的内存。

  • 扩容触发条件:当当前元素个数(size)已经达到了数组的容量上限(length)时,就会触发扩容。

  • 核心公式int newCapacity = oldCapacity + (oldCapacity >> 1)

  • 深度理解 1.5 倍

    • 位运算优化:使用右移运算符>> 1相当于除以 2,这在 CPU 层面执行极快,减少了运算时间。

    • 权衡利弊:扩容倍数选 1.5 是为了平衡“空间浪费”和“扩容频率”。如果倍数太大(如 2 倍)会浪费内存;如果太小(如 1.1 倍)则会导致频繁“搬家”影响性能。

  • 搬家代价:扩容涉及创建新数组、通过Arrays.copyOf复制老数据、更新引用。在大数据量下,建议初始化时指定initialCapacity以减少扩容次数。


2. 线程安全:CopyOnWriteArrayList 的并发之美

这种 List 的设计初衷是为了解决多线程遍历时不抛出ConcurrentModificationException

  • 写时复制(Copy-On-Write)流程

    1. 独占写:写操作(如add)必须加锁(JDK 8 用ReentrantLock,JDK 11+ 用synchronized),确保同一时刻只有一个线程在写。

    2. 物理隔离:不直接修改原数组,而是将原数组拷贝一份并让长度加 1。

    3. 引用切换:在新数组上改完后,通过setArray(newElements)改变volatile指针的指向。

  • Volatile 的作用:底层数组被volatile修饰,保证了一旦写线程完成引用替换,读线程能立刻感知到新地址。

  • 读操作的“无锁化”:读操作(get)完全不加锁,性能极高。

  • 致命缺点:内存占用翻倍(写时有两份数组);数据弱一致性(读线程在写线程完成前可能读到旧数据)。


3. Stream 流常用操作:函数式编程精要

Stream 让集合处理变得像流水线一样高效。

  • 常用中间操作(返回 Stream,可级联)

    • filter(p):保留符合条件的元素。

    • map(f):转换元素类型(如将 User 对象转为 String 姓名)。

    • sorted():排序。

    • distinct():去重。

  • 常用终端操作(关闭流,产出结果)

    • collect(Collectors.toList()):将结果收集回 List。

    • forEach(c):逐个处理。

    • count():统计个数。

    • anyMatch(p):只要有一个符合条件就返回 true(短路操作)。


4. 数据结构:平衡二叉树 vs 红黑树 (HashMap 为何选后者?)

这是判断候选人对数据结构理解深度的重要题目。

  • 平衡二叉树 (AVL)

    • 特点:严格平衡,左右子树高度差不超过 1。

    • 优势:查询最快(层数最少)。

    • 劣势:插入和删除会导致频繁的“旋转”,维护成本极高。

  • 红黑树 (R-B Tree)

    • 特点:弱平衡,确保没有路径比其他路径长两倍。

    • 优势:它是查找、插入和删除的性能折中方案

  • HashMap 的决策逻辑

    • HashMap会频繁进行插入和删除操作。

    • 如果用 AVL,每次put可能都要旋转多次,写性能太差。

    • 红黑树保证了最坏情况下的查询时间复杂度也是 $O(\log n)$,同时减少了维护平衡的开销。


5. 补充点:HashMap 为什么会有完整性破坏?

  • 死循环问题:JDK 1.7 以前扩容使用“头插法”,并发下会导致链表成环,导致遍历时 CPU 100%。

  • 数据丢失:JDK 1.8 虽然改用“尾插法”解决了死循环,但多线程并发put时,由于没有加锁,后一个线程的写入仍可能覆盖前一个线程的写入。

  • 解决方案:在并发环境下必须使用ConcurrentHashMap。它在 JDK 1.8 中通过volatile+CAS+synchronized的组合拳,将锁的粒度细化到了每个哈希桶的头节点上。


学习感悟:

今天的复习让我明白,Java 集合的设计核心就在于“在性能、安全和功能之间做取舍”。没有最好的结构,只有最适合场景的工具。

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

GLM-4.6V-Flash-WEB模型在菜谱图像转文字中的实用案例

GLM-4.6V-Flash-WEB模型在菜谱图像转文字中的实用案例 在家庭厨房的抽屉里,常常藏着泛黄的手写菜谱;社交媒体上,美食博主分享的图文教程琳琅满目。这些信息本应被轻松复用,但现实是——我们很难快速提取出其中的关键内容。拍一张照…

作者头像 李华
网站建设 2026/6/10 17:52:08

GLM-4.6V-Flash-WEB模型能否识别军事装备类型?

GLM-4.6V-Flash-WEB模型能否识别军事装备类型? 在安防监控、情报分析和内容审核等场景中,对图像中的特定目标进行快速准确识别正变得越来越重要。尤其是涉及军事装备的视觉理解任务——比如从一张卫星图中判断某型飞行器是否为战略运输机,或通…

作者头像 李华
网站建设 2026/6/10 14:50:57

GLM-4.6V-Flash-WEB模型能否识别候鸟迁徙中途停歇时长?

GLM-4.6V-Flash-WEB 能否识别候鸟迁徙中途停歇时长? 在生态保护领域,候鸟迁徙研究长期面临一个核心难题:如何低成本、大范围地获取鸟类在迁徙途中停留时间的准确信息。传统手段依赖人工观测或昂贵的卫星追踪设备,不仅覆盖有限&…

作者头像 李华
网站建设 2026/6/10 19:11:54

GLM-4.6V-Flash-WEB模型在滑翔机起飞条件判断中的图像支持

GLM-4.6V-Flash-WEB模型在滑翔机起飞条件判断中的图像支持 在偏远山区的滑翔基地,清晨的薄雾还未散尽,飞行员站在跑道边凝视天空——云层高度够不够?风向是否有利?跑道上有没有昨晚降雨留下的积水?这些看似简单的观察&…

作者头像 李华
网站建设 2026/6/10 20:16:29

GLM-4.6V-Flash-WEB模型与知识图谱结合构建智能问答系统

GLM-4.6V-Flash-WEB模型与知识图谱结合构建智能问答系统 在医疗咨询、工业运维甚至日常购物中,用户越来越习惯直接上传一张图片并提问:“这药怎么吃?”“这个零件坏了怎么办?”“这款商品有现货吗?”——传统的纯文本问…

作者头像 李华
网站建设 2026/6/10 15:57:23

GLM-4.6V-Flash-WEB模型对冻雨对电力设施影响的图像评估

GLM-4.6V-Flash-WEB模型对冻雨对电力设施影响的图像评估 在南方某山区的一次寒潮中,一场持续数小时的冻雨悄然降临。输电线路表面逐渐凝结出一层透明而致密的冰壳——这种被称为“雨凇”的覆冰现象,正悄无声息地增加着导线负荷。若不及时发现&#xff0c…

作者头像 李华