Java集合中List,Set以及Map等面试题详解(全宇宙最全)【小白必看-4】

Java集合中List,Set以及Map等集合体系详解(全宇宙最全)
Java面试的时候,经常会问到一些基础的问题,今天我们就来分析一下以下这个问题?

面试题一:请帅哥说说说说List,Set,Map三者的区别?

●List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
●Set(注重独一无二的性质):不允许重复的集合。不会有多个元素引用相同的对象。
●Map(用Key来搜索的专家):使用键值对存储。Map会维护与Key有关联的值。两
个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以
是任何对象。

面试题二:请帅哥说说HashMap、TreeMap和HashTable的区别

Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。

①TreeMap是有序的,HashMap和HashTable是无序的。

②Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。

这就意味着Hashtable是线程安全的,HashMap不是线程安全的。HashMap效率较高,Hashtable效率较低。
如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。
查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有
synchronized关键字,而HashMap的源码中则没有。

③Hashtable不允许null值,HashMap允许null值(key和value都允许)

④父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap

⑤Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。
HashMap中hash数组的默认大小是16,而且一定是2的指数。
在JDK1.8之后,解决哈希冲突,当链表的长度大于8的时候,将链表化为红黑树,减少搜索时间。

面试题三:小帅哥说一下:Arraylist与LinkedList区别?

●1.是否保证线程安全: ArrayList和L inkedList都是不同步的,也就是不保证线程安全;
●2.底层数据结构: Arraylist底层使用的是object数组; LinkedList底层使用的是双向链表数据结构(JDK1.6之前 为循环链表,JDK1.7取消了 循环。注意双向链表和双向循环链表的区别,下面有介绍到! )
●3.插入和删除是否受元素位置的影响:
①ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。比如: 执行add(E e)方法的时候,ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是0(1)。但是如果要在指定位置i插入和删除元素的话(add(int index, Eelement))时间复杂度就为0(n-i)。因为在进行上述操作的时候集合中第i和第i个元素之后的(n-i)个元素都要执行向后位/向前移- -位的操作。
②LinkedList采用链表存储,所以对于add(E e)方法的插入,删除元素时间复杂度不受元素位置的影响,近似0 (1),如果是要在指定位置i插入和删除元素的话((add(int index, E element))时间复杂度近似为o(n))因为需要先移动到指定位置再插入。
●4.是否支持快速随机访问: L inkedList不支持高效的随机元素访问,而ArrayList支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index) 方法)。
●5. 内存空间占用: ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素 都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

面试题四:HashMap 和HashSet 的区别

在这里插入图片描述

面试题五:如何判断两个hashSet 检查重复

当你把对象加入HashSet时,HashSet会 先计算对象的hashcode值来判断对象加入的位
置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,
HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调
用equals () 方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet
就不会让加入操作成功。
(摘 自我的Java启蒙书《Head fist java》第二版)

hashCode ()与equals ()的相关规定:

1.如果两个对象相等,则hashcode-定也是相同的
2.两个对象相等,对两个equals方法返回true
3.两个对象有相同的hashcode值,它们也不一定是相等的
4.综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),
则该class的两个对象无论如何都不会相等( 即使这两个对象指向相同的数据)。

==与equals的区别
  1. ==是判断两个变量或实例是不是指向同-一个内存空间equals是判断两个变量或实
    例所指向的内存空间的值 是不是相同
  2. ==是指对内存地址进行比较equals()是对字符串的内容进行比较
  3. ==指引用是否相同equals( )指的是值是否相同

面试题六:HashMap的底层实现

JDK1.8之前是数组和链表结合,链表散列,HashMap的key的hashCode 经过扰动函数之后得到的hash值,通过(n-1)&hash ,判断当前存放的元素位置,如果存在的话看hash值和ke是否相同,相同直接覆盖,不同的话通过拉链法进行解决冲突。
扰动函数就是HashMap的hash方法,使用hash 方法,扰动函数可以减少碰撞。
在这里插入图片描述
在这里插入图片描述
JDK1.8之后解决哈希冲突,当链表长度大于阈值8,将链表转化为红黑树,减少搜索时间。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和你在一起^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值