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

Java 集合框架:List、Set、Map 特性、创建方式与遍历方式总结

Java 集合框架:List、Set、Map 特性、创建方式与遍历方式总结

Java 中的集合框架提供了 ListSetMap 三种常用的集合类型,它们各自有不同的特性、创建方式和使用场景。下面对每种集合类型的特性、创建方式、遍历方式以及适用需求进行总结,并展示如何使用 Collections 对集合进行排序。


1. List 集合

特点:
  • 有序List 保留元素的插入顺序,能够通过索引访问元素。
  • 允许重复List 可以包含重复的元素。
  • 常见实现类ArrayListLinkedListVector
创建方式:
List<String> arrayList = new ArrayList<>();  // 动态数组实现
List<String> linkedList = new LinkedList<>();  // 链表实现
遍历方式:
  • 1. for 循环
for (int i = 0; i < arrayList.size(); i++) {
    System.out.println(arrayList.get(i));
}
  • 2. 增强 for 循环
for (String item : arrayList) {
    System.out.println(item);
}
  • 3. 使用迭代器
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
  • 4. Lambda 表达式 (JDK 8)
arrayList.forEach(item -> System.out.println(item));
适用场景:
  • 需要按顺序访问元素,并且可能有重复元素的场景(如队列、购物车等)。

2. Set 集合

特点:
  • 无序Set 不保证元素的顺序(LinkedHashSet 除外)。
  • 不允许重复Set 中不能包含重复的元素。
  • 常见实现类HashSetLinkedHashSetTreeSet
创建方式:
Set<String> hashSet = new HashSet<>();  // 无序,基于哈希表
Set<String> linkedHashSet = new LinkedHashSet<>();  // 有序,基于链表
Set<String> treeSet = new TreeSet<>();  // 有序,基于红黑树
遍历方式:
  • 1. 增强 for 循环
for (String item : hashSet) {
    System.out.println(item);
}
  • 2. 使用迭代器
Iterator<String> iterator = hashSet.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
  • 3. Lambda 表达式 (JDK 8)
hashSet.forEach(item -> System.out.println(item));
适用场景:
  • 需要确保元素唯一性,并且不关心元素顺序的场景(如去重操作、集合运算等)。

3. Map 集合

特点:
  • 键值对存储Map 存储的是键值对 (key-value),每个键唯一。
  • 键不允许重复,但值可以重复。
  • 常见实现类HashMapLinkedHashMapTreeMap
创建方式:
Map<String, Integer> hashMap = new HashMap<>();  // 无序,基于哈希表
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();  // 有序,基于链表
Map<String, Integer> treeMap = new TreeMap<>();  // 按照键排序,基于红黑树
遍历方式:
  • 1. 遍历键集合
for (String key : hashMap.keySet()) {
    System.out.println(key + " = " + hashMap.get(key));
}
  • 2. 遍历键值对
for (Map.Entry<String, Integer> entry : hashMap.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}
  • 3. Lambda 表达式 (JDK 8)
hashMap.forEach((key, value) -> System.out.println(key + " = " + value));
适用场景:
  • 需要根据键快速查找对应值的场景(如缓存、字典、配置文件等)。

集合排序:使用 Collections 实现排序

在 Java 中,Collections 工具类提供了对集合进行排序的方法。通常我们可以对 List 集合进行排序,因为 SetMap 本身没有明确的顺序,且 Set 可能需要使用 TreeSet 来实现排序。

List 集合进行排序:

1. 自然排序(元素需要实现 Comparable 接口):

List<String> list = new ArrayList<>(Arrays.asList("Banana", "Apple", "Orange"));
Collections.sort(list);  // 自然顺序(字母序)
System.out.println(list);  // 输出: [Apple, Banana, Orange]

2. 使用 Comparator 进行自定义排序:

List<String> list = new ArrayList<>(Arrays.asList("Banana", "Apple", "Orange"));
Collections.sort(list, (a, b) -> b.compareTo(a));  // 逆序排序
System.out.println(list);  // 输出: [Orange, Banana, Apple]
Set 集合进行排序:

Set 集合通常需要使用 TreeSet 进行排序,TreeSet 自动对元素进行排序。

Set<String> treeSet = new TreeSet<>(Arrays.asList("Banana", "Apple", "Orange"));
System.out.println(treeSet);  // 输出: [Apple, Banana, Orange] (按自然顺序)
Map 集合进行排序:

Map 集合的排序可以通过 TreeMap 按键排序,或者通过 CollectionsentrySet 进行排序。

1. 使用 TreeMap 按键排序:

Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Banana", 2);
treeMap.put("Apple", 3);
treeMap.put("Orange", 1);
System.out.println(treeMap);  // 输出: {Apple=3, Banana=2, Orange=1} (按键排序)

2. 使用 CollectionsHashMap 进行排序:

Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Banana", 2);
hashMap.put("Apple", 3);
hashMap.put("Orange", 1);

// 将 entrySet 转换为 List,并排序
List<Map.Entry<String, Integer>> list = new ArrayList<>(hashMap.entrySet());
list.sort(Map.Entry.comparingByKey());  // 按键排序
System.out.println(list);  // 输出: [Apple=3, Banana=2, Orange=1]

总结:

  • List:有序且允许重复,适用于需要按顺序存储和访问的场景。
  • Set:无序且不允许重复,适用于去重的场景。
  • Map:键值对存储,键不允许重复,适用于快速查找键对应值的场景。
  • 排序:使用 Collections.sort()List 进行排序,TreeSetTreeMap 提供自动排序。

http://www.kler.cn/news/365969.html

相关文章:

  • Golang | Leetcode Golang题解之第503题下一个更大元素II
  • java脚手架系列10-统一缓存、分布式锁
  • 设计师的新宠:7款不容错过的界面设计软件
  • 飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净
  • ASP.NET MVC-font awesome-localhost可用IIS不可用
  • 求刚体移动后的转换矩阵
  • flask服务通过gunicorn启动
  • 深度学习模型入门教程:从基础到应用
  • Debian及其衍生系统安装Python
  • 「AIGC」n8n AI Agent开源的工作流自动化工具
  • C++学习,标准库 <climits>
  • LLM | 论文精读 | 基于大型语言模型的自主代理综述
  • 整合全文检索引擎 Lucene 添加站内搜索子模块
  • pytorh学习笔记——cifar10(四)用VGG训练
  • 【TabBar嵌套Navigation案例-常见问题按钮-获取数据 Objective-C语言】
  • Mysql主主互备配置
  • 全球著名哲学家思想家起名大师颜廷利:爱屋及乌背后的教育意义
  • 等保测评的主要内容
  • React 前端框架概述
  • 如何预防数据打架?数据仓库如何保持指标数据一致性开发指南(持续更新)
  • 短视频矩阵系统源码开发优势,短视频矩阵系统oem部署
  • 使用铭文思路对智能合约改进
  • 嵌入式开发--STM32用HAL库硬件I2C读取MPU6050的数据
  • React18-useEffect函数
  • mfc之tab标签控件的使用--附TabSheet源码
  • 在SpringBoot项目中利用Redis实现防止订单重复提交