集合容器部分问题

1.HashMap和Hashtable的区别 (带一下ConcurrentHashMap)

HashMap是线程_____的, Hashtable是______的。HashMap中所有的方法都没有加同步锁, Hashtable中所有的方法都加了________同步锁。官方在JDK1.5版本中又推出了一个ConcurrentHashMap, 使用了______锁实现线程安全, 然后弃用了Hashtable, 因为___锁的性能比_______锁的性能更好。

在并发编程中, 如果多个线程共享一个HashMap, 那么必须考虑线程安全的问题, 可以自己在代码中对HashMap操作代码加锁, 或者直接用线程安全的ConcurrentHashMap类

在不考虑线程安全的环境下, 用HashMap性能更好, 因为_______是很耗性能的。

对Null key和Null value支持: HashMap______, 但只能_____, Hashtable______, 会直接抛NPE, HashMap和Hashtable支持_______, 不限制个数

ConcurrentHashMap_____________.

HashMap在1.8以后, 设置了阈值=8, 当链表长度超过阈值的时候, 会转换为红黑树以减少检索时间, Hashtable被弃用了, 没有更新

初始容量大小和扩容容量大小的区别:

HashMap默认初始容量是16, 扩容策略是原来的__倍

Hashtable 默认初始容量是______, 扩容策略是原来的___倍

HashMap如果手动指定了初始容量, 不是2的n次方, 他也会找到最近的一个2的n次方作为初始容量

Hashtable如果手动指定了初始容量, 会直接使用给定的大小

Hashtable采用的锁全表的机制, ConcurrentHashMap采用了分段锁的设计, 锁粒度更细, 性能更好

2.HashMap为什么不直接使用key的hashCode()函数返回的哈希码作为落槽时的索引号, HashMap是怎么解决的呢

这题也可以这样问”HashMap的底层是如何计算key落槽时的索引的

hashCode()方法返回的是int整数类型,其范围为__________,约有40亿个映射空间,而HashMap的容量范围是在16(初始化默认值)~2 ^ 30,HashMap通常情况下是取不到最大值的,并且设备上也难以提供这么多的存储空间,从而导致通过`hashCode()`计算出的哈希值可能不在数组大小范围内,进而无法匹配存储位置;

HashMap自己实现了自己的hash()方法,通过两次扰动使得它自己的哈希值高低位自行进行异或运算,降低哈希碰撞概率也使得数据分布更平均。

3.== 和 equals()方法的区别

==和equals()都可以用于比较, 语法是 a == b 或者 a.equals(b)

==比较的是内存地址

equals()方法是Object类中方法,可以被任意类继承或重写,通过看官方Object类源码可以知道equals()方法默认是比较________

如果想要修改equals()方法的比较规则, 可以重写equals()方法

String类就重写equals()方法的比较规则, 由默认的比较两个字符串对象的内存地址, 修改为比较字符串中每个字符是否相等。

因为堆区中可能会出现两个一模一样的字符串对象, 但用==比较会返回false,因为其内容一样, 但______不一样, 所以字符串的比较必须用equals()方法, 否则可能会出现两个内容一模一样的字符串, 因为_____不一样比较后出现不相等的情况。

4.为什么重写了equals()方法, 必须也要重写hashcode()方法

HashMap的底层采用了key的hashcode()来计算数组的索引index

如果数组[index]为null说明key不存在, 直接落槽插入

如果数组[index]不为null说明该位置有key存在, 但不能一定说明已存在的key与要插入的key重复, 因为可能会发生哈希碰撞, 此时应该进一步用equals方法比较已存在的key与要插入的key是否相等。如果相等就说明一定是重复的, 应该覆盖, 如果不相等, 说明发生了哈希碰撞, 那么应该插入在链表中

重写equals方法的目的是为了不去比较两个对象的内存地址, 改为比较对象的内容, 如果一个类重写了equals, 没有重写hashcode, 就可能出现两个地址不同的对象equals比较相等, 但是hashcode比较不相等, 这样会违法HashMap的唯一性, 因此, 重写了equals方法必须也要重写hashcode方法, 且必须满足两个对象equals相等, hashcode也必须相等。

判断:如果两个对象的hashcode相同,那么equals也相同。

5. Arrays 和 Collections的区别

Arrays是操作数组的工具类, collections是操作 Collection体系的工具类工具类中提供了对数组和集合的排序,二分查找等静态方法

(注意Collection是____, Collections是______)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值