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

Java核心技术【十八】Java集合框架精讲:List、Set、Map

Java集合框架精讲:List、Set、Map的使用详解与代码示例

Java集合框架是Java编程中不可或缺的一部分,它提供了一系列容器类,用于存储和操作不同类型的数据集。在Java集合框架中,ListSetMap是最常用的三种集合类型,它们各自具有独特的特性和使用场景。本文将详细介绍这三种集合的特性和使用场景,并通过代码示例帮助你更好地理解它们的运作机制,同时对比它们在不同场景下的适用性。

一、List:有序且允许重复的集合

List是一种有序的集合,它允许元素重复,并且可以保持元素的插入顺序。List的主要实现类包括ArrayListLinkedList

1. ArrayList

ArrayList是基于动态数组实现的List,它提供了随机访问元素的能力,适用于需要频繁访问元素但较少修改元素的场景。

1.1 特点

  • 基于动态数组实现,提供了随机访问元素的能力。
  • 在数组末尾添加元素效率较高,但在数组中间插入或删除元素效率较低,因为需要移动大量元素。
  • 元素是有序的,且可以包含重复元素。

1.2 适用场景

  • 当你需要频繁访问集合中的元素时,ArrayList是不错的选择。
  • 如果集合的大小已知或接近最终大小,使用ArrayList可以避免多次扩容带来的性能损耗。
  • 不适合需要频繁在集合中间进行插入或删除操作的场景。

1.3 代码示例

package java_core_18;
import java.util.List;
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");System.out.println("List: " + list);System.out.println("List中的第一个元素: " + list.get(1));}}

1.4 运行结果

List: [Apple, Banana, Cherry]
List中的第一个元素: Banana

2. LinkedList

LinkedList是基于双向链表实现的List,它在元素的添加和删除操作上表现更优,适用于需要频繁修改元素的场景,尤其是在集合头部或尾部进行操作。

2.1 特点:

  • 基于双向链表实现,适合在集合的任意位置插入或删除元素。
  • 随机访问元素效率较低,因为需要从头遍历链表。
  • 元素是有序的,且可以包含重复元素。

2.2 适用场景:

  • 当你需要频繁在集合的任意位置进行插入或删除操作时,LinkedList是一个好的选择。
  • 如果集合中元素的访问主要是通过迭代器进行的,LinkedList可以提供较好的性能。
  • 不适合需要频繁随机访问元素的场景。

2.3 示例代码

package java_core_18;
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {List<String> list = new LinkedList<>();list.add("Apple");list.add("Banana");list.add("Cherry");System.out.println("List: " + list);list.remove(1); // 从list中删除 "Banana"元素System.out.println("新的 List: " + list);}}

2.4 运行结果

List: [Apple, Banana, Cherry]
新的 List: [Apple, Cherry]

二、Set:无序且不允许重复的集合

Set是一种不允许元素重复的集合,它不保证元素的顺序。Set的主要实现类包括HashSetTreeSet

1. HashSet

HashSet是基于哈希表实现的Set,它提供了较快的添加和查找速度,但元素的顺序是不确定的。HashSet适用于需要快速查找元素的场景。

1.1 特点

  • HashSet是基于HashMap实现的,底层使用HashMap来存储元素,因此元素是无序的。
  • 不允许重复元素,通过equals()hashCode() 方法来判断元素的相等性。
  • 提供了常数时间复杂度 (算法的执行时间是常量,不随输入规模的增加而增加) 的添加、删除和查找操作。

1.2 适用场景

  • 当你需要存储一个元素集合,且需要快速判断元素是否存在集合中时,HashSet是一个很好的选择。
  • 如果集合中的元素需要唯一性,并且元素的顺序不重要,使用HashSet可以提供高效的元素管理和查找。
  • 适合需要快速添加和删除元素的场景,特别是在处理大数据量时,HashSet的性能优势明显。

1.3 示例代码

package java_core_18;import java.util.HashSet;
import java.util.Set;public class HashSetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("Apple");set.add("Banana");set.add("Apple"); //无法添加成功System.out.println("Set: " + set);}
}

1.4 运行结果

Set: [Apple, Banana]

2. TreeSet

TreeSet是基于红黑树实现的Set,它保证元素的自然排序或自定义排序,适用于需要排序的场景,例如存储唯一且需要排序的元素集合。

2.1 特点

  • 基于红黑树实现,保证了元素的自然排序或自定义排序。
  • 元素是无序的(从客户端角度看),但从内部实现上看,元素按照排序规则存储。
  • 不允许重复元素。

2.2 适用场景

  • 当你需要存储一个元素集合,并且需要这些元素自动排序时,使用TreeSet
  • 如果集合中的元素需要唯一性,并且排序是必要的,TreeSet是一个理想的选择。
  • 不适合需要频繁随机访问元素的场景,虽然TreeSet提供了对数时间复杂度的查找,但相比ArrayList的随机访问还是较慢。

2.3 代码示例

package java_core_18;import java.util.TreeSet;
import java.util.Set;public class TreeSetExample {public static void main(String[] args) {Set<String> set = new TreeSet<>();set.add("Banana");set.add("Apple");set.add("Cherry");System.out.println("排序Set: " + set);}
}

2.4 执行结果

可以看到Set集合中自动根据元素的开头英文字母进行了排序:

排序Set: [Apple, Banana, Cherry]

三、Map:键值对集合

Map是一种将键映射到值的集合,每个键都是唯一的,且只能映射一个值。Map的主要实现类包括HashMapTreeMap

1. HashMap

HashMap是基于哈希表实现的Map,提供了快速的键值对添加和查找能力,但不保证键值对的顺序。适用于需要快速查找和插入键值对的场景。

1.1 特点:

  • HashMap是基于哈希表实现的键值对集合,提供了快速的键值对查找、插入和删除操作。
  • 键是唯一的,不允许重复,但值可以重复。
  • 提供了平均常数时间复杂度的键值对查找、插入和删除操作。

1.2 适用场景:

  • 当你需要存储键值对,且需要快速通过键来查找对应的值时,HashMap是一个理想的解决方案。
  • 如果键值对集合中的键需要唯一性,并且不需要排序,HashMap提供了高效的查找和插入性能。
  • 适合处理大量数据,特别是当键值对的数量很大时,HashMap的高性能查找可以显著提升应用的响应速度。

1.3 示例代码

package java_core_18;import java.util.HashMap;
import java.util.Map;public class HashMapExample {public static void main(String[] args) {Map<String, Integer> map = new HashMap<>();map.put("Apple", 1);map.put("Banana", 2);map.put("Cherry", 3);System.out.println("Map: " + map);System.out.println("Apple的值为: " + map.get("Apple"));}
}

1.4 运行结果

Map: {Apple=1, Cherry=3, Banana=2}
Apple的值为: 1

2. TreeMap

TreeMap是基于红黑树实现的Map,它保证键值对按照键的自然顺序或自定义排序,适用于需要排序的场景,例如存储需要按照一定顺序访问的键值对集合。

2.1 特点

  • 基于红黑树实现,保证了键值对按照键的自然排序或自定义排序。
  • 键是唯一的,不允许重复。
  • 提供了对数时间复杂度 (表示算法的运行时间随着输入规模n的增加而以对数的速度增长)的键值对查找、插入和删除操作。

2.2 适用场景

  • 当你需要存储键值对,并且需要这些键值对自动排序时,使用TreeMap
  • 如果键值对集合中的键需要唯一性,并且排序是必要的,TreeMap是一个理想的选择。
  • 不适合需要频繁随机访问键值对的场景,虽然TreeMap提供了对数时间复杂度的查找,但相比HashMap平均常数时间复杂度还是较慢。

2.3 代码示例

package java_core_18;import java.util.TreeMap;
import java.util.Map;public class TreeMapExample {public static void main(String[] args) {Map<String, Integer> map = new TreeMap<>();map.put("Banana", 2);map.put("Apple", 1);map.put("Cherry", 3);System.out.println("排序Map: " + map);}
}

2.4 执行结果

排序Map: {Apple=1, Banana=2, Cherry=3}

结束语

在Java中选择集合类型时,ArrayList适合随机访问和较少的中间插入删除;LinkedList适用于频繁的两端插入删除和迭代访问;HashSetHashMap提供快速的查找和不重复元素/键的存储,适合不需要排序的场景;而TreeSetTreeMap则保证了元素和键值对的排序,适合需要排序和唯一性的场景。选择时应综合考虑数据访问模式、操作需求、排序需求和性能要求,以达到最优的代码效率和可维护性。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。
源码地址:https://gitee.com/code-in-java/csdn-blog.git

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • disql使用
  • 白底图怎么拍?白底图一键生成!除了前期拍摄,主要少了专业软件
  • 使用requests爬取拉勾网python职位数据
  • go-redis源码解析:连接池原理
  • 请编写函数,判断一字符串是否是回文,若是回文函数返回值为1,否则返回值为0,回文是顺读和倒读都一样的字符串
  • 代码随想录算法训练营第30天 | 第八章 贪心算法05
  • kubernetes集群证书过期问题解决
  • 【二】Ubuntu24虚拟机在Mac OS的VMware Fusion下无法联网问题
  • C#用链表和数组分别实现堆栈
  • AE-图层
  • 数据泄露时代的安全之道:访问认证的重要性
  • [leetcode hot 150]第二十三题,合并K个升序链表
  • SMU Summer 2024 Contest Round 2
  • Redis 客户端命令大全
  • 力扣第一题
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Docker 笔记(2):Dockerfile
  • Git的一些常用操作
  • Gradle 5.0 正式版发布
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • js数组之filter
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python_网络编程
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • webpack+react项目初体验——记录我的webpack环境配置
  • webpack入门学习手记(二)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 技术发展面试
  • 每天一个设计模式之命令模式
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端临床手札——文件上传
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 手写一个CommonJS打包工具(一)
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我的zsh配置, 2019最新方案
  • 写代码的正确姿势
  • 怎么把视频里的音乐提取出来
  • 积累各种好的链接
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​比特币大跌的 2 个原因
  • ​浅谈 Linux 中的 core dump 分析方法
  • # C++之functional库用法整理
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #162 (Div. 2)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (接口自动化)Python3操作MySQL数据库
  • (转)Google的Objective-C编码规范