1. HashMap的内部实现原理是什么?

HashMap内部实现原理是数组+链表,通过散列算法将key值散列到数组中,如果到相同的位置,则通过拉链法解决散列冲突。在JDK8中新增了红黑树结构,当HashMap中的散列冲突链表结构超过8个数据时,会从链表结构转换为红黑树结构。

2. HashMap的key值能否是null,如果能,key=null如何存储以及如何读取的?如果不能,为什么?

HashMap的key值可以是null。如果key=null,则会将它放置在数组下标为0的位置。

3. HashMap如何实现扩容?

HashMap扩容和初始容器大小与负载因子有关。HashMap的初始容器大小为16,默认的负载因子为0.75,当实际容量超过16*0.75=12个元素时会进行扩容。扩容后的容器大小是扩容前的2倍,第一次扩容后的容器大小为32。

4. 设置HashMap的容量有没有注意的地方,为什么?

指定HashMap的容量时,建议是2的幂次方。

HashMap在寻址是会key的hash值与容器长度做与运算,(n - 1) & hash。当n的长度为2的幂次方时,n-1的二进制形式就会是111111,这样与操作效率会非常的快。

5. HashMap是否是线程安全的?如果不是,多线程下并发操作它可能会带来什么问题?如果是,它是怎么实现的?

HashMap不是线程安全的。如果在多线程下并发操作不仅会导致脏数据,甚至可能会造成死循环。(关于死循环产生的原因参考https://www.cnblogs.com/yulinfeng/p/8558983.html

6. LinkedHashMap的内部实现原理是什么?它是否支持key=null?

LinkedHashMap是插入有序的Map集合。它直接继承了HashMap,所以很多都直接复用了HashMap方法,所以也支持key=null。它在内部除了沿用HashMap的底层结构,还单独维护了一个双向链表,在对Map进行put操作时,同时还会将数据写到了链表的尾部,保证了插入有序。

7. TreeMap的内部实现原理是什么?它是否支持key=null?

TreeMap结构也是有序的,不同的是它是字典有序,由于它底层是红黑树结构,插入时会进行比较key值的顺序,所以不允许key=null的情况。

8. 介绍下Hashtable

Hashtable是线程安全的Map类型,但它的线程安全代价是为整个散列表加锁,效率很低,几乎已经废弃。如果要使用线程安全的Map,应该使用ConcurrentHashMap,它的实现是分段锁,能最大的提高效率。

9. 以上三种Map类型分别可以应用到哪些场景?你在哪些场景下使用过?

HashMap的使用场景很多,这个使用场景就太多了,比如用作本地缓存。

LinkedHashMap因为它的链表结构可以实现LRU(最近最少使用),即缓存空间有限,当元素多余缓存空间,可淘汰掉最近最少使用的元素。在LinkedHashMap维护了一个accessOrder字段,默认为false,当设置为true时,如果访问一个key值,就会将这个元素放置链表头部,这样在链表尾部的元素就是不常用的元素,空间不足直接remove末尾的元素即可。所以当要实现LRU缓存时,就可以将accessOrder设置为true实现。

TreeMap没有实际应用过,如果有需要排序的场景则使用TreeMap

Set

10. HashSet的内部实现原理是什么,它有什么特点?

HashSet集合的特点是不允许有重复的元素,且无序的,允许null值。它在内部维护一个HashMap,存储在HashSet中的元素实际上存储在HashMap的key中。

11. LinkedHashSet的内部实现原理是什么,它有什么特点?

LinkedHashSet继承自HashMap,在内部维护一个双向链表保证插入有序,允许null值。

12. TreeSet的内部实现原理是什么,它有什么特点?

TreeSet是一个有序的集合,它的作用是提供有序的Set集合,TreeSet是基于TreeMap实现的。不允许有null值。

13. 以上三种Set类型分别可以应用到哪些场景?你在哪些场景下使用过?

HashSet可应用于批量查询时去重。

如果需要返回的数据和入参的数据顺序一致则可以使用LinkedHashSet。

List

14. ArrayList的内部实现原理什么?

底层通过数组实现,创建一个ArrayList对象实例时不会初始化数组,当插入第一条数据时会创建一个大小为10的数组。

15. 既然ArrayList的底层实现是数组,那定义ArrayList时,需要定义它的大小吗?

可以不用定义容器的大小,默认大小为10,当容量大小不足时此时将会进行扩容。

16. ArrayList的扩容机制是什么?

每次新增的容量是旧容量的一半,扩容后调用System.arraycopy方法拷贝到新的数组。

17. 如果初始化ArrayList时,定义一个容量大小为11,此时扩容了几次,容量大小为16呢?

不进行扩容。

18. LinkedList的内部实现原理是什么?

底层通过链表实现,所以不存在扩容。

19. Vector和ArrayList、LinkedList的区别?

Vector是线程安全的额,ArrayList、LinkedList不是线程安全的。Vector的线程安全是为每个方法加上synchronized关键字,效率不高,不常用。

20. ArrayList与LinkedList分别可以应用到哪些场景?

大多数情况下使用ArrayList,因为ArrayList是数组实现,它随机读取的速度更快,但插入指定位置慢;LinkedList由于是链表实现,所以随机读取的速度慢,但插入指定位置快。

关注CoderBuff公众号,回复“面试”获取更多

JDK集合面试20问的更多相关文章

  1. Dubbo面试20问!这些题你都遇到过吗?

    作者:Dean Wang https://deanwang1943.github.io/bugs/2018/10/05/面试/饿了么/dubbo 面试题/ 1.dubbo是什么 dubbo是一个分布式 ...

  2. 30 个 Java 集合面试问题及答案

    30 个 Java 集合面试问题及答案 Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 1.Java集合框架是什么 ...

  3. 最近找java实习面试被问到的东西总结(Java方向)

    时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...

  4. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  5. 有关 HashMap 面试会问的一切

    前言 HashMap 是无论在工作还是面试中都非常常见常考的数据结构. 比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache ...

  6. powershell玩转xml之20问

    powershell玩转xml之20问 powershell 传教士 原创文章 2014-01-30,2015-10-27改 允许转载,但必须保留名字和出处,否则追究法律责任 问:xml文件编码情况如 ...

  7. 面试被问烂的 Spring IOC(求求你别再问了)

    广义的 IOC IoC(Inversion of Control) 控制反转,即"不用打电话过来,我们会打给你". 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 D ...

  8. 最近面试被问到一个问题,AtomicInteger如何保证线程安全?

    最近面试被问到一个问题,AtomicInteger如何保证线程安全?我查阅了资料 发现还可以引申到 乐观锁/悲观锁的概念,觉得值得一记. 众所周知,JDK提供了AtomicInteger保证对数字的操 ...

  9. JAVA程序员面试30问(附带答案)

    第一,谈谈final, finally, finalize的区别. 最常被问到.final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能 ...

随机推荐

  1. 后端 - Lession 01 PHP 基础

    目录 Lession 01 php 基础 1. php 基础 2. php 变量 3. php 单引号 和 双引号区别 4. 数据类型 5. 数据类型转换 6. 常量 7. 运算符 8. 为 fals ...

  2. [leetcode] #213 House Robber II Medium (medium)

    原题链接 比子母题House Robber多了一个条件:偷了0以后,第n-1间房子不能偷. 转换思路为求偷盗[0,n-1)之间,以及[1,n)之间的最大值. 用两个DP,分别保存偷不偷第0间房的情况. ...

  3. 【译】宣告推出.NET Core 3.0 Preview 7(英雄的黎明)

    今天,我们宣布推出.NET Core 3.0 Preview 7.我们已经从创建新特性阶段过渡到了完善版本阶段.对于其余的预览版,我们将把重点放在质量(改进)上. 在Windows,macOS和Lin ...

  4. Webpack打包效率优化篇

    Webpack基础配置: 语法解析:babel-loader 样式解析:style-loader css解析:css-loader less解析:less-loader 文件解析:url-loader ...

  5. python课堂整理1

      1.变量 变量只能由字母.数字.下划线组成 特例:1.变量不能用数字开头    2.不能是python的关键字 3.最好不要和python内置的东西重复 让变量名有意义 些 python3的关键字 ...

  6. gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

    现如今微服务很流行,而微服务很有可能是使用不同语言进行构建的.而微服务之间通常需要相互通信,所以微服务之间必须在以下几个方面达成共识: 需要使用某种API 数据格式 错误的模式 负载均衡 ... 现在 ...

  7. Linux平台 Oracle 19c RAC安装Part2:GI配置

    三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面配置GI 3 ...

  8. C++单继承、多继承情况下的虚函数表分析

    C++的三大特性之一的多态是基于虚函数实现的,而大部分编译器是采用虚函数表来实现虚函数,虚函数表(VTAB)存在于可执行文件的只读数据段中,指向VTAB的虚表指针(VPTR)是包含在类的每一个实例当中 ...

  9. Git/Github使用方法小记

    今天把人间网的桌面客户端renjian-deck正式开源了,之前对javascript的了解其实非常的不够的,所以这一次的代码写的也是乱七八糟重用性及其低下,虽然我无数次的想把代码重新整理一下,不过还 ...

  10. [AI开发]目标检测之素材标注

    算力和数据是影响深度学习应用效果的两个关键因素,在算力满足条件的情况下,为了到达更好的效果,我们需要将海量.高质量的素材数据喂给神经网络,训练出高精度的网络模型.吴恩达在深度学习公开课中提到,在算力满 ...