Java集合相关面试题

这篇具有很好参考价值的文章主要介绍了Java集合相关面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

目录

一,Java集合框架体系

 二,List相关面试题

1,数组的定义

 面试题:为什么数组索引从0开始呢?假如从1开始不行吗?​编辑

操作数组的时间复杂度

 总结

 2,ArrayList源码分析

 1,成员变量

 2,构造方法

3,添加操作 

 面试题1:ArrayList底层的实现原理是什么?

面试题2:ArrayLisst list = new ArrayList(10)中list扩容几次了?

 面试题3:如何实现数组和List之间的转换?(注意是否存在影响)

 3,LinkedList

1,单向链表

 2,双向链表

面试题:ArrayList和LinkedList有什么不同?

 三,HashMap相关面试题

 1,相关数据结构

1,二叉搜索树

 2,红黑树

 3,散列表(哈希表Hash Table)

 2,Hash相关面试题

面试题:请你说说HashMap的实现原理?

 面试题:HashMap的jdk1.7和jdk1.8有什么区别?

面试题:HashMap的put方法的具体执行流程?

 面试题:HashMap的扩容机制原理

 面试题:HashMap的寻址算法​编辑

面试题:为何HashMap的数组长度一定是2的次幂? 

 面试题:HashMap在1.7情况下的多线程死循环问题是什么?

四,ConcurrentHashMap相关面试题

1,ConcurrentHashMap 线程安全的具体实现方式/底层具体实现

1,JDK1.8之前

2,JDK1.8之后

2,JDK 1.7 和 JDK 1.8 的 ConcurrentHashMap 实现有什么不同?

五,HashTable相关面试题

1,HashTable有什么特点?

2,HashMap和HashTable有什么区别?

3,HashTable和ConcurrentHashMap有什么区别


一,Java集合框架体系

Java集合相关面试题

 二,List相关面试题

Java集合相关面试题

1,数组的定义

Java集合相关面试题

Java集合相关面试题

 面试题:为什么数组索引从0开始呢?假如从1开始不行吗?Java集合相关面试题

操作数组的时间复杂度

1,查找

随机查询(根据索引查询): O(1)

未知索引查询:

        顺序查询:O(n)

        二分查找(有序数组):O(log n)

2,删改

因为数据是一段连续的内存空间,因此为了保准数组的连续性会使得数据的插入和删除效率变得很低(需要移动元素)

 Java集合相关面试题

 总结

Java集合相关面试题

 2,ArrayList源码分析

Java集合相关面试题

 1,成员变量

Java集合相关面试题

 2,构造方法

Java集合相关面试题

3,添加操作 

Java集合相关面试题

1,第1添加,初始化(第一次添加数据-扩容情况)

Java集合相关面试题

 2,第2-10次添加数据(无扩容)

Java集合相关面试题

 3,第11次添加(扩容操作)

Java集合相关面试题

//Array.copyof()是一种数组复制拷贝方法,不同的数据类型
//使用了不同的实现,但是算法思路一样,且都用到了System.arraycopy
//下面以Int类型为例
public static int[] copyOf(int[] original, int newLength) {
    int[] copy = new int[newLength];
    System.arraycopy(original, 0, copy, 0,
            Math.min(original.length, newLength));
    return copy;
}

 面试题1:ArrayList底层的实现原理是什么?

Java集合相关面试题

面试题2:ArrayLisst list = new ArrayList(10)中list扩容几次了?

Java集合相关面试题

 面试题3:如何实现数组和List之间的转换?(注意是否存在影响)

Java集合相关面试题

 3,LinkedList

1,单向链表

Java集合相关面试题

Java集合相关面试题

Java集合相关面试题 Java集合相关面试题

 2,双向链表

Java集合相关面试题

 Java集合相关面试题

 Java集合相关面试题

面试题:ArrayList和LinkedList有什么不同?

一共四个点回答:

  1. 底层数据结构
  2. 操作效率
  3. 内存空间利用率
  4. 线程安全

Java集合相关面试题

Java集合相关面试题

 三,HashMap相关面试题

Java集合相关面试题

 1,相关数据结构

1,二叉搜索树

Java集合相关面试题

Java集合相关面试题

 Java集合相关面试题

 Java集合相关面试题

 2,红黑树

Java集合相关面试题

Java集合相关面试题

Java集合相关面试题

 3,散列表(哈希表Hash Table)

Java集合相关面试题

 Java集合相关面试题

Java集合相关面试题

Java集合相关面试题

Java集合相关面试题

1,数据+链表 实现散列表存在的问题 

Java集合相关面试题

 2,数据+链表+红黑树 解决退化问题

Java集合相关面试题

 Java集合相关面试题

 总结:Java集合相关面试题

 2,Hash相关面试题

面试题:请你说说HashMap的实现原理?

Java集合相关面试题

 面试题:HashMap的jdk1.7和jdk1.8有什么区别?

  1. 底层数据结构:1.7中是数组+链表,1.8中是数组+链表+红黑树
  2. 链表插入方式:1.7是头插法,而1.8是尾插法
  3. 哈希算法复杂度:1.7更为复杂且耗性能(因为1.8采用了红黑树,散列性要求较低) 

Java集合相关面试题

 Java集合相关面试题

面试题:HashMap的put方法的具体执行流程?

Java集合相关面试题

 Java集合相关面试题

 Java集合相关面试题

Java集合相关面试题

  

 面试题:HashMap的扩容机制原理

流程图:

Java集合相关面试题

 总结:

Java集合相关面试题

链表拆分演示:

Java集合相关面试题

 面试题:HashMap的寻址算法Java集合相关面试题

面试题:为何HashMap的数组长度一定是2的次幂? 

Java集合相关面试题

 面试题:HashMap在1.7情况下的多线程死循环问题是什么?

Java集合相关面试题

 Java集合相关面试题

Java集合相关面试题

四,ConcurrentHashMap相关面试题

1,ConcurrentHashMap 线程安全的具体实现方式/底层具体实现

1,JDK1.8之前

Java集合相关面试题

首先将数据分为一段一段(这个“段”就是 Segment)的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。

ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成

Segment 继承了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。

一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的个数一旦初始化就不能改变Segment 数组的大小默认是 16,也就是说默认可以同时支持 16 个线程并发写

Segment 的结构和 HashMap 类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个 HashEntry 数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment 的锁。也就是说,对同一 Segment 的并发写入会被阻塞,不同 Segment 的写入是可以并发执行的。

2,JDK1.8之后

Java集合相关面试题

Java 8 几乎完全重写了 ConcurrentHashMap,代码量从原来 Java 7 中的 1000 多行,变成了现在的 6000 多行。

ConcurrentHashMap 取消了 Segment 分段锁,采用 Node + CAS + synchronized 来保证并发安全。数据结构跟 HashMap 1.8 的结构类似,数组+链表/红黑二叉树。Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N)))。

Java 8 中,锁粒度更细synchronized锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。

2,JDK 1.7 和 JDK 1.8 的 ConcurrentHashMap 实现有什么不同?

  • 线程安全实现方式:JDK 1.7 采用 Segment 分段锁来保证安全, Segment 是继承自 ReentrantLock。JDK1.8 放弃了 Segment 分段锁的设计,采用 Node + CAS + synchronized 保证线程安全,锁粒度更细,synchronized 只锁定当前链表或红黑二叉树的首节点。
  • Hash 碰撞解决方法 : JDK 1.7 采用拉链法,JDK1.8 采用拉链法结合红黑树(链表长度超过一定阈值时,将链表转换为红黑树【 O(N) -> O(log(N) 】)。
  • 并发度:JDK 1.7 最大并发度是 Segment 的个数,默认是 16。JDK 1.8 最大并发度是 Node 数组的大小,并发度更大。 

五,HashTable相关面试题

1,HashTable有什么特点?

在Java中,HashTable是一个线程安全的哈希表实现,它是Dictionary类的子类。HashTable使用键值对的方式存储数据,其中键和值都不能为null。它使用哈希算法来计算键的哈希值,并将键值对存储在哈希表的桶中。

HashTable的主要用途是在多线程环境下存储和访问数据,因为它的方法都是同步的,可以保证线程安全性。它可以用于存储缓存、共享数据、配置信息等。

推荐在以下场景下使用HashTable:

1. 多线程环境:当需要在多个线程中安全地存储和访问数据时,可以使用HashTable来保证线程安全性。

2. 简单的键值存储:如果只需要简单地存储键值对,而不需要复杂的功能,HashTable可以是一个简单且可靠的选择。

HashTable的优点:

  1.         1. 线程安全:HashTable的方法都是同步的,可以在多线程环境下使用。
    1.         2. 简单易用:HashTable提供了简单的键值存储功能,使用起来比较方便。

HashTable的缺点:

1. 性能较差:由于所有方法都是同步的,HashTable的性能相对较差,特别是在高并发环境下。

2. 不支持null值:HashTable不允许键或值为null,如果出现null值,会抛出NullPointerException。

常用操作方法:

  1.         1. put(key, value):将键值对存储到HashTable中。
    1.         2. get(key):根据键获取对应的值。
      1.         3. remove(key):根据键移除对应的键值对。
        1.         4. containsKey(key):判断HashTable中是否包含指定的键。
          1.         5. containsValue(value):判断HashTable中是否包含指定的值。
            1.         6. size():返回HashTable中键值对的数量。
              1.         7. clear():清空HashTable中的所有键值对。

需要注意的是,由于HashTable是线程安全的,使用时需要考虑同步的开销和性能问题。如果不需要线程安全性,推荐使用HashMap或ConcurrentHashMap来获得更好的性能。

2,HashMap和HashTable有什么区别?

1. 线程安全性:HashTable是线程安全的,而HashMap不是。HashTable的方法都是同步的,可以在多线程环境下使用,但由于同步操作的开销,性能较差。HashMap在多线程环境下需要通过其他手段来保证线程安全性,如使用ConcurrentHashMap。

2. Null:HashMap允许键和值都为null,而HashTable不允许。在HashMap中,可以使用null作为键或值,但在HashTable中,如果键或值为null,会抛出NullPointerException。

3. 继承关系:HashMap是HashTable的轻量级替代品,它实现了Map接口,而HashTable是Dictionary类的子类。

4. 初始容量和扩容机制:HashMap的初始容量为16,而HashTable的初始容量为11。HashMap在扩容时,容量会翻倍,而HashTable的容量会增加约一倍加一。

5. 迭代器:HashMap的迭代器是fail-fast的,即在迭代过程中,如果其他线程对HashMap进行修改,会抛出ConcurrentModificationException异常。而HashTable的迭代器不是fail-fast的。

总的来说,HashMap更常用,因为它的性能更好,但在多线程环境下需要注意线程安全性。而HashTable由于线程安全的特性,适合在多线程环境下使用,但性能较差。

3,HashTable和ConcurrentHashMap有什么区别?

ConcurrentHashMap和HashTable都是Java中用于存储键值对的数据结构,但它们在实现和用法上有一些异同。

相同点:

  1. 都是线程安全的:ConcurrentHashMap和HashTable都是线程安全的,可以在多线程环境下使用而无需额外的同步措施。
  2. 都实现了Map接口:ConcurrentHashMap和HashTable都实现了Map接口,提供了类似于HashMap的键值对存储和检索功能。

不同点:
        1. 同步机制:ConcurrentHashMap使用了锁分段技术(lock striping),将整个数据结构分成多个段(Segment)【jdk1.8之前使用Segment 数组 + HashEntry 数组 + 链表,而jdk1.8后,采用了Node数组+链表+红黑树实现,其实现锁的方式也改成了采用Node + CAS + synchronized】,每个段都有自己的锁。这样可以提高并发性能,多个线程可以同时访问不同的段,从而减少了线程之间的竞争。而HashTable则使用了全局同步锁(synchronize),即每次只能有一个线程访问整个数据结构,这可能会导致性能瓶颈。
        2. 迭代器:ConcurrentHashMap的迭代器是弱一致性的(weakly consistent),即在迭代过程中,如果有其他线程修改了数据结构,迭代器可能会抛出ConcurrentModificationException异常。而HashTable的迭代器是强一致性的(fail-fast),即在迭代过程中,如果有其他线程修改了数据结构,迭代器会立即抛出ConcurrentModificationException异常。
        3. null值和null键:ConcurrentHashMap允许null值和null键,而HashTable不允许null值和null键。

综上所述,ConcurrentHashMap在并发性能上优于HashTable,特别是在多线程环境下。因此,如果需要在多线程环境中使用键值对存储结构,推荐使用ConcurrentHashMap文章来源地址https://www.toymoban.com/news/detail-489912.html

到了这里,关于Java集合相关面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[数据结构]——集合框架

    Java集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: Map接口派生: Map代表的是存储key-value对的集合,可根据元素的key来访问value。  因此Java集合大致也可分成 List、Set、Queue、Map四种接口体系 。 List代表了有序可重复集合,可直接根据元素的索

    2024年02月11日
    浏览(30)
  • spring框架,以及和spring框架相关的Java面试题和spring ioc的注入方式

    目录 一.spring来源,以及介绍 1.spring诞生的背景 2.spring框架 介绍 3.spring框架在使用中的优点以及不足 3.1优点  3.2不足 3.3总结 4.为什么要使用spring  二.将spring框架部署在IDEA中  1.替换pom.xml  2.构建spring所需要的xml文件 三.spring的三种注入方式 0.定义需要的类,方法 1.方法注入

    2024年02月12日
    浏览(36)
  • 【从零开始学Java66】讲解Java集合中的Collection体系

    本文将为大家详细讲解Java中的Collection体系,这是我们进行开发时经常用到的知识点,也是大家在学习Java中很重要的一个知识点,更是我们在面试时有可能会问到的问题。 文章较长,干货满满,建议大家收藏慢慢学习。文末有本文重点总结,主页有全系列文章分享。技术类问

    2024年02月06日
    浏览(32)
  • 【从零开始学习JAVA | 第二十三篇】集合体系结构

    目录 前言: 单列集合:      set与list的区别: 双列集合: map的特点: 总结:                   JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这

    2024年02月16日
    浏览(47)
  • 【Java基础教程】(四十八)集合体系篇 · 上:全面解析 Collection、List、Set常用子接口及集合元素迭代遍历方式~【文末送书】

    掌握 Java 设置类集的主要目的以及核心接口的使用; 掌握 Collection 接口的作用及主要操作方法; 掌握 Collection 子接口 List、Set 的区别及常用子类的使用; 掌握 Map 接口的定义及使用; 掌握集合的4种输出操作语法结构; 掌握 Properties类的使用 ; 了解类集工具类 Collections 的作

    2024年02月15日
    浏览(45)
  • 体系化学习Java(Java面试专题)

    tip: 此贴为目录贴,定期更新 toNew: 时间是最好的答案,它能解决所有问题。坚持!!! ✌本文章旨在总结 Java 的知识生态以及帮助需要学习者和求职者,本人从事应用安全和大数据领域,有8年开发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌ 有

    2024年02月10日
    浏览(33)
  • java面试常问,zookeeper常见面试题

    什么是 Spring Boot? 为什么要用 Spring Boot? Spring Boot 的核心配置文件有哪几个?它们的区别是什么? Spring Boot 的配置文件有哪几种格式?它们有什么区别? Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 开启 Spring Boot 特性有哪几种方式? Spring Boot 需要独立的容器

    2024年03月15日
    浏览(51)
  • 【Java集合】面试题汇总

    答: Java 集合,也叫作容器,主要是由两大接口派生而来 Collection 接口 Map 接口 Java 集合框架如下图所示: 答: List :存储的元素是有序的、可重复的。 Set :存储的元素是无序的、不可重复的。 Queue :存储的元素可重复,元素先进先出。 Map :使用键值对(key-value)存储元

    2024年04月09日
    浏览(24)
  • java常见面试题:如何使用Java进行JPA框架开发?

    JPA(Java Persistence API)是一个Java平台的标准持久化API,它提供了一种标准的查询语言和API来将Java对象与关系数据库进行映射。 以下是使用Java进行JPA框架开发的详细步骤: 添加JPA依赖 首先,你需要在项目中添加JPA的依赖。如果你使用的是Maven项目,可以在pom.xml文件中添加以

    2024年01月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包