Java 集合框架总览

总览图

以下是 Java 集合框架的uml类图: alt

实现类介绍

以下是 Java 集合框架中一些常见实现类的特点和实现原理:

1. ArrayList

  • 特点
    • 动态数组:它是基于动态数组实现的,支持随机访问,通过索引可以快速定位元素,时间复杂度为
    • 可扩容:当数组空间不足时,会自动进行扩容操作,一般是扩容为原来容量的 1.5 倍。
    • 有序性:元素按照插入顺序排列。
    • 允许重复元素和 null
  • 实现原理
    • 内部维护一个 Object 类型的数组,当添加元素时,如果数组容量不足,会创建一个新的更大的数组,并将原数组中的元素复制到新数组中。
    • 随机访问时,直接根据索引访问数组对应位置的元素。

2. LinkedList

  • 特点
    • 双向链表:基于双向链表实现,插入和删除操作效率较高,特别是在链表头部和尾部进行操作,时间复杂度为
    • 不支持随机访问:随机访问元素时,需要从头或尾开始遍历链表,时间复杂度为
    • 有序性:元素按照插入顺序排列。
    • 允许重复元素和 null
  • 实现原理
    • 内部维护了一个双向链表,每个节点包含数据、指向前一个节点的引用和指向后一个节点的引用。
    • 插入和删除操作只需要修改相邻节点的引用关系。

3. Vector

  • 特点
    • 动态数组:和 ArrayList 类似,也是基于动态数组实现的。
    • 线程安全:它的大部分方法都使用了 synchronized 关键字进行同步,保证在多线程环境下的线程安全,但这也导致了性能开销较大。
    • 可扩容:当数组空间不足时,会自动进行扩容操作,默认扩容为原来容量的 2 倍。
    • 有序性:元素按照插入顺序排列。
    • 允许重复元素和 null
  • 实现原理
    • 内部维护一个 Object 类型的数组,和 ArrayList 扩容机制类似,但扩容倍数不同。
    • 方法使用 synchronized 进行同步,保证线程安全。

4. Stack

  • 特点
    • 后进先出(LIFO):继承自 Vector,遵循后进先出的原则,支持 push(入栈)、pop(出栈)、peek(查看栈顶元素)等操作。
    • 线程安全:由于继承自 Vector,所以也是线程安全的。
  • 实现原理
    • 基于 Vector 实现,通过调用 Vector 的方法来实现栈的操作,例如 push 方法调用 addElement 方法,pop 方法调用 removeElementAt 方法。

5. HashSet

  • 特点
    • 无序性:不保证元素的插入顺序,元素的存储顺序是由哈希值决定的。
    • 唯一性:不允许存储重复元素,通过元素的 hashCode()equals() 方法来判断元素是否重复。
    • 允许 null:但只能有一个 null 值。
  • 实现原理
    • 内部基于 HashMap 实现,HashSet 中的元素实际上是存储在 HashMap 的键中,HashMap 的值统一为一个静态的 Object 对象。
    • 插入元素时,先计算元素的哈希值,根据哈希值找到对应的桶位置,如果桶为空,则直接插入;如果桶不为空,则通过 equals() 方法比较元素是否重复,不重复则插入。

6. TreeSet

  • 特点
    • 有序性:根据元素的自然顺序或指定的比较器进行排序,元素会按照排序后的顺序存储。
    • 唯一性:不允许存储重复元素,通过元素的比较结果来判断元素是否重复。
    • 不允许 null:因为需要对元素进行比较排序。
  • 实现原理
    • 内部基于 TreeMap 实现,TreeSet 中的元素实际上是存储在 TreeMap 的键中,TreeMap 的值统一为一个静态的 Object 对象。
    • TreeMap 基于红黑树实现,插入元素时,会根据元素的比较结果将元素插入到红黑树的合适位置,保证树的平衡和有序性。

7. LinkedHashSet

  • 特点
    • 有序性:保证元素的插入顺序,即元素按照插入的先后顺序存储。
    • 唯一性:不允许存储重复元素,通过元素的 hashCode()equals() 方法来判断元素是否重复。
    • 允许 null:但只能有一个 null 值。
  • 实现原理
    • 内部基于 LinkedHashMap 实现,LinkedHashSet 中的元素实际上是存储在 LinkedHashMap 的键中,LinkedHashMap 的值统一为一个静态的 Object 对象。
    • LinkedHashMap 维护了一个双向链表,用于记录元素的插入顺序。

8. HashMap

  • 特点
    • 键值对存储:以键值对(key - value)的形式存储数据,每个键是唯一的。
    • 无序性:不保证元素的插入顺序,元素的存储顺序是由键的哈希值决定的。
    • 允许 null 键和 null:但 null 键只能有一个。
  • 实现原理
    • 内部基于哈希表实现,哈希表是一个数组,数组的每个元素是一个链表或红黑树(当链表长度超过 8 且数组长度大于 64 时,链表会转换为红黑树)。
    • 插入元素时,先计算键的哈希值,根据哈希值找到对应的桶位置,如果桶为空,则直接插入;如果桶不为空,则遍历链表或红黑树,通过 equals() 方法比较键是否重复,不重复则插入。

9. TreeMap

  • 特点
    • 键值对存储:以键值对(key - value)的形式存储数据,每个键是唯一的。
    • 有序性:根据键的自然顺序或指定的比较器进行排序,键会按照排序后的顺序存储。
    • 不允许 null:因为需要对键进行比较排序。
  • 实现原理
    • 内部基于红黑树实现,红黑树是一种自平衡的二叉搜索树。
    • 插入元素时,根据键的比较结果将元素插入到红黑树的合适位置,保证树的平衡和有序性。

10. LinkedHashMap

  • 特点
    • 键值对存储:以键值对(key - value)的形式存储数据,每个键是唯一的。
    • 有序性:可以保持插入顺序或访问顺序,当 accessOrderfalse 时,按照插入顺序;为 true 时,按照访问顺序(每次访问元素后,该元素会被移动到链表尾部)。
    • 允许 null 键和 null:但 null 键只能有一个。
  • 实现原理
    • 内部基于哈希表和双向链表实现,哈希表用于快速查找键值对,双向链表用于记录元素的顺序。
    • 插入元素时,先计算键的哈希值,根据哈希值找到对应的桶位置,如果桶为空,则直接插入;如果桶不为空,则遍历链表或红黑树,通过 equals() 方法比较键是否重复,不重复则插入,并更新双向链表的顺序。

11. Hashtable

  • 特点
    • 键值对存储:以键值对(key - value)的形式存储数据,每个键是唯一的。
    • 线程安全:它的大部分方法都使用了 synchronized 关键字进行同步,保证在多线程环境下的线程安全,但这也导致了性能开销较大。
    • 不允许 null 键和 null
  • 实现原理
    • 内部基于哈希表实现,和 HashMap 类似,但方法使用 synchronized 进行同步,保证线程安全。

12. WeakHashMap

  • 特点
    • 键值对存储:以键值对(key - value)的形式存储数据,每个键是唯一的。
    • 弱引用键:键是使用弱引用存储的,当键所引用的对象被垃圾回收时,对应的键值对会自动从 WeakHashMap 中移除。
    • 允许 null 键和 null:但 null 键只能有一个。
  • 实现原理
    • 内部基于哈希表实现,键使用 WeakReference 进行包装,当键所引用的对象被垃圾回收时,WeakReference 会被加入到引用队列中,WeakHashMap 会定期检查引用队列,将对应的键值对从哈希表中移除。

13. Properties

  • 特点
    • 键值对存储:继承自 Hashtable,以键值对(key - value)的形式存储数据,键和值都是 String 类型。
    • 常用于配置文件:可以方便地从文件中加载配置信息,也可以将配置信息保存到文件中。
  • 实现原理
    • 基于 Hashtable 实现,提供了一些方便的方法来处理 String 类型的键和值,例如 load 方法用于从文件中加载配置信息,store 方法用于将配置信息保存到文件中。
Java集合框架 文章被收录于专栏

Java集合框架是Java提供的一组用于存储和操作数据的类和接口,它位于java.util包中,为开发者提供了强大且灵活的数据存储和处理能力。以下将从整体架构、主要接口、常用实现类、使用场景以及示例代码等方面详细介绍Java集合框架。

全部评论
点赞 回复 分享
发布于 03-30 18:00 北京

相关推荐

04-08 20:18
已编辑
苏州大学 数据仓库
点赞 评论 收藏
分享
一面 2025.4.7记得不是太清楚了(时间大概在40分钟左右)1. MySQL的引擎有哪些?它们有什么区别?2.Java的反射机制是什么?应用在什么地方?3.大数据引擎有哪些?4.场景题:计算用户日活,从数据设计、数据获取、数据处理、数据可视化的全流程。(在这个场景的基础上写SQL计算日活和计算留存率,问了一些时区相关的问题,转时区)5.场景题:大文件外部排序6.场景题:QPS面试体验:面试官人很好,如果有不太懂的概念还会解释一下-------------------------------------------------------------------------------------上午一面结束,下午就打电话约了二面二面 2025.4.8 (时间也差不多是40分钟左右)二面的内容主要是和项目相关,然后问了一些学习的课程,计算机基础相关的1.项目成员人数,整个流程的设计,技术选型什么的2.问了数据结构,说自己比较擅长的数据结构3.根据上面的数据结构,面试官出题,写代码4.问大数据专业课程相关,介绍一程上主要学习的内容,又详细地问了一些5.介绍一些Hadoop的组成,主要说了HDFS、YARN、MapReduce相关的内容面试体验:面试官人也很好,在后面的反问环节很详细地介绍公司大数据平台的组织架构,还说明了我在本次面试中有哪些薄弱的地方,需要进行加强。------------------------------------------------------------------------------------二面第二天下午接到了三面电话,约了下周一面试三面 4.13 (三面是主管面,时间差不多有二十分钟,主管比较忙)1.介绍项目,一个离线数仓项目2.数仓理论(数仓分层、为什么要分仓。感觉是对一二面不足的方面再了解一下)3.实时数仓的内容4.场景题:七日留存率,不要用JOIN,成本太大面试体验:感觉挺好的,主管应该也挺年轻的,没有被拷打的感觉,有回答不好的地方还会给出答案,又补充了对于这个职位的工作内容。------------------------------------------------------------------------------------四面 4.14 (四面是hr面,应该是常规问题)1.实习经历2.毕设进展3.求职城市,为什么要去这些地方4.为什么要做开发5.你认为做开发需要有哪些品质6.大学最有成就感的事……我记性不太好,问完就忘了面试体验:我有些太紧张了,前面三面抱着进不了也没关系的态度去面的,反倒比较从容,四面的时候就觉得进不了好可惜,很多问题都答得不太好。------------------------------------------------------------------------------------4.21 算是oc了吧,和hr联系了,进入了定薪阶段,希望明天能收到offer4.24 等offer审批,希望一切顺利,我进去了一定好好工作,做一个好牛马QAQ,我真的超级想去4.25 offer!!!!!!!!!!!!!!!!!!QAQ
等offer的萝卜:刚刚接到约三面的电话了,太好了!QAQ
查看22道真题和解析
点赞 评论 收藏
分享
接上篇。🗓微软-MAI-Software Engineer Intern2/6投递,2/14收到问卷,2/26面邀,3/11一面挂。微软面试流程和阿里国际相似,先把所有人放在大池子里进行一面,后续再根据面试表现及匹配度分配岗位的具体方向。由于投递的部门是MAI,所以面试官看重简历是否与AI强相关,包括论文科研等,Coding考察的是用栈实现队列,以及一道智力算法题。用栈实现队列基本ac,但是智力算法题没想出来。一面挂。🗓亚马逊○Business Intelligence Engineer Intern:2/7投递,2/10简历挂。○Software Dev Engineer Intern:2/7投递,2/11收到OA邀约,2/12完成OA,由于OA的Coding三题均只通过60%测试用例,2/14挂。○System Development Engineer Intern:2/7投递,2/14收到OA邀约,2/16完成OA,Coding全部AC,但是最后2/24挂,可能是因为workstyle部分与公司文化不匹配,亚马逊比较看重这个。🗓Shoppee-大数据开发工程师3/13投递,3/14笔试邀约,3/20笔试挂。笔试部分考察408,以及三道算法,一道SQL。算法题只通过60%,笔试挂。🗓阿里国际-Bravo102实习生计划3/29投递,3/31面邀+测评+笔试邀约,4/3一面。同上,阿里国际和微软面试流程相同,先进池子一面再细分,所以面试基本围绕简历进行,整体聊的比较好,但是由于本人乱做在线人才测评,后面撤回笔试,一面挂。#面经# #软件开发# #数据开发# #大学生实习#
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务