寒假第四天
本周的Java学习围绕集合框架展开,相较于基础语法的机械记忆,集合框架的学习更考验对数据结构和设计思想的理解,也让我意识到Java作为面向对象语言,在封装性和实用性上的严谨考量。
此前使用集合,多是依场景随手选用ArrayList、HashMap,只知其然却不知其所以然——比如遍历ArrayList时用for循环和迭代器的区别,HashMap为何能实现键值对的快速存取,这些问题在实际编码中偶尔遇到,却总因一知半解草草带过。本次系统梳理,先从集合的顶层接口入手,理清Collection和Map两大体系的核心差异:Collection专注于单个元素的存储,下分List(有序可重复)、Set(无序不可重复)、Queue(队列);Map则以键值对为存储单元,核心是键的唯一性,这也是两者设计逻辑的根本区别。
重点深究了ArrayList和LinkedList的底层实现与适用场景。通过查看源码片段和简单的性能测试发现,ArrayList基于动态数组实现,底层通过扩容机制(默认初始容量10,扩容为原容量1.5倍)解决数组固定长度的问题,因此随机访问(get/set方法)时效率更高,时间复杂度为O(1),但在中间插入或删除元素时,需要移动后续元素,效率较低,时间复杂度O(n);而LinkedList基于双向链表实现,每个节点存储元素和前后节点地址,插入、删除操作仅需修改节点引用,时间复杂度O(1),但随机访问时需要从头节点遍历,效率为O(n)。这也解释了为何日常开发中,查询多、增删少的场景优先用ArrayList,增删频繁、查询少的场景更适合LinkedList,而非盲目选用。
在Map体系的学习中,重点理解了HashMap的核心原理。它基于数组+链表+红黑树实现,通过哈希算法将键映射到数组的指定索引,当发生哈希冲突时,先以链表形式存储,当链表长度达到阈值(默认8)且数组容量达到64时,链表转为红黑树,以此提升查询效率。同时也注意到HashMap的非线程安全性,以及Hashtable、ConcurrentHashMap的线程安全实现方式差异——Hashtable通过给方法加synchronized实现全表锁,效率较低;ConcurrentHashMap则采用分段锁(JDK7)或CAS+Synchronized(JDK8),实现更细粒度的锁控制,兼顾线程安全和效率。

浙公网安备 33010602011771号