面试突击:Java 集合知识体系梳理

本文已收录于:https://github.com/danmuking/all-in-one(持续更新)

前言

哈喽,大家好,我是 DanMu。在 Java 开发中,集合类对象绝对是被使用最频繁的对象之一。因此,深入了解集合类对象的底层数据结构和原理,选择合适的集合类型能够极大程度上的影响程序的性能。在本文中,将先对 Java 中的集合类对象做一个整体的梳理,在后续文章中对重要的集合对象进行具体分析。

知识体系


在 Java 的集合体系中,由两个主要的根接口,Collection 和 Map,并再次基础上衍生出若干种不同的集合类型。

Java 集合体系的演变

实际上,在 Java 开发之初,还没有集合的概念。在 JDK 1.2 之前,Java 的标准容器是 Arrays、Vectors和 Hashtables。所有这些集合都没有通用接口。因此,它们都作为 Java 存放对象的容器,但所有这些集合的实现都是独立定义的,彼此之间没有关联。这导致使用者需要单独记忆不同容器的不同方法,比如下面这个例子:

class CollectionDemo {public static void main(String[] args){// Creating instances of the array,// vector and hashtableint arr[] = new int[] { 1, 2, 3, 4 };Vector<Integer> v = new Vector();Hashtable<Integer, String> h = new Hashtable();// Adding the elements into the// vectorv.addElement(1);v.addElement(2);// Adding the element into the// hashtableh.put(1, "hi");h.put(2, "hi");// Array instance creation requires [],// while Vector and hastable require ()// Vector element insertion requires addElement(),// but hashtable element insertion requires put()// Accessing the first element of the// array, vector and hashtableSystem.out.println(arr[0]);System.out.println(v.elementAt(0));System.out.println(h.get(1));// Array elements are accessed using [],// vector elements using elementAt()// and hashtable elements using get()}
}

上面这些集合(Array、Vector 和 Hashtable)没有统一的标准方法,我们很难编写适用于所有类型集合的算法。并且大多数 Vector 类都被 final 修饰,这意味着不能通过扩展 Vector 类来实现额外的功能。因此在 JDK 1.2 版本中引入了全新设计的集合框架(Collection Framework),其中原有的方法虽然得到了保留,但是大部分已经不被使用。

Collection

容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 以<Key, Value> 的形式存储着键值对(两个对象)的映射表。

List

ArrayList

底层基于数组实现,在容量不足时可以实现自动扩容,并且支持随机访问。

Vector

和 ArrayList 类似,但它是线程安全的,现在几乎已经废弃。

LinkedList

基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。并且 LinkedList 还实现了栈、队列和双向队列的接口。

Queue

LinkedList

可以用它来实现双向队列的链表形式实现。

PriorityQueue

优先级队列,基于堆结构实现,可以用它来实现大/小顶堆。

Set

HashSet

基于 HashMap 实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。

TreeSet

基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。

LinkedHashSet

具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。

Map

HashMap

基于哈希表实现。

TreeMap

基于红黑树实现。

HashTable

和 HashMap 类似,但它是线程安全的,但是其性能远远低于 ConcurrentHashMap,已经废弃。

LinkedHashMap

使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

ConcurrentHashMap

严格来说,ConcurrentHashMap 属于java.util.concurrent中得到实现,但是它常常与 HashMap 进行对比,因此把它也加入这里。ConcurrentHashMap 具有和 HashMap 相同的功能,但是提供了线程安全的实现。

# 点关注,不迷路
> 好了,以上就是这篇文章的全部内容了,如果你能看到这里,**非常感谢你的支持!**
> 如果你觉得这篇文章写的还不错, 求**点赞**👍 求**关注**❤️ 求**分享**👥 对暖男我来说真的 **非常有用!!!**
> 白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
> 如果本篇博客有任何错误,请批评指教,不胜感激 !> 最后推荐我的**IM项目DiTing**([https://github.com/danmuking/DiTing-Go](https://github.com/danmuking/DiTing-Go)),致力于成为一个初学者友好、易于上手的 IM 解决方案,希望能给你的学习、面试带来一点帮助,如果人才你喜欢,给个Star⭐叭!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

World of Warcraft T2.5

World of Warcraft T2.5 猎人和术士套装需要的材料&#xff0c;好多啊&#xff0c;废墟和神殿打材料 猎人&#xff1a; 术士&#xff1a;

k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录 zookeeper什么是zookeeper基本概念主要功能工作原理使用场景优点缺点 k8s集群部署zookeeper环境一、zookeeper部署YAML资源清单准备二、zookeeper部署及部署验证三、zookeeper应用验证 zookeeper 什么是zookeeper ZooKeeper 是一个开源的分布式协调服务&#xff0c;…

多线程(基础)

前言&#x1f440;~ 上一章我们介绍了什么是进程&#xff0c;对于进程就了解那么多即可&#xff0c;我们作为java程序员更关注线程&#xff0c;线程内容比较多&#xff0c;所以我们要分好几部分才能讲完 目录 进程的缺点 多线程&#xff08;重要&#xff09; 进程和线程的区…

数据结构速成--树和二叉树

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 气死了…

昇思25天学习打卡营第4天|数据集Dataset

数据集 Dataset 介绍 之前说过&#xff0c;MindSpore是基于Pipeline&#xff0c;通过Dataset和Transformer进行数据处理。Dataset在其中是用来加载原始数据的。mindSpore提供了数据集加载接口&#xff0c;可以加载文本、图像、音频等&#xff0c;同时也可以自定义加载接口。此…

乾坤微服务的使用

前言&#xff1a; 在这里整理下用乾坤来开发微服务的一些资料。 使用好处&#xff1a; 使用乾坤可以实现什么效果呢&#xff1f;众所周知&#xff0c;前端的框架五花八门&#xff0c;react/vue/angular等各领风骚&#xff0c;那么如果我们有需要把不同技术栈的项目整合起来&…

Vue3学习笔记<->创建第一个vue项目

新建一个项目目录 找一个盘新建一个目录&#xff0c;我这里在D盘创建一个vuedemo目录作为项目存放的目录。使用idea打开目录。   单击ieda底部的按钮“Terminal”&#xff0c;打开命令行窗口&#xff0c;如果命令行窗口当前目录不是“vuedemo”&#xff0c;就切换到“vuedem…

文本分类-RNN-LSTM

1.前言 本节介绍RNN和LSTM&#xff0c;并采用它们在电影评论数据集上实现文本分类&#xff0c;会涉及以下几个知识点。 1. 词表构建&#xff1a;包括数据清洗&#xff0c;词频统计&#xff0c;词频截断&#xff0c;词表构建。 2. 预训练词向量应用&#xff1a;下载并加载Glove的…

Vue2 - 首页登录实现随机验证码组件的封装与实现详解(详细的注释及常见问题汇总)

在网站首页等登录时,随机验证码在现代网络应用中扮演着重要的安全角色。为了帮助开发者轻松集成和使用随机验证码功能,本文将介绍如何利用 Vue.js 2 封装一个简单而功能强大的随机验证码组件。让你能够快速理解并应用这一组件到你的项目中。 一、解决方案 本文提供了完美便捷…

上海计算机考研避雷,25考研慎报

上大计算机一直很热 408考研er重来没有让我失望过&#xff0c;现在上大的专业课是11408&#xff0c;按理说&#xff0c;这个专业课的难度是很高的&#xff0c;但是408er给卷出了新高度&#xff0c;大家可以去上大官网看看今年最新的数据&#xff0c;我也帮大家统计了24年最新的…

Redis集群(Clustering in Redis)工作机制详解

Redis集群工作机制详解 Redis 集群是用于提高 Redis 可扩展性和高可用性的解决方案。 维基百科&#xff1a;Scalability is the property of a system to handle a growing amount of work by adding resources to the system. 可扩展性是系统的一种允许通过增加系统资源来处…

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识&#xff0c;本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点&#xff1a; 第36练&#xff1a;鼠标击中测试1 第37练&#xff1a;鼠标击中测试2—增加键盘接口 第38练&#xff1a;鼠标击中测试3—子窗口 第39练&…

Linux Static calls机制

文章目录 前言一、简介二、Background: indirect calls, Spectre, and retpolines2.1 Indirect calls2.2 Spectre (v2)2.3 RetpolinesConsequences 2.4 Static callsHow it works 三、其他参考资料 前言 Linux内核5.10内核版本引入新特性&#xff1a;Static calls。 Static c…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 &#xff08;1&#xff09;第一轮测试中执行了个20个测试用例&#xff0c;通过16个&#xff0c;失败4个&#xff0c;其中属于严重缺陷的1个&#xff0c;属于一般缺陷的3个。 &#xff08;2&am…

Spark SQL 的总体工作流程

Spark SQL 是 Apache Spark 的一个模块,它提供了处理结构化和半结构化数据的能力。通过 Spark SQL,用户可以使用 SQL 语言或 DataFrame API 来执行数据查询和分析。这个模块允许开发者将 SQL 查询与 Spark 的数据处理能力结合起来,实现高效、优化的数据处理。下面是 Spark S…

Spring Boot中实现定时任务最常用的方法 @Scheduled 注解和 TaskScheduler 接口【包含详情代码】

Spring Boot中实现定时任务最常用的方法 Scheduled 注解和 TaskScheduler 接口【包含详情代码】 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中………

CogMG:用大模型解决知识图谱覆盖不足的问题

CogMG&#xff1a;用大模型解决知识图谱覆盖不足的问题 提出背景知识图谱的作用知识覆盖不完整知识更新不对齐 显式分解知识三元组和补全检索增强生成&#xff08;RAG&#xff09;和知识更新 框架设计1. 查询知识图谱2. 处理结果3. 知识图谱演化 CogMG 实现3.1 模型和组件问题分…

.NET 漏洞分析 | 某ERP系统存在SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

c++智能指针shared_ptr

文章目录 概念1.shared_ptr1.基本使用2.如何获取原始指针3. 指定删除器 2 使用shared_ptr要注意的问题2.1不要用一个原始指针初始化多个shared_ptr2.2. 避免循环引用 小结 概念 C程序设计中使用堆内存是非常频繁的操作&#xff0c;堆内存的申请和释放都由程序员自己管理。内存…

安装 Docker 环境(通过云平台创建一个实例实现)

目录 1. 删除原有 yum 2. 手动配置 yum 源 3. 删除防火墙规则 4. 保存防火墙配置 5. 修改系统内核。打开内核转发功能。 6. 安装 Docker 7. 设置本地镜像仓库 8.重启服务 1. 删除原有 yum rm -rfv /etc/yum.repos.d/* 2. 手动配置 yum 源 使用 centos7-1511.iso 和 Xi…