当前位置: 首页 > 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.xdnf.cn/news/1372897.html

相关文章:

  • 宝石组合(蓝桥杯)
  • 2025最新的软件测试热点面试题(答案+解析)
  • 【Linux 34】Linux-主从复制
  • plantsimulation知识点 RGV小车前端与后端区别
  • CNN 中 3×3 卷积核等设计背后的底层逻辑
  • spring如何通过实现BeanPostProcessor接口计算并打印每一个bean的加载耗时
  • 如何下载MySQL小白指南 (以 Windows 为例)
  • 基础|Golang内存分配
  • 学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
  • 数据结构的线性表 之 链表
  • 深度学习——神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • 2026 届最新大数据专业毕设选题推荐,毕业设计题目汇总
  • typescript 中的访问修饰符
  • 工业数据消费迎来“抖音式”革命:TDengine IDMP 让数据自己开口说话
  • 利用3台机器搭建Kubernetes集群
  • 工业大模型五层架构全景解析:从算力底座到场景落地的完整链路
  • 《分布式任务调度中“任务重复执行”的隐性诱因与根治方案》
  • 算法练习-合并两个有序数组
  • Java大厂面试全真模拟:从Spring Boot到微服务架构实战
  • HTML应用指南:利用GET请求获取中国银行人民币存款利率数据
  • 【系统架构设计(二)】系统工程与信息系统基础中:信息系统基础
  • 数据结构青铜到王者第四话---LinkedList与链表(1)
  • [Mysql数据库] 知识点总结3
  • 深度学习:卷积神经网络(CNN)
  • Docker中如何记录非交互式连接ssh用户操作的所有命令记录?
  • QT(QTableWidget)
  • 机器学习:前篇
  • Linux系统的网络管理(二)
  • SELinux相关介绍
  • 质押、ETF、财库三箭齐发:以太坊价值逻辑的重构与演进