发表于: 2017-09-07 22:48:28

1 833


今天完成的:

收获:

注意ConcurrentHashMap是并发包下的,其实现的也是并发包下的ConcurrentMap接口,该接口继承了Map接口。

Hashmap基于链表数组(红黑树),arraylist就是数组,linkedList基于双向链表。

注意set从没规范是否有顺序,只是规范了不能重复。例如LinkedHashSet是有序的。

HashMapLinkedHashMap区别

HashMapLinkedHashMap的区别是LinkedHashMapHashMap的基础上,采用双向链表(doubly-linked list)的形式将所有entry连接起来,这样是为保证元素的迭代顺序跟插入顺序相同。

除此之外,两者的遍历也不同,HashMap需要遍历整个table,包括数组链表和红黑树。而LinkedHashMap由于是双向链表,只需要从链表头部遍历链表即可。

HashMapHashTable的区别

1.Hashtable线程安全。而hashmap是非线程安全的,

2.hashmap允许null

3.hashmap的迭代器是fail-fast的,迭代过程中其他线程修改hashmap的结构,hashmap会抛ConcurrentModificationException。hashtble不是,在迭代的时候会去底层集合做一个拷贝,所以你在修改上层集合的时候是不会受影响的,不会抛出ConcurrentModification异常。

ArrayListLinkedList的区别

1.ArrayList是实现了基于数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 

3.对于新增和删除操作add和remove,LinedList可能比较占优势,但不一定,如果add的位置在list头部,arrayList要复制大量数组,效率较低。当add的位置在list尾部,反而是arrayList较快。

WeakedHashMap

WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法。由于这个特性,weakedHashMap特别适合做缓存。

更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:

调用两次size()方法返回不同的值;

两次调用isEmpty()方法,第一次返回false,第二次返回true

两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key

两次调用get()方法,第一次返回一个value,第二次返回null,尽管两次使用的是同一个对象。

weakedHashMap里面的元素是弱引用的,如果外界没为这个元素加强引用,其依然会被Gc回收。

Map 线程安全

如果需要使 Map 线程安全,大致有这么5种方法:

1、使用 synchronized 关键字,代码如下

synchronized(anObject) {

value = map.get(key);

}

2、使用 JDK1.5提供的锁(java.util.concurrent.locks.Lock)。代码如下

lock.lock();

value = map.get(key);

lock.unlock();

3、使用 JDK1.5 提供的读写锁(java.util.concurrent.locks.ReadWriteLock)。代码如下

rwlock.readLock().lock();

value = map.get(key);

rwlock.readLock().unlock();

这样两个读操作可以同时进行,理论上效率会比方法 2 高。

4、使用 JDK1.5 提供的 java.util.concurrent.ConcurrentHashMap 类。该类将 Map 的存储空间分为若干块,每块拥有自己的锁,大大减少了多个线程争夺同一个锁的情况。代码如下

value = map.get(key); //同步机制内置在 get 方法中

5、使用Collections.synchronizedMap(new HashMap<String, Object>())hashMap转为线程安全的

 

比较:

1、不同步确实最快,与预期一致。

2最上面的四种同步方式中,ConcurrentHashMap 是最快的,接近不同步的情况。

3synchronized 关键字非常慢,比使用锁慢了两个数量级。如果需自己实现同步,则使用 JDK1.5 提供的锁机制,避免使用 synchronized 关键字。

计划:

继续复习


返回列表 返回列表
评论

    分享到