[关闭]
@chenxuxiong 2016-06-19T02:30:51.000000Z 字数 3006 阅读 697

HashMap相关题目

JAVA基础


1.hashMap线程安全吗?

2.怎样达到线程安全?

3.hashMap的数据结构?

4.hashMap扩容方式?

为什么不是数组用完的时候扩容?
减小hash碰撞的几率,若数组越大,则hash碰撞的几率越低,所以要控制负载值比数组的长度小。 

5.hashMap怎样去重。(如何处理冲突的?)

6.如果key中放的是Object值,该怎么做?

8.如何去重后还能有序?

9.与Hashtable有什么区别?

补充:
9.Hashtable 有一个contains方法,容易引起误会,所以在HashMap里面已经去掉了
当然,2个类都用containsKey和containsValue方法。

哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

10.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。
fail-fast解决办法
一.使用ConcurrentHashMap来替换HashMap,
使用CopyOnWriteArrayList来替换ArrayList

ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 该类产生的开销比较大,但是在两种情况下,它非常适合使用。
1:在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时。
2:当遍历操作的数量大大超过可变操作的数量时。
二、调用Collections.synchronizedXXX方法
如:synchronizedMap该方法返回的是一个SynchronizedMap的实例。

SynchronizedMap类是定义在Collections中的一个静态内部类。它实现了Map接口,通过synchronized关键字进行对Map的每个方法进行同步控制。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注