Java集合容器面试题

Java集合容器面试题

  • 前言
  • 1、同步容器与并发容器之间的关系?
  • 2、阻塞队列的作用?
  • 3、阻塞队列了解多少?
  • 4、BlockingQueue接口中的一些方法?
  • 5、Java中的集合类有几种?
  • 6、数组和集合的区别?
  • 7、ArrayList、LinkList、CopyOnWriteArrayList区别?
  • 8、HashMap、HashTable、ConCurrentHashMap区别?
  • 9、HashMap扩容机制?
  • 10、Java 8中为什么要引进红黑树?
  • 11、HashMap内部的数组长度为什么都是2的整数次幂?
  • 12、HashMap如何处理key为null的键值对?
  • 13、HashMap的put方法流程?
  • 14、如何解决 hash 冲突?
  • 15、List 去重的5方法?
  • 16、谈谈ConcurrentHashMap的扩容机制?
  • 17、CopyOnWriteArrayList的底层原理是怎样的?
  • 18、List , Set , Map 三者的区别?
  • 19、讲讲红黑树的特点?
  • 20、HashMap为什么不用二叉树?
  • 总结


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、同步容器与并发容器之间的关系?

同步容器与并发容器都可以保证多线程环境下的线程安全,不过并发容器的性能更高。

  • 同步容器:
    就是通过Synchronized来实现同步的容器,它的方法都是synchronized方法,比如Vector、HashTable,以及Collections工具类中的synchronizedXxx方法;
  • 并发容器:
    它的锁粒度更小,比如
    CopyOnWrite容器:CopyOnWriteArrayList、CopyOnWriteArraySet
    ConcurrentMap的实现类:ConcurrentHashMap、ConcurrentSkipListMap(支持排序,底层用的是跳表)。

2、阻塞队列的作用?

阻塞队列的实现(ReentrantLock加锁):
ArrayBlockingQueue:使用数组实现的有界阻塞队列
LinkedBlockingQueue:使用链表实现的有界阻塞队列
PriorityBlockingQueue:支持优先级的无界阻塞队列
DelayQueue:支持延时获取元素的无界阻塞队列
非阻塞队列的实现(自旋+CAS):
ConcurrentLinkedQueue:使用链表实现的无界非阻塞队列
ConcurrentLinkedDeque:使用链表实现的双向非阻塞队列
如果线程向队列插入元素,而这个时候队列满了,就会阻塞这个线程,直到队列有空闲。
如果线程从队列中获取元素,而这个时候,队列为空,就会阻塞这个线程,直到队列里面有数据,比如线程池实现线程复用。

3、阻塞队列了解多少?

阻塞队列不需要手动控制什么时候该被阻塞,什么时候该被唤醒,简化了操作,也避免了线程死锁问题。

  • 添加元素:add、offer、put这3个方法都是往队列尾部添加,区别如下:
    1、add:不会阻塞,添加成功时返true,当队列满了,再添加会抛出IllegalStateException;
    2、offer: 可能会阻塞(如果设置超时时间),当超时时间到了才会添加,添加成功返回true,当队列满了,添加失败会返回false。
    3、put:会阻塞,当队列满了,添加元素的线程会被挂起,进入阻塞状态,直到队列取出一个元素,才能添加。
  • 取出元素:remove、poll、take这3个方法都是往队列头部取出,区别如下:
    1、remove:不会阻塞,会移除队列头部第1个元素,移除成功返true;
    2、poll:可能会阻塞(如果设置超时时间),当超时时间到了才会取值,获取成功返回元素,当队列空了,获取失败会返回false。null;
    3、take:会阻塞,当队列空了,获取元素的线程会被挂起,进入阻塞状态,直到队列添加一个元素,才能取出。
    ​常见的场景有两个:
    1、线程池中核心线程的复用;
    2、生产消费队列模式。

4、BlockingQueue接口中的一些方法?

操作成功返回true,如果操作失败抛异常:add(E e),remove(Object o);
操作成功返回true,操作失败返回false:offer(E e);
队列满/空了阻塞调用线程:put(E e), take();
阻塞+超时:offer(E e, long timeout, TimeUnit unit),poll(long timeout, TimeUnit unit);
阻塞队列的特点:
不能包含null元素;
实现这个接口的类都必须是线程安全的;
可以限定容量大小。

5、Java中的集合类有几种?

Java集合类存放在java.util包中,是一个用来存放对象的容器;
主要分为四种:
1、List列表:有序可重复;
2、Set集合:无序不可重复,不能为null;
3、Queue队列:有序可重复;
4、Map映射:无序,键唯一,值不唯一。
在这里插入图片描述

6、数组和集合的区别?

  • 1.数组长度是固定的,集合长度是可变的;
  • 2.数组只能存储一种类型的数据,集合可以存储多种类型的数据:(List list = = new ArrayList<>();)
  • 3.数组可以是基本数据类型,也可以是引用数据类型,但集合只能是引用数据类型(对象)。

7、ArrayList、LinkList、CopyOnWriteArrayList区别?

  • ArrayList:底层是动态数组,元素是有序可重复的,查询修改效率高,线程不安全;
  • LinkList:底层是双向链表,元素是有序可重复的,新增删除效率高,线程不安全;
  • CopyOnWriteArrayList:是线程安全的ArrayList,读操作无锁,写操作(add、set、remove等)是通过ReentrantLock加锁。

8、HashMap、HashTable、ConCurrentHashMap区别?

  • HashMap:底层是采用的是(Node)数组+(单向)链表+红黑树,元素是无序的,key、value都可以为null,线程不安全;
  • HashTable:底层是(Entry)数组+(单向)链表,元素是无序,key、value都不可以为null,线程安全的,是通过synchronized同步锁;
  • ConCurrentHashMap:是线程安全的HashMap,JDK1.7是基于segment分段锁,JDK1.8是基于CAS+Synchronized同步锁。

9、HashMap扩容机制?

HashMap扩容机制在第一次put的时候会初始化,初始长度默认为16,加载因子默认为0.75,当数组元素大于16*0.75=12,数组会扩容为原来的2倍;当数组长度大于64,且链表长度大于8时,链表会转换为红黑树,红黑树长度小于6时会退化为链表,避免链表和红黑树之间频繁转换,消耗性能。

10、Java 8中为什么要引进红黑树?

  • 优点:引入红黑树是为了避免链表长度太长,而引起性能下降,链表的时间复杂度是o(n),红黑树的时间复杂度是 O(log n);
  • 缺点:红黑树实际是一个平衡二叉树,如果数据量太大的话,二叉树就会倾斜,不管是左倾还是右倾,都会影响查询效率,那红黑树为了避免倾斜,会通过左旋或右旋,以及颜色反转来达到一个平衡,因此会消耗一些性能

11、HashMap内部的数组长度为什么都是2的整数次幂?

因为在HashMap扩容的时候可以保证原数组中的元素可以均匀地散列到新的数组中。

12、HashMap如何处理key为null的键值对?

放置在桶数组中下标为0的桶中。

13、HashMap的put方法流程?

1、首先判断数组是否为空,是的话就执行resize()方法进行扩容;
2、如果不为空,则根据键值key计算hash值,再得到数组下标,如果若该位置为空,则直接插入(一个新的node);
3、如果不为空,再判断如果是红黑树,则直接在树中插入键值对;
4、如果是链表,则直接在尾部插入,key存在则覆盖;
5、如果链表长度大于8,再判断数组的长度,如果大于64,则转为红黑树存储,如果小于则进行扩容。

14、如何解决 hash 冲突?

解决哈希冲突的方法一般有:
拉链法(HashMap)、再哈希法、开放寻址法(threadLocalMap采用了线性探测法)、建立公共溢区。

15、List 去重的5方法?

  • 1、contains判断去重(有序):
  • 2、Iterator迭代器去重(无序):
    比较同个元素在集合中出现的数组下标:
    list.indexOf(item)!=list.lastIndexOf(item)
  • 3、HashSet去重(无序):HashSet set = new HashSet<>(list);
  • 4、LinkedHashSet去重(有序):
    LinkedHashSet set = new LinkedHashSet<>(list);
  • 5、Stream去重(有序):
    list.stream().distinct().collect(Collectors.toList())。

16、谈谈ConcurrentHashMap的扩容机制?

  • 1.7版本:1.7版本的ConcurrentHashMap是基于Segment分段实现的,每个Segment相对于⼀个⼩型的HashMap,每个Segment内部会进⾏扩容,和HashMap的扩容逻辑类似 ,先⽣成新的数组,然后转移元素到新数组中。
  • 1.8版本:
    1、当某个线程进⾏put时,如果发现ConcurrentHashMap正在进⾏扩容那么该线程⼀起进⾏扩容;
    2、如果不是正在扩容,则添加到ConcurrentHashMap中,然后判断是否超过阈值,超过了则进⾏扩容;
    3、ConcurrentHashMap是⽀持多个线程同时扩容的,扩容之前也先⽣成⼀个新的数组;
    4、在转移元素时,先将原数组分组,将每组分给不同的线程来转移,每个线程负责⼀组或多组。

17、CopyOnWriteArrayList的底层原理是怎样的?

  • 1、⾸先CopyOnWriteArrayList内部也是⽤数组来实现的,在向CopyOnWriteArrayList添加元素时,会复制⼀个新的数组,写操作在新数组上进⾏,读操作在原数组上进⾏;
  • 2、写操作会加锁,防⽌出现并发写⼊ 丢失数据的问题;
  • 3、写操作结束之后会把原数组指向新数组;
  • 4、CopyOnWriteArrayList允许在写操作时来读取数据,⼤⼤提⾼了读的性能,因此适合读多写少的场景,但是它会⽐较占内存,同时可能读到的数据不是实时最新的数据,所以不适合实时性要求很⾼的场景。

18、List , Set , Map 三者的区别?

Java 容器分为 Collection 和 Map 两大类, Collection 集合的子接口有 Set 、 List 、 Queue 三种子接口。

  • List :一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个 null 元素,元素都有索引。常用的实现类有 ArrayList 、 LinkedList 和 Vector 。
  • Set :一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个 null 元素,必须保证元素唯一性。 Set 接口常用实现类是 HashSet 、 LinkedHashSet 以及TreeSet 。
  • Map 是一个键值对集合,存储键、值和之间的映射。 Key 无序,唯一; value 不要求有序,允许重复。
    Map的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。

19、讲讲红黑树的特点?

  • 1、每个节点或者是黑色,或者是红色。
  • 2、根节点是黑色。
  • 3、每个叶子节点(NIL)是黑色。
    注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点
    如果一个节点是红色的,则它的子节点必须是黑色的。
    从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

20、HashMap为什么不用二叉树?

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

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【二分】二分模板+二分题目

一、朴素二分 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/description/ int left 0, right nums.…

Windows Docker 部署 Jenkins

一、简介 今天介绍一下在 Windows Docker 中部署 Jenkins 软件。在 Windows Docker 中&#xff0c;分为两种情况 Linux 容器和 Windows 容器。Linux 容器是通常大多数使用的方式&#xff0c;Windows 容器用于 CI/CD 依赖 Windows 环境的情况。 二、Linux 容器 Linux 容器内部…

Mybatis | Mybatis的核心配置

目录: Mybatis的核心配置 :一、MyBatis的 “核心对象”1.1 SqlSessionFactory1.2 SqlSession :SqlSession对象中的操作数据库的方法 :\<T> T selectOne ( String statement )\<T> T selectOne( String statement , Object parameter )\<E> List\<E> se…

hudi索引

1.重点类 1.1.HoodieIndex 索引实现的基类&#xff0c;核心方法是两个&#xff1a;tagLocation和updateLocation   后续有不同的子类实现具体的索引 1.2.HoodieIndexFactory 没有具体这个类&#xff0c;是创建HoodieIndex的工厂类。具体操作类的名字以这个为后缀&#xff…

ESU毅速丨不锈钢材料为什么在金属3D打印中的广泛应用

不锈钢是一种传统且常见的材料&#xff0c;在金属3D打印领域应用最广。那么&#xff0c;为何不锈钢材料在3D打印中如此受欢迎呢&#xff1f;以下是几个关键原因。 卓越的工艺适应性 金属3D打印技术&#xff0c;如直接金属激光烧结&#xff08;DMLS&#xff09;和选择性激光熔融…

【论文笔记】Improving Language Understanding by Generative Pre-Training

Improving Language Understanding by Generative Pre-Training 文章目录 Improving Language Understanding by Generative Pre-TrainingAbstract1 Introduction2 Related WorkSemi-supervised learning for NLPUnsupervised pre-trainingAuxiliary training objectives 3 Fra…

【MySQL】数据查询——DQL基本数据库查询

目录 查询语法1. 查询表中所有的数据行和列&#xff0c;采用“*”符号2. 查询表中指定列的数据。3. 在查询中使用别名&#xff0c;使用“AS”关键字。4. 在查询中使用常量列&#xff1a;如果需要将一些常量的默认信息添加到输出结果中&#xff0c;以方便统计或计算。可以使用常…

Linux服务器挂了后如何再次启动SVN

Linux服务器挂了后如何再次启动SVN 启动SVN步骤grep查询kill杀掉原有的select查找目录&#xff0c;并设置启动服务DONE设置自启动 启动SVN步骤 最近在折腾AI&#xff0c;比较少更博客了&#xff0c;大家有问题可随时询问 grep查询 [rootDujinyang Code]# ps -ef |grep svn …

【Qt学习】QTextEdit 与 QComboBox 的 属性与实例(槽函数的使用、读取本机内容到控件)

文章目录 1. QTextEdit2.1 介绍2.2 实例使用 - 槽函数的使用 2. QComboBox2.1 介绍2.2 实例使用案例1&#xff1a;设置下拉框项目组件的方式案例2&#xff1a;读取本机文件内容 到QComboBox 1. QTextEdit 2.1 介绍 我们可以查阅官方文档&#xff0c;对QTextEdit 有更深的了解&…

vue3基础教程(1)——nodejs环境搭建

博主个人小程序已经上线&#xff1a;【中二少年工具箱】 小程序二维如下&#xff1a; 正文开始 专栏简介1. 环境菜单2.为什么下载node3. nodejs简介4. nodejs安装5. 编辑器选择 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。…

13.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-如果没有工具就创造工具

内容参考于&#xff1a; 易道云信息技术研究院VIP课 上一个内容 &#xff1a;12.游戏网络通信存在的问题 现在把游戏网络的架构看了一个小小的大概&#xff0c;可以用它的接口发数据接收数据了&#xff0c;如果真正想用它这一套东西&#xff0c;真正核心不在于它的接口而在于…

python实现AES加密解密

1. 前言 AES是一种对称加密&#xff0c;所谓对称加密就是加密与解密使用的秘钥是一个。 之前写过一片关于python AES加密解密的文章&#xff0c;但是这里面细节实在很多&#xff0c;这次我从 参数类型、加密模式、编码模式、补全模式、等等方面 系统的说明如何使用AES加密解密…

存储xss实现获取cookie(本地实战)

实战更能体验收获&#xff01;&#xff01;&#xff01; 环境准备&#xff1a; 1.phpstudy 2.dvwa靶场 实战 首先我们在phpstudy指定的localhost网站目录下编写一个xss.php文件&#xff0c;内容如下&#xff1a; <?php $cookie $_GET[cookie]; $ip getenv (REMOTE_…

零基础小白到底适不适合学鸿蒙,请看完这篇再决定吧~

随着华为鸿蒙系统的问世&#xff0c;不少技术小白在是否学习鸿蒙的问题上犹豫不决。鸿蒙作为华为自主研发的操作系统&#xff0c;拥有许多独特的技术优势和市场前景。但对于小白来说&#xff0c;是否值得投入时间和精力去学习鸿蒙开发呢&#xff1f; 1.鸿蒙系统开发&#xff1…

Java8 - LocalDateTime时间日期类使用详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

云南经贸Day01

day01 一. VMware创建虚拟机二.VMware安装Linux三 虚拟机网络配置1. 查看网络信息2. 修改网络IP 四. 虚拟机操作管理1. 通过VMware为虚拟机拍摄快照2. VMware 为虚拟机执行克隆 五. Xshell的安装和使用 一. VMware创建虚拟机 二.VMware安装Linux 清华大学镜像源网址: https://m…

南方电网的能源棋局上,蔚来换电扮演什么角色?

2 月 26 日&#xff0c;南网储能科技与蔚来能源签署协议&#xff0c;将充换电站、储能站、可调负载等聚合资源连接到虚拟电厂平台&#xff0c;推动换电站作为分布式储能在虚拟电厂项目上的应用。 蔚来换电站是国内首个智慧微电网型分布式换电设施&#xff0c;可透过换电订单预…

【C++ map和set】

文章目录 map和set序列式容器和关联式容器键值对setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和关联式容器 之前我们接触的vector,list,deque等&#xff0c;这些容器统称为序列式容器&#xff0c;其底层为线性序列的的数据结构&#xff0c;里面存…

面试数据库篇(mysql)- 08事务

原理 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 ACID是什么?可以详细说一下吗? 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全…

栈的概念结构和实现

文章目录 一、什么是栈二、栈的实现三、实现栈所需的函数四、完整栈的展现五、栈的思维导图 一、什么是栈 栈是一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。进行插入和删除的一段叫做栈顶&#xff0c;另一段叫做栈底 压栈&#xff1a;插入数据 出栈&a…