java常见集合框架的区别

news2024/11/13 23:20:35

1.说说有哪些常见集合?
集合相关类和接口都在java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。
Java集合主要关系
在这里插入图片描述
其中Collection是集合List、Set的父接口,它主要有两个子接口:

List:存储的元素有序,可重复。
Set:存储的元素不无序,不可重复。
Map是另外的接口,是键值对映射结构的集合。

2.ArrayList和LinkedList有什么区别?
(1)数据结构不同
ArrayList基于数组实现
LinkedList基于双向链表实现
在这里插入图片描述
(2) 多数情况下,ArrayList更利于查找,LinkedList更利于增删

ArrayList基于数组实现,get(int index)可以直接通过数组下标获取,时间复杂度是O(1);LinkedList基于链表实现,get(int index)需要遍历链表,时间复杂度是O(n);当然,get(E element)这种查找,两种集合都需要遍历,时间复杂度都是O(n)。

ArrayList增删如果是数组末尾的位置,直接插入或者删除就可以了,但是如果插入中间的位置,就需要把插入位置后的元素都向前或者向后移动,甚至还有可能触发扩容;双向链表的插入和删除只需要改变前驱节点、后继节点和插入节点的指向就行了,不需要移动元素。
在这里插入图片描述
在这里插入图片描述注意,这个地方可能会出陷阱,LinkedList更利于增删更多是体现在平均步长上,不是体现在时间复杂度上,二者增删的时间复杂度都是O(n)

**(3)**是否支持随机访问

ArrayList基于数组,所以它可以根据下标查找,支持随机访问,当然,它也实现了RandmoAccess 接口,这个接口只是用来标识是否支持随机访问。
LinkedList基于链表,所以它没法根据序号直接获取元素,它没有实现RandmoAccess 接口,标记不支持随机访问。
**(4)**内存占用,ArrayList基于数组,是一块连续的内存空间,LinkedList基于链表,内存空间不连续,它们在空间占用上都有一些额外的消耗:

ArrayList是预先定义好的数组,可能会有空的内存空间,存在一定空间浪费
LinkedList每个节点,需要存储前驱和后继,所以每个节点会占用更多的空间

#3.ArrayList的扩容机制了解吗?
ArrayList是基于数组的集合,数组的容量是在定义的时候确定的,如果数组满了,再插入,就会数组溢出。所以在插入时候,会先检查是否需要扩容,如果当前容量+1超过数组长度,就会进行扩容。

ArrayList的扩容是创建一个1.5倍的新数组,然后把原数组的值拷贝过去。
在这里插入图片描述
4.ArrayList怎么序列化的知道吗? 为什么用transient修饰数组?
ArrayList的序列化不太一样,它使用transient修饰存储元素的elementData的数组,transient关键字的作用是让被修饰的成员属性不被序列化。

为什么最ArrayList不直接序列化元素数组呢?

出于效率的考虑,数组可能长度100,但实际只用了50,剩下的50不用其实不用序列化,这样可以提高序列化和反序列化的效率,还可以节省内存空间。

那ArrayList怎么序列化呢?

ArrayList通过两个方法readObject、writeObject自定义序列化和反序列化策略,实际直接使用两个流ObjectOutputStream和ObjectInputStream来进行序列化和反序列化。

5.快速失败(fail-fast)和安全失败(fail-safe)了解吗?
快速失败(fail—fast):快速失败是Java集合的一种错误检测机制

在用迭代器遍历一个集合对象时,如果线程A遍历过程中,线程B对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。如果集合发生变化时修改modCount值刚好又设置为了expectedmodCount值,则异常不会抛出。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改),比如ArrayList 类。
安全失败(fail—safe)

采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优点是避免了Concurrent Modification Exception,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改,比如CopyOnWriteArrayList类。

6.有哪几种实现ArrayList线程安全的方法?
fail-fast是一种可能触发的机制,实际上,ArrayList的线程安全仍然没有保证,一般,保证ArrayList的线程安全可以通过这些方案:

使用 Vector 代替 ArrayList。(不推荐,Vector是一个历史遗留类)
使用 Collections.synchronizedList 包装 ArrayList,然后操作包装后的 list。
使用 CopyOnWriteArrayList 代替 ArrayList。
在使用 ArrayList 时,应用程序通过同步机制去控制 ArrayList 的读写。

#7.CopyOnWriteArrayList了解多少?
CopyOnWriteArrayList就是线程安全版本的ArrayList。

它的名字叫CopyOnWrite——写时复制,已经明示了它的原理。
CopyOnWriteArrayList采用了一种读写分离的并发策略。CopyOnWriteArrayList容器允许并发读,读操作是无锁的,性能较高。至于写操作,比如向容器中添加一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。
在这里插入图片描述
8.能说一下HashMap的数据结构吗?
JDK1.7的数据结构是数组+链表,JDK1.7还有人在用?不会吧……

说一下JDK1.8的数据结构吧:

JDK1.8的数据结构是数组+链表+红黑树。

数据结构示意图如下:
在这里插入图片描述

其中,桶数组是用来存储数据元素,链表是用来解决冲突,红黑树是为了提高查询的效率。

数据元素通过映射关系,也就是散列函数,映射到桶数组对应索引的位置
如果发生冲突,从冲突的位置拉一个链表,插入冲突的元素
如果链表长度>8&数组大小>=64,链表转为红黑树
如果红黑树节点个数<6 ,转为链表

#9.你对红黑树了解多少?为什么不用二叉树/平衡树呢?
红黑树本质上是一种二叉查找树,为了保持平衡,它又在二叉查找树的基础上增加了一些规则:

每个节点要么是红色,要么是黑色;
根节点永远是黑色的;
所有的叶子节点都是是黑色的(注意这里说叶子节点其实是图中的 NULL 节点);
每个红色节点的两个子节点一定都是黑色;
从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;
在这里插入图片描述
之所以不用二叉树:

红黑树是一种平衡的二叉树,插入、删除、查找的最坏时间复杂度都为 O(logn),避免了二叉树最坏情况下的O(n)时间复杂度。

之所以不用平衡二叉树:

平衡二叉树是比红黑树更严格的平衡树,为了保持保持平衡,需要旋转的次数更多,也就是说平衡二叉树保持平衡的效率更低,所以平衡二叉树插入和删除的效率比红黑树要低。

#10.红黑树怎么保持平衡的知道吗?
红黑树有两种方式保持平衡:旋转和染色。

旋转:旋转分为两种,左旋和右旋
在这里插入图片描述
染⾊:
在这里插入图片描述
11.HashMap的put流程知道吗?
先上个流程图吧:
在这里插入图片描述
1、首先进行哈希值的扰动,获取一个新的哈希值。(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

2、判断tab是否位空或者长度为0,如果是则进行扩容操作。

if ((tab = table) == null || (n = tab.length) == 0)
    n = (tab = resize()).length;

3、根据哈希值计算下标,如果对应小标正好没有存放数据,则直接插入即可否则需要覆盖。tab[i = (n - 1) & hash])

4、判断tab[i]是否为树节点,否则向链表中插入数据,是则向树中插入节点。

5、如果链表中插入节点的时候,链表长度大于等于8,则需要把链表转换为红黑树。treeifyBin(tab, hash);

6、最后所有元素处理完成后,判断是否超过阈值;threshold,超过则扩容。

#12.HashMap怎么查找元素的呢?
先看流程图:
在这里插入图片描述
HashMap的查找就简单很多:

使用扰动函数,获取新的哈希值
计算数组下标,获取节点
当前节点和key匹配,直接返回
否则,当前节点是否为树节点,查找红黑树
否则,遍历链表查找

#13.HashMap的哈希/扰动函数是怎么设计的?

HashMap的哈希函数是先拿到 key 的hashcode,是一个32位的int类型的数值,然后让hashcode的高16位和低16位进行异或操作。

 static final int hash(Object key) {
        int h;
        // key的hashCode和key的hashCode右移16位做异或运算
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

这么设计是为了降低哈希碰撞的概率。

14.为什么HashMap的容量是2的倍数呢?

第一个原因是为了方便哈希取余:
将元素放在table数组上面,是用hash值%数组大小定位位置,而HashMap是用hash值&(数组大小-1),却能和前面达到一样的效果,这就得益于HashMap的大小是2的倍数,2的倍数意味着该数的二进制位只有一位为1,而该数-1就可以得到二进制位上1变成0,后面的0变成1,再通过&运算,就可以得到和%一样的效果,并且位运算比%的效率高得多

HashMap的容量是2的n次幂时,(n-1)的2进制也就是1111111***111这样形式的,这样与添加元素的hash值进行位运算时,能够充分的散列,使得添加的元素均匀分布在HashMap的每个位置上,减少hash碰撞。

第二个方面是在扩容时,利用扩容后的大小也是2的倍数,将已经产生hash碰撞的元素完美的转移到新的table中去
我们可以简单看看HashMap的扩容机制,HashMap中的元素在超过负载因子*HashMap大小时就会产生扩容。

19.为什么HashMap链表转红黑树的阈值为8呢?
树化发生在table数组的长度大于64,且链表的长度大于8的时候。

为什么是8呢?源码的注释也给出了答案。
在这里插入图片描述红黑树节点的大小大概是普通节点大小的两倍,所以转红黑树,牺牲了空间换时间,更多的是一种兜底的策略,保证极端情况下的查找效率。

阈值为什么要选8呢?和统计学有关。理想情况下,使用随机哈希码,链表里的节点符合泊松分布,出现节点个数的概率是递减的,节点个数为8的情况,发生概率仅为0.00000006。

至于红黑树转回链表的阈值为什么是6,而不是8?是因为如果这个阈值也设置成8,假如发生碰撞,节点增减刚好在8附近,会发生链表和红黑树的不断转换,导致资源浪费。

以下是整理了java基础的相关书籍。旨在帮助那些没有经验或者经验有限的初学者,少走弯路,利用有限的精力,更加高效地学习。由于个人时间有限,暂时整理,后续会持续更新,全是干货,欢迎关注! (访问密码:6798)

  • 《码出高效:Java开发手册》.pdf: https://url31.ctfile.com/f/40632231-724721889-4db527?
  • Java编程思想第4版.pdf: https://url31.ctfile.com/f/40632231-724721969-fc428d?
  • Java 8实战.pdf:https://url31.ctfile.com/f/40632231-724721962-d0969a?
  • Java编程思想第4版.pdf:https://url31.ctfile.com/f/40632231-724721969-fc428d
  • Java并发编程的艺术.pdf: https://url31.ctfile.com/f/40632231-724721980-748069?
  • JAVA并发编程实践.pdf: https://url31.ctfile.com/f/40632231-724722012-47e74b?
  • Java从小白到大牛精简版.pdf: https://url31.ctfile.com/f/40632231-724722020-a71a79?
  • Java高并发编程详解.pdf: https://url31.ctfile.com/f/40632231-724722133-f60a69?
  • Java核心技术 卷Ⅰ 基础知识(第8版).pdf: https://url31.ctfile.com/f/40632231-724722186-aa396a?
  • Java核心技术 卷Ⅰ 基础知识(第8版).pdf: https://url31.ctfile.com/f/40632231-724722186-aa396a?
  • JAVA核心知识点整理.pdf: https://url31.ctfile.com/f/40632231-724722290-3c7f6d?
  • 阿里巴巴Java开发手册v1.2.0.pdf: https://url31.ctfile.com/f/40632231-724722295-6f37ac?
  • 分布式Java应用基础与实践.pdf: https://url31.ctfile.com/f/40632231-724722338-385ff7?
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版).pdf: https://url31.ctfile.com/f/40632231-724722394-093ff9?

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

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

相关文章

澳大利亚博士后招聘|国立大学—太阳能电池方向

【国外博士后招聘-知识人网】澳大利亚国立大学博士后—太阳能电池方向 澳大利亚国立大学&#xff08;The Australian National University&#xff09;&#xff0c;简称ANU&#xff0c;始建于1946年&#xff0c;坐落于澳大利亚首都堪培拉&#xff0c;是公立研究型综合类大学&am…

Ernie-SimCSE对比学习在内容反作弊上应用

作者 | ANTI 导读 AI技术在不同行业和业务被广泛的应用&#xff0c;本文介绍了反作弊团队在与spammer对抗愈演愈烈的趋势下&#xff0c;不断探索前沿技术&#xff0c;将百度NLP预训练模型结合对比学习用于解决spam内容中知道提问群发推广作弊的技术方案。 本次分享&#xff0c;…

从单车智能到车路协同,均胜电子正在加快智能驾驶商业化进程

进入2022年&#xff0c;自动驾驶迈入了商业化的关键期&#xff0c;但市场分层也开始越来越明显。 一方面&#xff0c;L2级及以上智能辅助驾驶的搭载量在不断攀升&#xff0c;未来将成为量产车的标准配置。根据《高工智能汽车研究院》数据显示&#xff0c;今年1-9月前装标配搭载…

基于python的停车场管理系统的设计与实现/智能停车管理系统

摘要 车位信息是停车场供应用户必不可少的一个部分。在停车场发展的整个过程中&#xff0c;车位信息担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类系统管理程序也在不断改进。本课题所设计的停车场管理系统&#xff0c;使用Django框架&#xff0c;Python语…

Linux学习-37-查看文件系统硬盘信息(df、du命令)

10.2 df用法详解&#xff1a;查看文件系统硬盘使用情况 Linux 磁盘管理好坏直接关系到整个系统的性能问题。df &#xff08;disk free&#xff09;命令&#xff0c;检查文件系统的磁盘空间占用情况&#xff0c;包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。 …

[附源码]Python计算机毕业设计bugbase管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Div3 cf1741

Cf1741 文章目录A. Compare T-Shirt SizesB. Funny Permutation&#xff08;思维&#xff09;C. Minimize the Thickness&#xff08;&#xff09;A. Compare T-Shirt Sizes 题意: 第一行&#xff0c;输入测试样例个数n&#xff0c;接下来n行输入 &#xff0c;输入a和b代表衣服…

【自然语言处理(NLP)】基于注意力机制的英文新闻标题生成

【自然语言处理&#xff08;NLP&#xff09;】基于注意力机制的英文新闻标题生成 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全…

SpringBoot+Vue项目宠物猫店管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

[附源码]java毕业设计篮球俱乐部管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Flume部署实验

目录一、实验介绍1.1实验内容1.2实验知识点1.3实验环境1.4实验资源1.5实验步骤清单二、实训架构三、实验环境准备四、实验步骤4.1Flume部署4.1.1配置hosts文件及zookeeper的myid4.1.2安装Flume4.1.3验证Flume五、实验总结一、实验介绍 1.1实验内容 本实验包括分布式海量日志采…

Axure 学习:简单的下拉菜单为什么做不好?

​很多同学在学习axure的时候&#xff0c;总是会发现有的时候明明看起来很简单的内容&#xff0c;却怎么也做不好&#xff0c;总是会出现这样或那样的问题。 原因是细节。有的同学没有注意到细节&#xff0c;忽略了&#xff0c;造成做好的内容总是存在一些小问题。本文以一个交…

【FLASH存储器系列十】ONFI数据接口的时序参数与时序图

目录 1.1 时序参数 1.2 时序图详解 1.2.1命令锁存时序 1.2.2地址锁存时序 1.2.3数据输入时序 1.2.4数据输出时序 1.2.5数据输出时序&#xff08;EDO&#xff09; 1.2.6读状态时序 1.1 时序参数 ONFI协议中明确规定了时序参数的范围&#xff0c;如果不满足要求的最小和最…

赞奇科技英特尔共图视觉计算“云”上大作为

作为物理世界与虚拟世界 “数实交融” 的重要桥梁&#xff0c;视觉计算已经成为建筑设计、VR/AR、互动游戏、影视动漫、工业设计等行业领域赖以发展的关键计算形式&#xff0c;通过图像初始略图、三维重建等方式&#xff0c;将事物与场景特征以图片、视频等视觉方式表现出来&am…

Nginx高可用

在生产环境上很多时候是以Nginx做反向代理对外提供服务&#xff0c;但是Nginx难免遇见故障&#xff0c;如&#xff1a;服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。因此需要两台以上的Nginx服务器对外提供服务&#xff0c;这样的话就可以解决其中一台宕机…

再探Kotlin 跨平台——迁移Paging分页库至KMM

前言 KMM的发展除了靠官方社区的支持外&#xff0c;一些大企业的开源落地也尤为重要。从这些开源中我们需要借鉴他的设计思想和实现方式。从而在落地遇到问题时&#xff0c;寻得更多的解决办法。 上周&#xff0c;Square正式将Paging分页库迁移到了Kotlin Multiplatform平台&…

目标检测论文解读复现之十:基于YOLOv5的遥感图像目标检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

接上篇文章,完成Hadoop集群部署实验

这里写目录标题一、实验介绍1.1 实验内容1.2 实验知识点1.3 实验环境1.4 实验资源1.5 实验步骤清单二、实验架构三、实验环境准备四、实验步骤4.1 查看环境4.2部署Hadoop集群4.2.1安装hadoop(master)4.2.2创建hdfs数据文件存储目录(master)4.2.3修改配置文件(master)4.2.4主从节…

项目管理:团队执行力差,管理不善是根源

为什么说团队执行力差&#xff0c;多半是管理者的问题&#xff1f;如何提高团队的执行力&#xff1f; 1、员工不知道该做什么 项目开始一段时间&#xff0c;员工都还没弄清楚该做什么&#xff0c;是什么职位啊&#xff1f;为什么会产生这样的问题呢&#xff1f; 这是因为管理…

clickhouse使用clickhouse-keeper代替zookeeper

目录 异常现象&#xff1a; 1. clickhouse的异常日志 2. 追踪对应节点的zookeeper日志 使用clickhouse-keeper代替 zookeeper的步骤&#xff1a; 1&#xff1a; 准备 clickhouse-keeper的配置文件 1.1- 设置通信地址&#xff0c;以便对外通信 1.2- 在config.xml中…