Java 集合框架:为什么说它是一座精心设计的“摩天大厦”?
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前序
诶,亲爱的码友们,你有没有在学习Java集合框架的时候,感觉自己像迷失在一座巨大的城市?什么List啊,Set啊,Map啊,一环扣一环,分分钟让人脑袋冒烟!
今天,就让我带你用一杯咖啡的时间,搞懂这个庞然大物的体系结构与设计理念,轻松拿捏,带着笑意继续优雅码代码~
前言:集合框架,凭什么这么重要?
当你还在写数组的时候,是不是偶尔会陷入这么个尴尬场景?
明明数组长度写死了,偏偏来了个加塞的客户需求;想插个元素?不好意思,全体元素得挪挪位。
要排序?自己来吧,没人管你。
要去重?更惨,还得靠自己撸算法……
所以,Java集合框架横空出世,犹如救世主般拯救了广大的程序猿,提供了一整套可扩展、可维护、效率优异的集合操作标准体系!
集合框架不仅帮我们优雅管理数据,还巧妙地封装了各种常用算法(比如排序、查找、去重),让开发效率嗖嗖嗖飞起~
一、Java 集合框架的体系结构
好啦,咱们言归正传,先来张总览图镇场子:
Collection (接口)
├── List (接口)
│ ├── ArrayList (实现类)
│ ├── LinkedList (实现类)
│ └── Vector (实现类)
├── Set (接口)
│ ├── HashSet (实现类)
│ ├── LinkedHashSet (实现类)
│ └── TreeSet (实现类,SortedSet子接口)
└── Queue (接口)
├── LinkedList (实现类)
├── PriorityQueue (实现类)
└── ArrayDeque (实现类)
Map (接口)
├── HashMap (实现类)
├── LinkedHashMap (实现类)
├── TreeMap (实现类)
└── Hashtable (实现类)
怎么样,看着是不是像一棵郁郁葱葱的大树?枝繁叶茂,各司其职!
而在Java中,集合框架大体上被划分为两大派系:
- Collection接口家族(负责存放一组元素)
- Map接口家族(负责存放一组键值对)
别小看这区区两派,它们底下可是各自开枝散叶,坐拥无数小弟(实现类),各自打理着不同的地盘。
二、设计理念:接口为王,松耦合至上!
想象一下,如果集合框架是座大厦,那接口就是大厦的钢筋水泥,实现类则是那些闪闪发光的玻璃外墙。
设计者们(膜拜Sun大神们)在搭建Java集合框架时遵循了几个核心理念:
1. 基于接口编程
一句话总结:面向接口,不要面向实现。
举个简单例子:
List<String> list = new ArrayList<>();
你有没有发现?变量声明的是List
,而不是具体的ArrayList
!
这就是接口编程的体现。写代码时依赖接口,切换实现类时只改实例化部分,代码扩展性up up up!
2. 降低耦合度
接口和实现解耦,意味着:
- 想换种数据结构?简单!
- 想优化性能?easy!
- 兼容新版本?稳了!
3. 遵循统一标准
不论你用的是ArrayList
、LinkedList
、HashSet
还是TreeMap
,增删改查的方法(比如add
、remove
、get
)大致类似。
统一标准化API极大降低了学习成本和使用难度。
三、各类集合的特点和使用场景(附案例)
来!这里我带你快速过一遍主要集合类的特性和最佳使用场景,并给出实战案例,让理论落地!
1. List —— 有序可重复
- ArrayList:底层数组,查询快,增删慢。
- LinkedList:底层链表,增删快,查询慢。
- Vector:线程安全的ArrayList(但过时了,不推荐了)。
使用场景:需要频繁查询元素时,用ArrayList
;需要频繁插入删除元素时,用LinkedList
。
栗子:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
for (String name : names) {
System.out.println(name);
}
2. Set —— 无序且唯一
- HashSet:基于哈希表,元素无序,查询超快。
- LinkedHashSet:有序版的HashSet。
- TreeSet:基于红黑树,自动排序。
使用场景:需要去重?来Set!
栗子:
Set<String> emails = new HashSet<>();
emails.add("a@example.com");
emails.add("b@example.com");
emails.add("a@example.com"); // 重复,不会被添加!
System.out.println(emails);
3. Map —— 键值对存储
- HashMap:最快,允许null键null值。
- LinkedHashMap:有序版HashMap。
- TreeMap:基于红黑树,自动排序。
- Hashtable:线程安全的HashMap(也是老古董了,pass)。
使用场景:要映射关系?搞定键值对?那必须得用Map!
栗子:
Map<String, Integer> scores = new HashMap<>();
scores.put("Alice", 90);
scores.put("Bob", 85);
System.out.println(scores.get("Alice")); // 输出 90
四、集合框架中的设计小心思
除了基本结构,Java集合框架还藏了不少“小机灵”设计,比如:
-
fail-fast机制
集合在遍历过程中如果结构被修改,会立刻抛出ConcurrentModificationException
。
(小声提醒:用Iterator
遍历时不要动手改集合,真心容易踩坑。) -
线程安全集合
Collections.synchronizedList(new ArrayList<>())
可以让你的List线程安全,但性能略有牺牲。 -
不可变集合
Java 9起支持List.of()
、Set.of()
,一行搞定不可变集合,爽爆了!
List<String> immutableList = List.of("a", "b", "c");
// immutableList.add("d"); // 会抛异常哦~
五、总结:集合框架到底想教会我们什么?
- 学会基于接口编程,代码更灵活;
- 理解不同集合类的底层原理与特点,用对场景;
- 善用标准API,提高开发效率;
- 小心隐藏的陷阱,比如fail-fast机制、并发修改问题;
- 紧跟Java新特性,提升集合操作的优雅度。
走过集合框架这片森林,你会发现,每一棵树、每一朵花都有它存在的意义,每一行代码也能变得更加顺滑自然。
小彩蛋时间
你知道吗?其实
HashMap
的“负载因子”和“扩容机制”才是它性能好坏的秘密武器!想要深入挖一挖内部工作原理的话,记得告诉我,我可以单独开一篇带你深扒它的小心脏~
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 随机文章
- 热门文章
- 热评文章
- 探索门萨智力测试题:智商140的天才与万分之一的奥秘门萨智商测试60题
- 儿童智力筛查测验:评估与促进儿童智力发展的科学方法儿童智力检测怎么做
- 广东外语艺术职业学院普通话测试指南广东外语艺术职业学院普通话证
- 生辰八字与名字打分:探索姓名学与命理学的交汇点
- 六年级数学练习与测试:提升解题技巧与数学思维六年级数练答案零五网
- 【详解】@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案
- 免费测你的性格像《怪你过分美丽》中的谁
- 测你的性格像《且听凤鸣》中的谁
- 智能未来不是梦:openEuler如何撑起AI的半边天?【华为根技术】