Java集合面试题汇总大全

每个集合的出现一定是为了解决某种问题的解决方案。

 

集合流程图

  1. JAVA中集合和数组的区别
  2. Collection和Collections的区别
  3. ArrayList和LinkedList 和Vector的区别
  4. list/set/map的区别
  5. HashSet和TreeSet和LinkedHashSet区别
  6. HashMap和Hashtable的比较
  7. HashMap和ConcurrentHashMap区别
  8. HashMap 底层实现原理
  9. HashMap和LinkedHashMap的区别?
  10. ArrayList/LinkedList /HashMap初始大小,add后是多少?(jdk1.8)

一、JAVA中集合和数组的区别

数组:定义:相同数据类型的集合。缺点:声明数组长度是固定的。
集合:定义:相同数据类型的集合。优点:声明时不需要指定长度。(底层做了动态扩容问题)1. 数组声明了它容纳的元素的类型,集合默认是Object。
2. 数组一旦固定大小就无法改变容量,而集合是可以动态扩展容量。

二、Collection和Collections的区别

- Collection:是集合类的上级接口,继承与它的接口主要有Set、List
- Collcetions:针对集合类的一个帮助类,提供了一系列静态方法实现对各种集合的搜索、排序、线程安全等操作

三、ArrayList和LinkedList 和Vector的区别

类 别

ArrayList

Vector

LinkedList

数据结构

数组

数组

双向链表

优 点

查询快

查询快

增删快

缺点

增删慢

增删慢

查询慢

继 承 类

AbstractList

AbstractList

AbstractSequentialList

实 现 接 口

List, RandomAccess,Cloneable, Serializable

List, RandomAccess, Cloneable, Serializable

List, Deque, Cloneable, Serializable

线 程 安 全

不安全

被synchronized修饰,线程 安全

不安全

默 认 容 量

10

10

最 大 容 量

Integer.MAX_VALUE - 8

Integer.MAX_VALUE - 8

1 << 25

扩 增

1.5倍,不可设增长因子

2倍,可设增长因子

\

使 用 场 景

频繁查找元素(单线程)

频繁查找元素(多线程)

频繁增删元素(单线 程)

1.线程安全Vector : 线程安全ArrayList, LinkedList : 线程不安全
2.实现⽅式LinkedList : 链表,比基于数组更节省空间ArrayList,Vector : 数组
3.扩容ArrayList和Vector使⽤数组实现, 当数组长度不够,内部会创建⼀个更大的数组LinkedList 不存在这⽅⾯的问题
4.速度ArrayList 查改快, 增删慢LinkedList 查改慢, 增删快

四、list/set/map的区别

list/set/map都是各自集合的接口。

本文中的有序指的是添加顺序和遍历顺序一致,称为有序。

类别

list

set

map

元素顺序

有序

无序

无序

元素去重

可以

不可以

键唯一,value可以重复

collection接口

继承

继承

并列

总结:

List:1.可以允许重复的对象。2.可以插入多个null元素。3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
Set:1.不允许重复对象2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。3. 只允许一个 null 元素4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
Map:1.Map不是collection的子接口或者实现类。Map是一个接口。2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

五、HashSet和TreeSet和LinkedHashSet区别

类别

HashSet

TreeSet

LinkedHashSet

数据结构

hash表

链表

元素顺序

无序

有序

有序

null值存在

一个

不可以

一个

时间复杂度

1

n

1

线程安全

不安全

不安全

不安全

HashSet:1、无序 2、非线程安全 3、集合元素中可以存放一个null
TreeSet:1、默认自然顺序的有序集合 2、非线程安全 3、不可以存放null元素
LinkedHashSet:1、保存元素添加顺序的有序集合 2、非线程安全

六、HashMap和Hashtable的比较

类别

HashMap

Hashtable

父类

AbstractMap

Dictionary

遍历Iterator

fail-fast迭代器

1.8前:Enumeration

线程

不安全

安全:Synchronize、modCount++

null值

可以

不可以

容量扩增

16、2:计算效率

11、2n+1:哈希冲突减少

方法

/

多elments() 和contains() 两个方法

1、HashTable 线程安全,HashMap 非线程安全
2、Hashtable 不允许 null 值(key 和 value 都不可以),HashMap 允许 null 值(key 和 value 都可以)。
3、两者的遍历方式大同小异,Hashtable 仅仅比 HashMap 多一个 elements 方法

七、HashMap和ConcurrentHashMap区别

类 别

HashMap

ConcurrentHashMap

底 层 结 构

1.8前:列表+链表 1.8:列表+链 表+红黑树(链表长度到8)

1.7:数组+链表 1.8:数组+链表+红黑树

线 程

不安全

安全:分段锁、CAS+Synchronized

扩 增

默认初始值16、扩容因子: 0.75(时间与空间一个平衡值), 扩容一倍

段内元素超过该段对应Entry数组长度的75%触发扩 容,不会对整个Map进行扩容 ConcurrentHashMap

null 值

可以

不可以

总结:
1、ConcurrentHashMap是线程安全的,HashMap不是线程安全的
2、HashMap允许键和值为null,ConcurrentHashMap不允许
3、HashMap在用Iteroctor遍历的同时,不允许修改HashMap,ConcurrentHashMap允许该行为,并且对后续的遍历是可见的
(CurrentHashMap使用的是分段锁,效率高于HashTable,且是线程安全)

八、HashMap 底层实现原理

具体详细可参考:HashMap原理讲解

一、HashMap基本描述
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。并且不保证映射的顺序。1.1HashMap的数据结构?
哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树
1.2HashMap的工作原理?
HashMap(底层采用数组+链表),采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,依次来解决Hash冲突的问题,因为HashMap是按照Key的hash值来计算Entry在HashMap中存储的位置的,如果hash值相同,而key内容不相等,那么就用链表来解决这种hash冲突。
1.3HashMap的put实现过程?
HashMap通过put&get方法存储和获取。我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put(key, value)方法传递键和值时,它先调用key.hashCode()方法,得到hash值,然后结合数组长度,计算得数组下标,用于找到bucket位置,来储存Entry对象。
如果hash值在HashMap中不存在,则执行插入,若存在,则发生碰撞,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。
如果hash值在HashMap中存在,且它们两者equals返回true,则更新键值对。
如果HashMap集合中的键值对大于12,调用resize方法进行数组扩容。
1.4HashMap的get实现过程?
从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
底层的数据结构:HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。
1.5 JDK8中什么时候会转为红黑树?
如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)。

九、HashMap和LinkedHashMap的区别?

LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
LinkedHashMap是线程不安全的,HashMap不是线程安全的

十、ArrayList/LinkedList /HashMap初始大小,add后是多少?(jdk1.8)

类型

ArrayList

LinkedList

HashMap

默认

[]数据 0

0

16

扩容

1.5

0.75因子、2倍

最大

Integer.MAX_VALUE - 8

1 << 30

ArrayList: jdk1.8之后:
1.ArrayList初始集合不初始化数组容量的时候,默认值为0
2.添加元素后,扩容为10,之后每次扩容为原来的0.5倍
LinkedList :
是一个双向链表,无初始大小,无扩容机制,直接添加即可
HashMap:
HashMap 初始化大小是 16 ,扩容因子默认0.75(可以指定初始化大小,和扩容因子)
扩容机制.(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍(*2)。

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

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

相关文章

50道Java集合经典面试题(收藏版)

前言 来了来了&#xff0c;50道Java集合面试题也来啦~ 已经上传github: https://github.com/whx123/JavaHome 1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。随机访问的时候…

Java——12个关于Java中集合的面试题

文章目录&#xff1a; 1.请问 ArrayList、HashSet、HashMap 是线程安全的吗&#xff1f;如果不是怎么获取线程安全的集合&#xff1f; 2.ArrayList内部用什么实现的&#xff1f; 2.1 无参构造源码分析 2.2 有参构造源码分析&#xff08;参数为容量&#xff09; 2.3 有参构…

Java面试题总结 - Java集合篇(附答案)

目录 一、Java 容器都有哪些&#xff1f; 二、Collection 和 Collections 有什么区别&#xff1f; 三、list与Set区别 四、HashMap 和 Hashtable 有什么区别&#xff1f; 五、说一下 HashMap 的实现原理&#xff1f; 六、set有哪些实现类&#xff1f; 七、说一下 HashSet…

【面试】Java集合面试题

文章目录 集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些&#xff1f;List&#xff0c;Set&#xff0c;Map三者的区别&#xff1f;集合框架底层数据结构哪些集合类是线程安全的&#xff1f;Java集合的快速失败机制 “fail-fast”&…

面试题----集合

目录 概述 List,Set,Map 集合框架底层数据结构总结 List Set Map 为什么要使⽤集合&#xff1f; 如何选⽤集合? 迭代器 Iterator 是什么&#xff1f; 迭代器 Iterator 有啥⽤&#xff1f; Iterator 和 ListIterator 的区别是什么&#xff1f; 有哪些集合是线程不安…

Java集合面试题(总结最全面的面试题!!!)

文章目录 集合概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些&#xff1f;List&#xff0c;Set&#xff0c;Map三者的区别&#xff1f;集合框架底层数据结构哪些集合类是线程安全的&#xff1f;Java集合的快速失败机制 “fail-fast”&#xff…

50道关于Java的集合经典面试题

1. Arraylist与LinkedList区别 可以从它们的底层数据结构、效率、开销进行阐述哈 ArrayList是数组的数据结构&#xff0c;LinkedList是链表的数据结构。随机访问的时候&#xff0c;ArrayList的效率比较高&#xff0c;因为LinkedList要移动指针&#xff0c;而ArrayList是基于索…

JAVA集合一些面试题

集合是程序员在面试的时候很大可能都会被问到。虽然集合不怎么困难&#xff0c;但是能把他仔细划分却又稍显困难。这里稍微搜罗了一些有关集合的面试题来进行分享。 我们先通过一张思维导图认识一下集合的框架构成&#xff0c;方便理解和记忆。 下面简单的归纳了一下给大家整…

集合面试问题总结

简述Java中的集合 集合类存放于 Java.util 包中&#xff0c;主要有 3 种&#xff1a;set(集&#xff09;、list(列表包含 Queue&#xff09;和 map(映射)。 Collection&#xff1a;Collection 是集合 List、Set、Queue 的最基本的接口。 Iterator&#xff1a;迭代器&#xff0…

java集合详解和集合面试题目

一、集合与数组 数组&#xff08;可以存储基本数据类型&#xff09;是用来存现对象的一种容器&#xff0c;但是数组的长度固定&#xff0c;不适合在对象数量未知的情况下使用。 集合&#xff08;只能存储对象&#xff0c;对象类型可以不一样&#xff09;的长度可变&#xff0…

Java集合的常见面试题(全)

这里写目录标题 前言常用的集合类有哪些集合底层数据结构ArrayList 和 LinkedList 的区别HashSet 如何检查重复HashSet与HashMap的区别HashMap 和 Hashtable 的区别HashMap 的底层实现HashMap 的长度为什么是 2 的幂次方ConcurrentHashMap 和 Hashtable 的区别HashMap源码细节C…

集合面试题总结

集合 Collection接口&#xff1a;单列集合&#xff0c;用来存储一个一个的对象 List接口&#xff1a;存储有序的、可重复的数据&#xff0c;。 -->“动态”数组 实现类&#xff1a;ArrayList、LinkedList、Vector Set接口&#xff1a;存储无序的、不可重复的数据 实现类&…

10道集合框架面试题(含解析),来看看你会多少

1.Arraylist 与 LinkedList 异同 &#xff08;1&#xff09;是否保证线程安全&#xff1a; ArrayList 和 LinkedList 都是不同步的&#xff0c;也就是不保证线程安全&#xff1b; &#xff08;2&#xff09;底层数据结构&#xff1a; Arraylist 底层使用的是Object数组&#…

Java集合面试题(总结最全面的面试题)

集合容器概述 什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用&#xff0c;而不是对象的本身 集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)。 集合的特点 集合的特点…

Python编程练习与解答 练习65:温度换算表

编写一个程序&#xff0c;显示摄氏温度和华氏温度转换表。该表的行包括0-100摄氏度之间所有的温度&#xff0c;这些温度时10摄氏度的倍数&#xff0c;列上适当的标题&#xff0c;摄氏度和华氏度之间的换算公式可在互联网上找到。 # 转换公式为&#xff1a;f(&#xff08;c*9)/…

java语言【 #93. 温度换算】(已通过)

题目描述 ​ 读入一个实数表示的摄氏温度 C&#xff0c;将它转换为华氏温度 F 并输出。​ 公式如下&#xff1a; F1.8∗C32 输入 ​ 一个实数表示 C&#xff08;0.0≤C≤100.0&#xff09; 输出 ​ 将 C 转换成 F 的结果。 ​ 结果保留两位小数 样例输入 66.66样例输出 151…

热敏电阻-温度换算算法(分段线性拟合法)

概要 在工业上&#xff0c;会有各种读取环境温度&#xff0c;或读取目标物体温度的需求&#xff0c;通常用到的方案有&#xff1a;传感器测温&#xff1b;热敏电阻测温等。本篇着重讲解使用热敏电阻测温的方法。 热敏电阻 何为热敏电阻&#xff1f;热敏电阻即为热电偶传感器…

摄氏温度和华氏温度换算(vb源码)

【实例简介】初步涉及VB 【实例截图】 文件&#xff1a;590m.com/f/25127180-493490306-f0ccf8&#xff08;访问密码&#xff1a;551685&#xff09; 以下内容无关&#xff1a; -------------------------------------------分割线----------------------------------------…

DS18b20温度值换算

DS18B20 处理正负温度值。 寄存器格式 例子 //计算温度值 //参数 高字节&#xff0c;低字节 double CaculateTemp(uint8_t tmh, uint8_t tml) {uint8_t th;uint8_t tl;double temp 0;tl tml & 0x0F;//取低字节后四位th (tmh << 4) (tml >> 4);//取高字节后…

用Python制作温度换算模块

&#xff08;注&#xff1a;这里通用摄氏度&#xff0c;Python版本为3.8.5&#xff09; 今天教大家做一个温度换算模块&#xff0c;非常简单实用。 这张图是最终效果&#xff1a; &#xff08;CK指将摄氏度转换为开氏度&#xff0c;CRe指将摄氏度转换为列氏度&#xff09; …