【集合篇】Java集合概述

Java 集合概述

集合与容器

  1. 容器(Container)是一个更广泛的术语,用于表示可以容纳、组织和管理其他对象的对象。它是一个更高层次的概念,包括集合(Collection)在内。
  2. 集合(Collection)是一种特定类型的容器,用于存储和操作一组对象。集合提供了对元素的添加、删除、查找和遍历等操作。List、Set、Queue 和 Map 都是集合的具体实现。

总结

  • 容器是一个广泛的概念,用于表示可以容纳和管理其他对象的对象。
  • 集合是容器的一种特定类型,用于存储和操作一组对象。

Java 集合框架如下图所示

image-20230411210606868

说说 List, Set, Queue, Map 四者的区别?

  • List(对付顺序的好帮手): 存储的元素是有序的、可重复的。(可以通过索引访问和修改元素)
  • Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。(无索引)
  • Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
  • Map(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x” 代表 key,“y” 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。

无序性和不可重复性的含义是什么

  • 无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。
  • 不可重复性是指添加的元素按照 equals() 判断时 ,返回 false,需要同时重写 equals() 方法和 hashCode() 方法。

集合框架底层数据结构常见实现类

1. List

  • ArrayListObject[] 数组
  • VectorObject[] 数组
  • LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)

2. Set

  • HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素

  • LinkedHashSet(有序,唯一): LinkedHashSetHashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的

  • TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)

    红黑树(Red-Black Tree)是一种自平衡的二叉查找树。它的特点是:每个节点要么是红色,要么是黑色;树的根节点是黑色的;所有叶子节点都是黑色的空节点(NIL节点);如果一个节点是红色的,则其子节点必须是黑色的;从根节点到叶子节点的所有路径上,不能有两个连续的红色节点;从任意一个节点到其子树中每个叶子节点的路径都包含相同数目的黑色节点。

3. Queue

  • PriorityQueue: Object[] 数组来实现二叉堆
  • ArrayQueue: Object[] 数组 + 双指针

再来看看 Map 接口下面的集合。

4. Map

  • HashMap: JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间

  • LinkedHashMap(有序的): LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。

  • Hashtable数组+链表组成的,数组是 Hashtable 的主体,链表则是主要为了解决哈希冲突而存在的

    HashTable 是线程安全的,而 HashMap 不是。在多线程环境下,使用 HashTable 可以避免数据竞争和并发访问的问题,但是对于单线程环境,使用 HashMap 可以提高性能

  • TreeMap: 红黑树(自平衡的排序二叉树)

哈希冲突

哈希冲突是指在哈希表中,不同的关键字(Key)通过哈希函数被映射到了同一个槽位(Bucket)中,导致同一个槽位中存储了多个关键字的情况。

当 HashMap 发生哈希冲突时,链表存储的是键值对(key-value pairs)。具体来说,链表中的每个元素包含一个键(key)和一个值(value)。所以,链表不仅存储元素本身,还包含键。

为什么链表可以解决哈希冲突(拉链法:数组+链表)

当一个桶中存储多个键值对时,可以将它们存储在一个链表中,每个节点存储一个键值对。当需要查找或删除某个键值对时,可以按照哈希函数的规则找到对应的桶,然后遍历链表中的节点,查找或删除目标键值对

哈希表是什么

哈希表(Hash Table),也称为散列表,是一种数据结构,用于实现关联数组(Associative Array)或映射(Map)等抽象数据类型。它通过将关键字映射到表中一个位置来访问记录,以加快查找的速度。哈希表实际上是一个数组,其中每个元素都是一个链表的头节点,每个链表中包含了哈希值相同的所有元素。 哈希表的基本思想是:将关键字通过哈希函数计算出一个哈希值,然后将该值作为数组的下标,将元素存储在对应的数组位置中。在查找元素时,通过哈希函数计算出关键字的哈希值,然后在对应的数组位置中查找元素。 哈希表的优点是查找速度快,时间复杂度为 O(1),而不像线性表的查找时间复杂度为 O(n)。但是,哈希表的缺点是空间利用率相对较低,因为需要预留足够的空间来存储哈希冲突的元素。此外,哈希表的性能还受到哈希函数的影响,如果哈希函数设计不好,可能会导致哈希冲突率过高,降低哈希表的性能。

线程不安全的接口

ArrayListLinkedListHashSetLinkedHashSetTreeSetPriorityQueueArrayQueueHashMapLinkedHashMapTreeMap 都是线程不安全的

线程安全的接口

VectorHashtableConcurrentHashMap

为什么要使用集合

是因为数组一旦声明之后,长度就不可变了;同时,声明数组时的数据类型也决定了该数组存储的数据的类型;而且,数组存储的数据是有序的、可重复的,特点单一。 而集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。

数据的类型;而且,数组存储的数据是有序的、可重复的,特点单一。 而集合提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。

学习参考

  • Java基础常见面试题总结(上) | JavaGuide(Java面试 + 学习指南)
  • Java面试题之Java集合框架篇(Java容器篇),30道Java集合框架八股文(7千字38张手绘图),面渣逆袭必看👍 | 二哥的Java进阶之路 (javabetter.cn)

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

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

相关文章

深入理解Servlet(中)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 上篇有一张图&#xff…

Redis的安装

本文采用原生的方式安装Redis,Redis的版本为5.0.5 安装 下载 下载网站:https://download.redis.io/releases/ wget http://download.redis.io/releases/redis-5.0.5.tar.gz解压 tar -zxvf redis-5.0.5.tar.gz进入redis目录 cd redis-5.0.5执行编译…

u盘一插上就提示格式化解决办法,帮助重新使用,避免数据丢失

在我们使用U盘的过程中,有时会遇到一插上就提示格式化的问题。这个问题可能会给我们带来很多麻烦,因为格式化操作会导致数据的丢失。为了解决这一问题,本文将介绍一些解决办法,帮助读者重新使用U盘,并避免数据丢失的风…

【开源】基于Vue和SpringBoot的校园二手交易系统

项目编号: S 009 ,文末获取源码。 \color{red}{项目编号:S009,文末获取源码。} 项目编号:S009,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…

利用 FormData 实现文件上传、监控网路速度和上传进度

利用 FormData 实现文件上传 基础功能:上传文件 演示如下: 概括流程: 前端:把文件数据获取并 append 到 FormData 对象中后端:通过 ctx.request.files 对象拿到二进制数据,获得 node 暂存的文件路径 前端…

Leetcode—1094.拼车【中等】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—1094.拼车 模拟实现代码 bool carPooling(int** trips, int tripsSize, int* tripsColSize, int capacity) {int arr[1003] {0};int numPassenger 0, fromidx 0, toidx 0;for(int i 0; i < tripsSize; i) {num…

【嵌入式Linux程序开发综合实验】-1(附流程图) | ARM开发板 | 测试“Hello World” | Makefile文件 | 实现加法相加

任务&#xff1a;编写在标准输出终端输出“Hello World&#xff01;”的C语言代码以及输入指定数字相加结果、Makefile&#xff0c;并分别编译出在PC与ARM上运行的可执行程序文件。 设备以及工具 硬件&#xff1a;Linux开发板、PC机、串口连接线 图1 Linux开发板以及串口接线 …

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件&#xff0c;也可以不选择&#xff0c;后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存

特殊二叉树——堆

&#x1f308;一、堆的基本概念 1.堆&#xff1a;非线性结构&#xff0c;是完全二叉树 2.堆分为大堆和小堆。 大堆&#xff1a;树中任意一个父亲都大于等于孩子&#xff0c;根节点值大于等于其所有子孙节点的值。 小堆&#xff1a;树中任意一个父亲都小于等于孩子&#xff0c;…

兼容jlink OB arm仿真器使用(杜邦线过长导致烧写总是失败)

一、兼容jlink OB的使用&#xff1a; 1、设置中要选择jlink&#xff1b; 2、模式选择SWD模式&#xff08;接三根线&#xff09;&#xff1b; 二、杜邦线过长导致stm32的stlink烧写总是失败 用ST-link烧写提示的错误信息有&#xff1a; Error while accessing a target reso…

Redis中的数据结构

文章目录 第1关&#xff1a;Redis中的数据结构 第1关&#xff1a;Redis中的数据结构 这是上篇文章的第一关&#xff0c;只不过本篇是代码按行做的&#xff0c;方便一下大家使用。 代码如下&#xff1a; redis-cliset hello redislpush educoder-list hellorpush educoder-lis…

51单片机制作数字频率计

文章目录 简介设计思路工作原理Proteus软件仿真软件程序实验现象测量误差和范围总结 简介 数字频率计是能实现对周期性变化信号频率测量的仪器。传统的频率计通常是用很多的逻辑电路和时序电路来实现的&#xff0c;这种电路一般运行较慢&#xff0c;而且测量频率的范围较小。这…

【SpringCloud】注册中心和Ribbon负载均衡

SpringCloud 1.Eureka注册中心 1.1 Eureka的作用 注册中心拉取服务负载均衡远程调用 order-service得知user-service实例地址流程&#xff1a; user-service服务实例启动后&#xff0c;将自己的信息注册到eureka-server&#xff08;Eureka服务端&#xff09;&#xff0c;称…

redis主从复制模式和哨兵机制

目录 第一章、主从复制模式1.1&#xff09;Redis 主从复制模式介绍1.2&#xff09;Redis 主从复制实现、 第二章、哨兵机制2.1&#xff09;容灾处理之哨兵2.2&#xff09;Sentinel 配置 第一章、主从复制模式 1.1&#xff09;Redis 主从复制模式介绍 ①单点故障&#xff1a;数…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

申请开通QMT量化需要多少资金?免费开通!

最近量化交易在市场上大火&#xff0c;很多投资者想要参与进来。QMT量化软件是目前市场上一款比较常见并且强大的量化软件。那开通QMT量化交易软件需要多少资金&#xff1f; QMT量化交易软件是一种专门用于量化交易的工具&#xff0c;它能够帮助投资者通过程序化交易策略进行股…

如何解决“该公众号提供的服务出现故障,请稍后再试”

出现“该公众号提供的服务出现故障&#xff0c;请稍后再试” &#xff0c; 或者是出现 “公众号接口出现异常&#xff0c;请加入微信群接收接口报警” 的提问&#xff0c; 出现这个一般是开发者自身服务器出现问题导致的。 本文我来教大家如何排查。 第一步&#xff1a;加入告…

【力扣周赛】第 115 场双周赛(⭐优化背包DP)(TODO)

文章目录 竞赛链接Q1&#xff1a;2899. 上一个遍历的整数&#x1f4a9;&#xff08;阅读理解题&#xff0c;按题意模拟&#xff09;Q2&#xff1a;2900. 最长相邻不相等子序列 I&#xff08;贪心&#xff09;Q3&#xff1a;2901. 最长相邻不相等子序列 II&#xff08;类似 最长…

算法通关村第一关—白银挑战—链表高频面试算法题—查找两个链表的第一个公共子节点

文章目录 查找两个链表的第一个公共子节点&#xff08;1&#xff09;暴力求解法&#xff08;2&#xff09;使用哈希Hash⭐&#xff08;3&#xff09;使用集合⭐ - 与Hash类似&#xff08;4&#xff09;使用栈⭐&#xff08;5&#xff09;仍有更多方法&#xff0c;作者尚未理解&…

【小布_ORACLE笔记】Part11-1--RMAN Backups

Oracle的数据备份于恢复RMAN Backups 学习第11章需要掌握&#xff1a; 一.RMAN的备份类型 二.使用backup命令创建备份集 三.创建备份文件 四.备份归档日志文件 五.使用RMAN的copy命令创建镜像拷贝 文章目录 Oracle的数据备份于恢复RMAN Backups1.RMAN Backup Concepts&#x…