美团Java基础一面

1. HashMap底层实现(数据结构)是什么?

在JDK 1.7中,HashMap底层实现是数组和链表
在JDK 1.8后,对HashMap进行了优化,改成了数组、链表和红黑树(在链表长度大于8的时候进行转换)。

2. HashMap的工作原理

HashMap基于散列算法,通过put()和get()方法存储和获取对象。调用put()方法时,根据key值得hashCode,通过indexFor()方法,找到一个对应的数组下标,把对象存储在这个位置,get()方法也是先通过key值的HashCode,找到对应的数组下标,再应用equals()方法找到正确的键值对,返回value值。

3. hashmap的key value可以为空值吗?

可以为空

4. hash原理

hash原理就是根据哈希值进行散列,使散列分布的更加均匀(在JDK 1.7中,就是这种),也可以说成是扰乱函数,减少碰撞。其他应用的地方,伪随机数法。

5. hashmap 扩容机制

在向hashmap中添加对象的时候,会调用addEntry()方法,每次都会对entry数量进行检测,当大于阈值的时候(jdk1.7中,还要要求发生碰撞),就会扩容。JDK 1.7是,头插法,所以会在扩容完成后会发生倒叙(采用头插法的道理是新插入的对象会优先调用),JDK 1.8采用了尾插法,扩容完成后是正序,也避免了倒序发生死循环的问题(线程不安全,resize的时候导致死循环)。

6. 为什么扩容的是2倍?

因为hashmap的容量就是2的n次幂,而且通过put()方法添加对象时,索引的位置就是利用hashcode的值和容量进行位与运算得出的,而且使用2的n次幂进行运算可以减少碰撞,让散列分布更加均匀。

7. 什么样的hashmap可以线程安全?

concurrentHashMap,也可以使用Collections工具类的synchronizedMap(map)方法

8. 说说什么是HashSet?

HashSet是Set接口的实现类,也是利用hashCode存储对象的集合,集合中的值不重复。利用equals()和hashCode()方法,来检查对象,避免重复。

9. hashmap和hashset有什么区别?

前者存的键值对,后者存的是对象
前者实现的是Map接口,后者实现Set接口
前者用put添加对象,后者用add添加对象
前者利用键的hashcode,后者使用对象的hashcode,当hashcode相同时,通过equals方法再比较。

10. 为什么使用String,Integer这样的wrapper类作为键对象更好?可以使用自定义类对象作为键对象吗?

因为String是final修饰的,重写了equals()和hashCode()方法,它们就是不可以改变的。不同的key就有了不同的hashCode,尽可能地增加了散列性,减少碰撞。可以使用对象类作为键,也应该重写equals和hashcode方法,但是在插入集合后就不能随意改变了。

11. concurrenHashMap可以替代Hashtable吗?

可以代替,而且concurrenHashMap效率更高,Hashtable采用的是synchronized原理。concurrentHashMap采用的是分段锁的原理,能让多个线程对不同部分的对象进行操作。

12. set list是否可以添加null元素?

List都可以添加null元素
HashMap可以有1个key为null的元素,TreeMap不能有key为null的元素
Set底层是Map
所以HashSet可以有1个null的元素,TreeSet不能有key为null的元素。

  • Set的底层实现是什么?
  • 1、HashSet : HashMap
  • 2、TreeSet : TreeMap
  • 3、LinkedHashSet: LinkedHashMap

13. final 和 static关键字可以修饰什么?

final 修饰类,方法,属性,局部变量
static 静态内部类,属性,方法,代码块

14. 现在我用final修饰了一个student类的实例化对象,那么请问我后面的代码段中还可以改变student的属性值吗?

可以改变。

15. 静态代码块的作用

代码块只在类加载时被执行一次,可以用来初始化一个类。

参考博客(HashMap)
参考博客(static final)

原创文章 34 获赞 8 访问量 1159

猜你喜欢

转载自blog.csdn.net/qq_46225886/article/details/105689018