2024最新、最热、最全Java容器【知识点】!!!

news2024/9/20 20:44:03

文章目录

  • Java容器种类
  • 详细说说他们都有哪些内容
    • Collection :存储对象的集合
  • 为什么HashSet和ArrayDeque不支持有序性操作
    • Map:存储键值对的映射表
  • ArrayList和LinkedList的区别?
  • ArrayList的增删一定比LinkedList的增删慢吗?
      • native()方法是什么?
    • ArrayList实现RandomAccess接口有何作用?
      • 什么是标记接口?
  • 说一下Vector和ArrayList的联系和区别
  • ArrayList的扩容机制具体步骤
  • ArrayList和Array的异同?
      • 何时使用ArrayList最佳?
  • 遍历一个List有哪些不同的方式?
  • 不同的遍历方式有什么不一样的?
  • Collection和Collections的区别
  • PriorityQueue的特点
  • HashSet的实现原理
  • HashMap的实现原理
    • HashMap的长度为什么是2的整数幂次方
  • HashMap的put方法
  • HashMap的get方法
  • HashMap的resize()方法

Java容器种类

在这里插入图片描述

在这里插入图片描述

主要分为两大类CollectionMap

详细说说他们都有哪些内容

Collection :存储对象的集合

  1. List接口:Vector、ArrayList、LinkedList为其实现类;
  2. Queue接口:被Deque接口继承、其中 LinkedList和ArrayDeque也实现了Deque接口
  3. Set接口:被SortedSet接口继承,SortedSet接口又被TreeSet类继承; Set接口被HashSet和LinkedHashSet实现类继承;其中LinkedHashSet同时继承了HashSet类和Set接口
    在这里插入图片描述

为什么HashSet和ArrayDeque不支持有序性操作

为什么HashSet和ArrayDeque不支持有序性操作?

  • HashSet: 是基于HashMap实现的,而HashMap在1.8前内部使用哈希表(HashTable)来存储键值对,元素的存储位置由哈希码决定的,哈希码根据对象的内容实现的,故HashSet存储的值具有一定的随机性,不支持有序性操作
  • ArrayDeque: 底层维护了一个双端队列,删除和添加操作遵循的是先进先出和后进后出的原则,也不具备有序性

Map:存储键值对的映射表

  1. HashTable实现类:HashTable相较于HashMap而言是线程安全的,因为HashTable的所有主要方法都加了synchronized关键字,所以在单线程环境下,HashTable的性能会比HashMap差一些。而在多线程环境下,由于HashTable的线程安全特性,其性能可能会优于HashMap。
    当HashTable中的元素数量达到一定的阈值时,也会触发扩容。扩容后的HashTable大小会是原大小的两倍,并且所有的元素都需要被重新哈希,放入新的数组位置。
  2. HashMap实现类:1.7基于数组+链表实现;1.8后增加了红黑树。链表是为了解决哈希冲突而存在的JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。值得一提的是,数组的扩容取决于加载因子的大小(默认为0.75),较小的加载因子(0.5)会使得哈希表更频繁地进行扩容从而占用了过多的空间,较大的加载因子会减少扩容 的频率,但是可能导致较多的冲突,从而影响性能。
  3. TreeMap实现类:(根据谐音梗),它是基于红黑树实现的,Value值可重复,不同的key可以有相同的Value;但是key值不可重复,因为后进入的Value会被覆盖掉。它的Value是一种可以一对多,但是不能多对一的模式( 一个男生可以追多个女生,但多个男生不能追一个女生
  4. LinkedHashMap实现类:继承自 HashMap。使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。
    在这里插入图片描述

ArrayList和LinkedList的区别?

  • ArrayList 底层是数组实现的,查找快(连续内存中)、增删慢(整个数组改变),支持高效的随机访问,即get(int index) 方法
  • LinkedList同时实现了List接口和Deque接口,底层是由双向链表实现的,查找慢(链表在内存中是不连续的)增删快,由于存在前驱节点和后驱节点所以占用内存会比ArrayList多
    在这里插入图片描述
    在这里插入图片描述

ArrayList的增删一定比LinkedList的增删慢吗?

  1. 如果增删都是在末尾操作(调用remove()和add()方法),此时ArrayList就不需要移动和复制数组来进行操作了。如果数据量有百万级时,速度比LinkedList要快
  2. 如果增删在中间,LinkedList主要耗时在遍历上(链表内存不连续),ArrayList主要耗时在移动和复制上(底层调用的是arrayCopy()方法,是native方法)。LinkedList的遍历速度要比Array的复制和移动慢。如果数据量具有百万级时,依旧是ArrayList快

native()方法是什么?

native 方法是 Java 中声明,由操作系统中具体方法实现。
使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++ 语言实现的,并且被编译成了 DLL,由 Java去调用。

ArrayList实现RandomAccess接口有何作用?

在这里插入图片描述
RandomAccess接口是一个标记接口 ,该接口中并没有实现任何东西,标记该类代表其有快速随机访问功能,此功能是其本身就有的功能,而非加了接口后才有的,因为ArrayList的底层是数组,数据的连续性内存,天然的具有快速随访问功能。而LinkedList的底层是链表,它分散的内存,天然的就不具备快速随机访问功能,所以并没有在LinkedList实现RandomAccess接口

什么是标记接口?

当一个类实现了标记接口后,编译器和运行时环境可以通过反射等机制来检查该类是否实现了特定的接口。这样可以在程序运行时根据标记接口的存在与否来进行下一步的处理。

说一下Vector和ArrayList的联系和区别

  • 线程安全性:Vector的方法都有Synchronized关键字,是线程安全的,而ArrayList并没有该关键字,所以它并不是线程安全的
  • 性能:由于加锁的原因,Vector的性能不如ArrayList的性能好
  • Vector的默认扩容是1倍,ArrayList的默认扩容是1.5倍

ArrayList的扩容机制具体步骤

  1. 初始化:创建一个初始容量的数组,默认为10个元素大小。
  2. 添加元素:当你向 ArrayList 添加元素时,它会检查当前数组的容量是否足够,如果不够,则进行扩容操作。
  3. 扩容操作:扩容操作会创建一个新的数组,通常是当前容量的1.5倍或2倍大小,并将原有元素复制到新数组中。
  4. 更新引用:ArrayList 内部会将引用指向新的数组,以便后续的元素添加和访问。
  5. 继续添加:继续添加元素,如果数组再次满了,则重复上述扩容操作。
    因此,ArrayList 的动态扩容机制保证了它可以根据需要动态地调整容量,以容纳任意数量的元素。这使得 ArrayList 具有灵活性和高效性,但也需要注意,频繁的扩容操作可能会导致性能下降,因此在预知大量元素添加的情况下,可以通过构造函数提供一个更大的初始容量,以减少扩容次数。

ArrayList和Array的异同?

  1. 存储类型的不同:
    Array:只可存储基本数据类型和对象
    ArrayList:只能存储对象
  2. 大小不同
    Array:被设置的为固定大小
    ArrayList:是可变数组,能动态扩容

何时使用ArrayList最佳?

  1. 不确定列表的大小
  2. 需要随机的访问元素
  3. 不需要线程安全
  4. 需要频繁的插入元素

遍历一个List有哪些不同的方式?

  • for
  • foreach
  • iterator

不同的遍历方式有什么不一样的?

  • for循环一般用来处理比较简单的有序的,可预知大小的集合或数组
  • foreach可用于遍历任何集合或数组,而且操作简单易懂,他唯一的不好就是需要了解集合内部类型
  • iterator是最强大的,他可以随时修改或者删除集合内部的元素,并且是在不需要知道元素和集合的大小的情况下进行的,当你需要对不同的容器实现同样的遍历方式时,迭代器是最好的选择!
  • 同样遍历一个集合,iterator和foreach用时不相上下。for循环用时最少。

Collection和Collections的区别

  • Collection是一个接口,是很多集合的父接口,它定义了多种集合的基本操作
  • Collections是一个工具类,提供了很多实用的集合操作方法,能够方便我们进行集合操作

PriorityQueue的特点

  • PriorityQue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastExpection异常
  • 不能存储null
  • 默认数组初始长度是11,也可以指定初始容量
  • 它是一个比较标准的队列,不是严格标准,它不是严格先进先出的,内部按队列元素的大小进行了重新排序,所以要放入集合中的元素必须可以比较

HashSet的实现原理

HashSet是基于HashMap实现的,默认构造函数是一个初始大小为16,加载因子为0.75的HashMap。封装了一个HashMap对象来存储所有的集合元素,所有放入HashSet中的集合元素实际上存入了HashMap的key中,当向HashSet中存入元素时必须要同时重写hashcode()方法和equals()方法,因为在向HashSet是不允许有重复的值存在的,hashCode是用来确定存入对象的位置,如果不重写hashCode,则两个意义相同但内存不一样的值会被hashCode认为是不同的,此时我们重写后的equals是认为他们相同的,又因为是先调用的hashCode后调用的equals的所以这种情况是会跳过equals直接把相同的值存入不同的位置

HashMap的实现原理

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象

HashMap的长度为什么是2的整数幂次方

  1. 因为这样可以通过构造位运算,快速寻址定址。这是由hash()方法的底层源码结构所决定的,无论是java7还是java8他们的hash()底层源码都涉及到了位运算,这种位运算让低位保留部分高位信息,减少哈希碰撞
  2. 当桶数组长度为2的正整数幂时,如果桶发生扩容(长度翻倍),则桶中的元素大概只有一半需要切换到新的桶中,另一半留在原先的桶中就可以
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

HashMap的put方法

调用key的hashCode方法计算哈希值,并据此计算出数组下标index
如果发现当前的桶数组为null,则调用resize()方法进行初始化
如果没有发生哈希碰撞,则直接放到对应的桶中
如果发生哈希碰撞,且节点已经存在,就替换掉相应的value
如果发生哈希碰撞,且桶中存放的是树状结构,则挂载到树上
如果碰撞后为链表,添加到链表尾,如果链表超度超过TREEIFY_THRESHOLD默认是8,则将链表转换为树结构
数据put完成后,如果HashMap的总数超过threshold就要resize

HashMap的get方法

调用key的hashCode方法计算哈希值,并据此计算出数组下标index
找到key所在桶的第一个元素
如果第一个元素的key等于待查找的key,直接返回
如果第一个元素是树节点就按照树的方式来查找
否则按照链表的方向查找
如果没有找到则返回null

HashMap的resize()方法

在这里插入图片描述

  1. 原数组是否为空
  2. 为空的话 初始化设置新数组长度以及新阈值,然后新建一个Node数组,赋值给table,并返回
  3. 如果不为空新建Node数组,赋值给table返回
  4. 若原数组不为空
  5. 设置新阈值是是旧阈值的二倍 新建一个Node数组,赋值给table
  6. 遍历数组
  7. 如果每个数组后面链表的位置没有链表,则根据算法讲旧元素赋值到新位置上

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

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

相关文章

SOMEIP_ETS_064: String_UTF16FIXED_too_short

测试目的: 验证当设备(DUT)接收到一个小于64字节的UTF16FIXED字符串时,是否能够返回错误消息。 描述 本测试用例旨在检查DUT在接收到一个长度小于64字节的UTF16FIXED字符串的SOME/IP消息时,是否能够返回格式错误&am…

04-javascript 高阶(知识点)

目录 1.严格模式 1.1什么是严格模式 1.2开启严格模式 1.3严格模式中的变化 2.高阶函数 3.闭包 3.1 变量的作用域 3.2 什么是闭包 3.3 闭包的作用 3.4 闭包的案例 4.递归 4.1 什么是递归 4.2 利用递归求1~n的阶乘 5.赋值(地址传递)-浅拷贝-深拷贝 5.1 地址传递 5…

MATLAB中bicgstabl函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 bicgstabl 提供初始估计值 使用函数句柄代替数值矩阵 bicgstabl函数的功能是求解线性系统 - 稳定双共轭梯度 (l) 法。 语法 x bicgstabl(A,b) x bicgstabl(A,b,tol) x bicgstabl(A,b,tol,maxit) x bic…

map容器的所有操作

1.基本概念 2.构造和赋值 注意map中存放的是pair对组&#xff0c;<key,value>&#xff0c;会根据key自动排序 3.大小和交换 4.插入和删除 插入的四种方式&#xff1a; 5.查找和统计 6.排序

8.21-部署eleme项目

1.设置主从从mysql57服务器 &#xff08;1&#xff09;配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

# 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群

利刃出鞘_Tomcat 核心原理解析&#xff08;八&#xff09;-- Tomcat 集群 一、Tomcat专题 - Tomcat集群 - 介绍及准备工作 1、Tomcat集群 简介 由于单台Tomcat的承载能力是有限的&#xff0c;当我们的业务系统用户量比较大&#xff0c;请求压力比较大时&#xff0c;单台Tomc…

i.MX6裸机开发(8):中断

相比STM32的NVIC&#xff0c;i.MX 6ULL的中断控制系统更复杂&#xff0c;它的中断管理器使用的是GIC V2&#xff0c;GIC V2的实现方式与我们熟知的NVIC差别较大。 本章重点讲解i.MX 6U的GIC基本结构以及实现方法&#xff0c;更详细的介绍可以参考《ARM Generic Interrupt Contr…

快速学习初阶“堆“(数据结构C语言)

前言&#xff1a; 二叉树是什么&#xff1f; 同样也和之前的"栈"跟"队列"是一样的&#xff0c;是一种存储数据的方式&#xff0c;只不过二叉树的结构更为复杂。 那么为什么要用二叉树存储数据呢&#xff1f;真的多此一举吗&#xff1f; 它的实际作用是什么…

买对不买贵,宠物空气净化器应该怎么选才能选到好的产品

你是否还在为家中无处不在的猫毛而烦恼&#xff1f;每当有风吹来&#xff0c;就把四处躲藏的猫毛给吹出来&#xff0c;不经意间就可能让这些”蒲公英“悄悄附在你的食物上&#xff0c;或是不经意间吸入鼻腔&#xff0c;让人既无奈又尴尬。你是否每天下班回家后的第一件事&#…

AnyV2V:一种用于各种视频编辑任务的即插即用框架

人工智能咨询培训老师叶梓 转载标明出处 视频编辑任务通常涉及根据额外的控制信息&#xff08;如文本提示、主题、风格等&#xff09;编辑源视频&#xff0c;以生成与源视频和提供的控制信息相符的新视频。然而&#xff0c;现有方法往往局限于特定类型的编辑任务&#xff0c;难…

面向对象06:super关键字详解

本节内容视频链接&#xff1a;面向对象10&#xff1a;Super详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p69&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌super关键字是一个特殊的引用&#xff0c;‌用于指代父类对象‌。‌在子…

搜维尔科技:Xsens通过其先进的动作捕捉技术和惯性跟踪传感器,实现了与机器人的高效互动,提高了机器人的操作精度、自然性和稳定性

‌Xsens通过实时动作捕捉技术和MTI惯性跟踪传感器与机器人进行互动‌&#xff0c;这些技术为机器人提供了高精度的运动数据和稳定的导航能力&#xff0c;从而实现了机器人操作的精确性和效率的提升。 Xsens的技术主要应用于两大领域&#xff1a;人类物理交互行为的建模和分析&a…

如何使用ssm实现基于java的小型超市管理系统+vue

TOC ssm195基于java的小型超市管理系统vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让…

Git 的配置

1. 忽略特殊文件 在⽇常开发中&#xff0c;我们有些⽂件不想或者不应该提交到远端&#xff0c;⽐如保存了数据库密码的配置⽂件&#xff0c;那怎么让 Git 知道呢&#xff1f;在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件&#xff0c;然后把要忽略的⽂件名填进去&am…

【中仕公考怎么样】2025年山东各考试汇总

准备同时备考山东多项考试的考生看过来啦!本篇文章带大家了解一下2025年山东省各项考试时间节点! ①国考 公告发布:2024年10月14日(参考去年) 笔试时间:11月下旬 笔试内容:行测申论&#xff0c;部分有专业科目;面试形式:结构化 ②省考 公告发布:2024年11月 笔试时间:202…

Unet改进8:在不同位置添加SpatialGroupEnhance||空间群智能增强:改进卷积网络中的语义特征学习

本文内容:在不同位置添加SpatialGroupEnhance 论文简介 卷积神经网络(Convolutional Neural Networks, cnn)通过收集分层的、不同部分的语义子特征来生成复杂对象的特征表示。这些子特征通常以分组的形式分布在每一层的特征向量中[43,32],代表各种语义实体。然而,这些子特征…

python --cnlunar(黄历)

import datetime import cnlunara cnlunar.Lunar(datetime.datetime(2024, 8, 26, 10, 30), godType8char) # 常规算法 # a cnlunar.Lunar(datetime.datetime(2022, 2, 3, 10, 30), godType8char, year8CharbeginningOfSpring) # 八字立春切换算法 dic {日期: a.date,农历…

如何使用ssm实现毕业生就业管理平台

TOC ssm192毕业生就业管理平台jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理…

如何使用ssm实现保险业务管理系统设计与实现

TOC ssm131保险业务管理系统设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规…

Pytorch构建网络模型结构都有哪些方式

目录 前言 1.使用nn.Module基类 2.使用nn.Sequential容器 3. 使用nn.ModuleList 4. 使用nn.ModuleDict 5. 混合使用nn.Module和原生Python代码 6.表格总结 前言 nn.Module&#xff1a;最通用、最灵活的方式&#xff0c;适用于几乎所有场景。nn.Sequential&#xff1a;适…