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

Java 集合笔记

1. 集合的常用实现类

接口常用实现类底层结构特点
ListArrayList动态数组随机访问快,增删中间慢
ListLinkedList双向链表增删头尾快,随机访问慢
SetHashSet哈希表去重,无序
SetTreeSet红黑树去重,自动排序(升序或自定义)
MapHashMap哈希表键唯一,无序
MapTreeMap红黑树键唯一,自动排序

1.1 线程安全问题

非线程安全的集合:ArrayList、HashMap、HashSet ,多个线程同时调用它们的方法(add/remove/get),不额外加锁就可能抛出异常(如ConcurrentModificationException)或产生脏数据。

想要线程安全,可以用 Collections.synchronizedList(new ArrayList<>())。直接用 CopyOnWriteArrayList、ConcurrentHashMap 等并发集合。这些类内部已经用锁、CAS 或其他并发算法保证了多线程同时操作也安全。如:

// 多个线程随便 add/remove/get,不会出错
List<Integer> safeList = new CopyOnWriteArrayList<>();

1.2 简单归纳

集合类型线程安全?备注
ArrayList×需额外加锁
HashMap×需额外加锁
Vector / Hashtable早期同步类,性能差
Collections.synchronizedXxx包装后安全,但锁粒度大
CopyOnWriteArrayList读多写少场景
ConcurrentHashMap高并发场景首选

2. 常见操作方法

2.1 List 操作

List<String> list = new ArrayList<>();list.add("A");                // 追加
list.add(1, "B");             // 指定位置插入
list.set(0, "X");             // 替换
String e = list.get(2);       // 按索引取值
int n = list.size();          // 元素个数
list.remove("A");             // 按对象删
list.remove(2);               // 按索引删
boolean has = list.contains("X");
list.sort(String.CASE_INSENSITIVE_ORDER);  // 排序

2.2 Set 操作

Set<Integer> set = new HashSet<>();set.add(10);                  // 添加
set.remove(10);               // 删除
boolean exists = set.contains(10);
int s = set.size();
for (Integer i : set) { }     // 遍历

2.3 Map 操作

Map<String, Integer> map = new HashMap<>();map.put("apple", 3);          // 存键值
map.putIfAbsent("pear", 1);   // 不存在才放
int v = map.get("apple");     // 按键取值
map.remove("apple");
boolean hasKey = map.containsKey("apple");
for (Map.Entry<String,Integer> e : map.entrySet()) {System.out.println(e.getKey() + " -> " + e.getValue());
}

3. 注意事项

  1. 用 equals() 比较内容,而非 ==
  2. 遍历过程中删除元素用 Iterator.remove() 或 removeIf(),避免 ConcurrentModificationException。
  3. 想保持插入顺序的 Set,用 LinkedHashSet;想按访问顺序做缓存淘汰,用 LinkedHashMap 开启 access-order。
  4. 需要线程安全时,优先选 java.util.concurrent 包里的类,而不是 Collections.synchronizedXxx。
  5. 要顺序用 List,要去重用 Set,要键值对用 Map。
  6. 读多写少用 ArrayList,写多读少用 LinkedList。
  7. 需要并发用 concurrent,需要排序用 Tree。
http://www.dtcms.com/a/352517.html

相关文章:

  • 第二章 进程与线程
  • 简明 | Yolo-v3结构理解摘要
  • Python-机器学习概述
  • ruoyi-vue(十二)——定时任务,缓存监控,服务监控以及系统接口
  • Python 轻量级的 ORM(对象关系映射)框架 - Peewee 入门教程
  • CentOS 7 升级 OpenSSH 10.0p2 完整教程(含 Telnet 备份)
  • 性能瓶颈定位更快更准:ARMS 持续剖析能力升级解析
  • 告别繁琐运维,拥抱自动化:EKS Auto Mode 实战指南
  • C代码学习笔记(二)
  • RK3506 开发板:嵌入式技术赋能多行业转型升级
  • 大数据时代UI前端的智能化升级路径:基于用户行为数据的预测性分析
  • PMP项目管理知识点-⑨项⽬资源管理
  • 大模型应用编排工具Dify之插件探索
  • 【LeetCode - 每日1题】求对角线最长矩形的面积
  • Claude 的优势深度解析:大模型竞争格局中的隐藏护城河
  • NX773HSA19美光固态闪存D8BJND8BJQ
  • inline内联函数
  • TensorFlow 深度学习:使用 feature_column 训练心脏病分类模型
  • 【软考论文】论可观测性架构技术的应用
  • 【资源】Github资源整理
  • C6.3:发射结交流电阻
  • Vue3 + Element Plus实现表格多行文本截断与智能Tooltip提示
  • 【黑客技术零基础入门】2025最新黑客工具软件大全,零基础入门到精通,收藏这篇就够了!
  • 【数据结构】单链表详解
  • Java基础 8.26
  • 【7】SQL 语句基础应用
  • 基于SpringBoot的演唱会网上订票系统的设计与实现(代码+数据库+LW)
  • 自由学习记录(89)
  • 一份兼容多端的HTML邮件模板实践与详解
  • 美妆品牌如何用 DAM 管理海量产品图片?