目录

  • 面试题一:Java中有哪些容器(集合类)?
    • 追问:Java中的容器,线程安全和线程不安全的分别有哪些?
  • 面试题二: HashMap 的实现原理/底层数据结构? JDK1.7 和 JDK1.8
    • 追问一:当new一个HashMap的时候,会发生什么吗?
    • 追问二:描述一下 Map put 的过程
    • 追问三: JDK 7和 JDK 8中的 HashMap 有什么区别?
    • 追问四:HashMap默认加载因子是多少?为什么是 0.75,不是0.6 或者 0.8 ?
  • 面试题三:hash 碰撞是什么以及如何解决

面试题一:Java中有哪些容器(集合类)?

Java 中的集合类主要由「Collection」和「Map」这两个接口派生而出,其中 Collection 接口又派生出三个子接口,分别是 Set、List、Queue。所有的 Java 集合类,都是 Set、List、Queue、Map 这四个接口的实现类,这四个接口将集合分成了四大类,其中 Set 代表无序的,元素不可重复的集合;List 代表有序的,元素可以重复的集合;Queue 代表先进先出(FIFO)的队列;Map 代表具有映射关系(key-value)的集合
这些接口拥有众多的实现类,其中最常用的实现类有HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap等。


注:紫色框体代表接口,白色框体代表实现类,其中带有灰色的是常用实现类。

追问:Java中的容器,线程安全和线程不安全的分别有哪些?

java.util 包下的集合类大部分都是线程不安全的,例如我们常用的「HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap」这些都是线程不安全的集合类,但是它们的优点是性能好。如果需要使用线程安全的集合类,则可以使用「Collections 工具类提供的 synchronizedXxx()」方法,将这些集合类包装成线程安全的集合类。

java.util 包下也有线程安全的集合类,例如 Vector、Hashtable。这些集合类都是比较古老的 API,虽然实现了线程安全,但是性能很差。所以即便是需要使用线程安全的集合类,也建议将线程不安全的集合类包装成线程安全集合类的方式,而不是直接使用这些古老的 API。

从 Java5 开始,Java 在 java.util.concurrent 包下提供了大量支持高效并发访问的集合类,它们既能包装良好的访问性能,有能包装线程安全。这些集合类可以分为两部分,它们的特征如下:

  • 以 Concurrent 开头的集合类:以 Concurrent 开头的集合类代表了支持并发访问的集合,它们可以支持多个线程并发写入访问,这些写入线程的所有操作都是线程安全的,但读取操作不必锁定。以 Concurrent 开头的集合类采用了更复杂的算法来保证永远不会锁住整个集合,因此在并发写入时有较好的性能。
  • 以 CopyOnWrite 开头的集合类:以 CopyOnWrite 开头的集合类采用复制底层数组的方式来实现写操作。当线程对此类集合执行读取操作时,线程将会直接读取集合本身,无须加锁与阻塞。当线程对此类集合执行写入操作时,集合会在底层复制一份新的数组,接下来对新的数组执行写入操作。由于对集合的写入操作都是对数组的副本执行操作,因此它是线程安全的。

面试题二: HashMap 的实现原理/底层数据结构? JDK1.7 和 JDK1.8

JDK1.7: Entry数组 + 链表
JDK1.8: Node 数组 + 链表/红黑树,当链表上的元素个数超过「8」个并且数组长度「>= 64」时自动转化成红黑树,节点变成树节点,以提高搜索效率和插入效率到 O(logN)。
Entry 和 Node 都包含 key、 value、 hash、 next 属性。

追问一:当new一个HashMap的时候,会发生什么吗?

HashMap 有几个构造方法,但最主要的就是指定初始值大小和负载因子的大小。如果我们不指定,默认HashMap的大小为16,负载因子的大小为0.75

HashMap 的大小只能是「2次幂」的,假设你传一个 10 进去,实际上最终 HashMap 的大小是 16,你传一个 7 进去,HashMap 最终的大小是 8 ,具体的实现在「tableSizeFor」可以看到。

我们把元素放进 HashMap 的时候,需要算出这个元素所在的位置(hash),在 HashMap 里用的是位运算来代替取模,能够更加高效地算出该元素所在的位置。为什么 HashMap 的大小只能是 2 次幂,因为只有大小为 2 次幂时,才能合理用位运算替代取模。
负载因子的大小决定着哈希表的扩容和哈希冲突。

比如现在 我默认的 HashMap 大小为 16,负载因子为 0.75,这意味着数组最多只能放 12 个元素,一旦超过 12 个元素,则哈希表需要扩容。怎么算出是 12 呢?很简单,就是「16*0.75」。每次 put 元素进去的时候,都会检查HashMap 的大小有没有超过这个阈值,如果有,则需要扩容。

鉴于上面的说法(HashMap 的大小只能是 2 次幂),所以扩容的时候时候默认是扩原来的 2 倍。扩容这个操作肯定是耗时的,那能不能把负载因子调高一点,比如我要调至为 1,那我的 HashMap 就等到 16 个元素的时候才扩容呢。是可以的,但是不推荐。负载因子调高了,这意味着哈希冲突的概率会增高,哈希冲突概率增高,同样会耗时(因为查找的速度变慢了) 。

追问二:描述一下 Map put 的过程

直接看这个->> 画了一张图,简单描述了一下 HashMap 的 put 方法的执行过程

追问三: JDK 7和 JDK 8中的 HashMap 有什么区别?

JDK7 中的 HashMap ,是基于「数组+链表」来实现的,它的底层维护一个「Entry数组」。它会根据计算的hashCode 将对应的「KV键值对」存储到该数组中,一旦发生 hashCode 冲突,那么就会将该 KV 键值对放到对应的已有元素的后面, 此时便形成了一个链表式的存储结构。

JDK7 中 HashMap 的实现方案有一个明显的缺点,即当 Hash 冲突严重时,在桶上形成的链表会变得越来越长,这样在查询时的效率就会越来越低,其时间复杂度为O(N)。

JDK8 中的 HashMap,是基于「数组+链表+红黑树」来实现的,它的底层维护一个「Node」数组。当链表的存储的数据个数大于等于 8 的时候,不再采用链表存储,而采用了红黑树存储结构。这么做主要是在查询的时间复杂度上进行优化,链表为O(N),而红黑树一直是O(logN),可以大大的提高查找性能。

追问四:HashMap默认加载因子是多少?为什么是 0.75,不是0.6 或者 0.8 ?

默认的 loadFactor 是 0.75,0.75 是对空间和时间效率的一个平衡选择,一般不要修改,除非在时间和空间比较特殊的情况下 :

  • 如果内存空间很多而又对时间效率要求很高,可以降低负载因子 Load factor 的值 。
  • 相反,如果内存空间紧张而对时间效率要求不高,可以增加负载因子loadFactor的值,这个值可以大于 1 。

面试题三:hash 碰撞是什么以及如何解决

直接看这个->> 大白话解释hash碰撞是什么以及如何解决

Java岗面试题--Java基础(日积月累,每日三题)相关推荐

  1. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day38】—— 实战那些事儿2

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

  2. java并发面试题(一)基础

    转载:http://ifeve.com/javaconcurrency-interview-questions-base/java并发面试题(一)基础 本文整理了常见的Java并发面试题,希望对大家面 ...

  3. 2022年最新Java工程师面试题从基础到中级到高级

    2022年最新Java工程师面试题从基础到中级到高级 一.基础 Java面向对象有哪些特征,如何应用 面向对象编程是利用类和对象编程的一种思想.万物可归类,类是对于世界事物的高度抽象 ,不同的事物之间 ...

  4. Java常见面试题 Java面试必看 (一)

    本篇博客是本人收集网上Java相关的资料整理所得,仅供参考. 一.Java基础 1.JDK 和 JRE区别 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java ...

  5. Java常见面试题 Java面试必看 (二)

    Java常见面试题 Java面试必看 (一) 十一.Spring Boot/Spring Cloud 104.什么是 spring boot? Spring Boot 是由 Pivotal 团队提供的 ...

  6. 2020PMP(第六版)每日三题

    PMP12月份考试已经顺利通过,这里将平时积累的每日三题发出来供大家分享:(结尾分享一点考试心得体会) 一.题目部分: 2020.9.27 三题: 1.项目是: A. 一组持续的活动中执行的一个过程或 ...

  7. 每日三题 12.20

    群公告 2022.12.19每日三题答案BDD 1.项目可交付成果已移交给客户,项目经理现在必须收集项目参与者的反馈意见.项目经理  应该查阅哪份文件来确定哪些人应该被包含进请求反馈意见的名单中?  ...

  8. 网络黑客攻防学习平台之基础关第三题

    网络黑客攻防学习平台之基础关第三题 : 页面地址:http://hackinglab.cn/ShowQues.php?type=bases 给出的是一段base64加密后的密文,根据标题,肯定是多次加 ...

  9. Java岗大厂面试百日冲刺【Day46】— Linux2 (日积月累,每日三题)

      大家好,我是陈哈哈,北漂五年.相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍 ...

最新文章

  1. 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎
  2. kmeans及模型评估指标_模型评估常用指标
  3. oracle并行parallel update两张表_Oracle并行更新的两种方式(merge/update内联视图)
  4. 华为手机升级回退_华为鸿蒙OS 2.0手机开发者Beta版支持Mate 30/P40系列OTA升级
  5. 8.IDA-数据与代码、函数互相转换
  6. 数据库经典DB2在技术前沿展现王者风范
  7. 腾讯手游助手android版本,腾讯游戏助手下载-腾讯游戏助手 安卓版v3.3.4.22-PC6安卓网...
  8. 设有n个正整数,将他们连接成一排,组成一个最大的多位整数
  9. oracle--Tracing PL/SQL subprogram calls with parameters values--Mahmoud Hatem,
  10. linux基础命令游戏,LINUX-基础命令(三)
  11. 【转】无需刻录DMG光盘,教你在VMWare下安装MAC OS X Snow Leopard 10.6
  12. 第四章_思科ASDM网管系统搭建(java环境,jdk环境)
  13. 推荐系列:易文档,让接口文档更加给力
  14. 关于蓝牙无线通信与AOA定位技术
  15. 定时任务:springboot集成Quartz实现多任务多触发的动态管理
  16. 【uniapp】icon图标的使用
  17. IRPT_TAS用户协议
  18. antd Upload 文件上传
  19. Win10 L2TP连接不上的解决办法
  20. k8s常见报错解决--持续更新

热门文章

  1. 测试老鸟都在用的接口抓包常用工具以及接口测试工具都有哪些?
  2. 【论文】如何记论文笔记
  3. 智能窗帘控制(光、红外、时间)
  4. 【Android】虚拟环绕声
  5. 【历史上的今天】12 月 8 日:D 语言发布;“复制粘贴”的发明者逝世;人人网成立
  6. 人人都能学会系列之ThreadLocal
  7. Android Studio设置-单行注释格式化时的缩进处理
  8. px rpx pt em rem单位
  9. [牛客网] 电话号码
  10. table表格首列首行固定