集合面试2

2024-05-07 19:08
文章标签 面试 集合

本文主要是介绍集合面试2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 1.HashMap 的长度为什么是2的幂次方
    

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash”。(n代表数组长度)。这也就解释了 HashMap 的长度为什么是2的幂次方。

  • 2.concurrentHashMap 底层实现?
    

JDK1.7(上面有示意图)
首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。
ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。
Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。
在这里插入图片描述
static class Segment<K,V> extends ReentrantLock implements Serializable {
}
一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。
在这里插入图片描述
ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(long(N)))
在这里插入图片描述

  •  3.hashmap 保存自定义类需要重写自定义类的哪些方法?
    

需要重写类的equals和hashcode()方法。

  •  4.HashMap、HashTable、concurrentHashMap 区别
    

hashmap 线程不安全,数组+链表+红黑树
hashtable 线程安全,锁住整个对象,数组+链表
concurrenthashmap 线程安全,cas+同步锁,数组+链表+红黑树
hashmap的key、value 均可为null,而其他的类不支持。

  • 5.comparable 和 Comparator的区别
    

comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序
comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

  • 6.ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢?
    

Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。

  • 7.ConcurrentHashMap 和 Hashtable 的区别
    

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。
底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的;
实现线程安全的方式(重要): ① 在JDK1.7的时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 到了 JDK1.8 的时候已经摒弃了Segment的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 synchronized 和 CAS 来操作。本;② Hashtable(同一把锁) :使用 synchronized 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get

这篇关于集合面试2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968136

相关文章

继续卷!面试又问Spring 事务有几种传播行为和隔离级别?

怕什么真理无穷 进一步有近一步的欢喜 面试又被问到了事务,来吧,要么卷起来,要么躺平。卷不动躺平会不会导致数据不一致? 事务概念 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 说简单点就是,要么所有执行success,不然就fail。它最终的目标:数据不会被破坏。即事务操作成功,数据的结果和业务期待的结果是一致的。 事务的属性 一个逻辑工作单元要成为事

面试十大潜规则,出来混你中过几个?

点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 大家好,我是小麦,金九银十,相信有不少找工作的同学,今天和大家分享一篇面试相关的文章,聊一聊面试中的潜规则,希望对您有所帮助。 1.大纲 潜规则1:面试的本质不是考试,而是告诉面试官你会做什么 很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来

面试常问的16个C语言问题,你能答上来几个?

大家好,我是小麦。最近不少小伙伴在找工作,这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题,你看看能答上来几个呢? 1 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC_YEAR  (365*24*60*60)UL 考察点: #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式

算法工程师面试问题 | YOLOv8面试考点原理全解析(一)

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv8面试总结,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的深度学习目标检测领域的专业知识、解决问题的能力以及对实际应用场景的理解。同时,这也是为

【面试干货】一个数组的倒序

【面试干货】一个数组的倒序 1、实现思想2、代码实现 💖The Begin💖点点关注,收藏不迷路💖 1、实现思想 创建一个新的数组,然后将原数组的元素按相反的顺序复制到新数组中。 2、代码实现 package csdn;public class reverse {public static void main(String[] args) {int[] a

持续总结中!2024年面试必问 100 道 Java基础面试题(五十)

上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(四十九)-CSDN博客 九十九、请解释Java中的单例模式及其实现方式 单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。单例模式在Java中的实现有多种方式,每种方式都有其特点和适用场景。 单例模式的特点: 单例类只能有一个实例:

对于集合中的自定义对象使用collections.sort 进行排序,需要实现compartor接口

/**  * 榜单 业务类  *  * @author seawind  *  */ public class RankService {     // 查看榜单     public List<Orderitem> showRank() {         RankDAO rankDAO = new RankDAO();         List<O

面试题大集合

仅供参考 1、用String的方法将数据类型转换为String。 2、有一个不定长度的String,其中前面是字母,后边是数字,例如:”abcd123.456″, 要求写一个方法得到其中的数字以String的形式返回,数字保留小数点后两位,不四舍五入,截去多余小 数,例如:”abcd123.456″,得到”123.45″ 如果数字没有小数点,要得到两位为0的小数,例如:”abcd123″,得

java入门详细教程之集合的理解与应用

一、Collenction集合 数组和集合的区别 长度 数组的长度是不可变的,集合的长度是可变的 数据类型 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 Collection 集合概述和使用 Collection集合概述​: 是单例集合的顶层接口,表示一组对象,这些对象也称为Collection的元素 JDK不提供此