精华帖 (3) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (12)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-27
说一说java里面的hashcode13–LinkedHashMap代码简要分析
http://www.hetaoblog.com/%E8%AF%B4%E4%B8%80%E8%AF%B4java%E9%87%8C%E9%9D%A2%E7%9A%84hashcode13%E2%80%93linkedhashmap%E4%BB%A3%E7%A0%81%E7%AE%80%E8%A6%81%E5%88%86%E6%9E%90/ 前面说了LinkedHashMap的特点,下面简单的分析下其实现代码, 首先看到LinkedHashMap继承了HashMap,就是说大部分方法采用的是HashMap的方法 public class LinkedHashMap extends HashMap implements Map 第二看到里面的主要成员,看类的说明,LinkedHashMap是通过一个双向链表来维护加入的顺序的,下面这个成员就是这个双向链表的头 private transient Entry header; 其中,被重载的函数里面最重要的两个, 其实就是在添加的时候需要保存相关节点到链表 void addEntry(int hash, K key, V value, int bucketIndex) { createEntry(hash, key, value, bucketIndex); // Remove eldest entry if instructed, else grow capacity if appropriate Entry eldest = header.after; if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } else { if (size >= threshold) resize(2 * table.length); } } void createEntry(int hash, K key, V value, int bucketIndex) { HashMap.Entry old = table[bucketIndex]; Entry e = new Entry(hash, key, value, old); table[bucketIndex] = e; e.addBefore(header); size++; } 当然,上面的代码主要作用还是调用了真正的Entry类 private static class Entry extends HashMap.Entry 的相关函数 private void addBefore(Entry existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; } 当然,Entry类和Iterator相关的类都是重新定义过的 private static class Entry extends HashMap.Entry { private abstract class LinkedHashI terator implements Iterator { |
|
返回顶楼 | |
发表时间:2012-03-16
说一说java里面的hashcode14--Collections.SynchronizedMap代码分析
http://www.hetaoblog.com/java-hashcode-collections-synchronizedmap/ 刚写了篇concurrent系列的,现在准备回到hashcode系列;写的差不多的时候,再把一个系列的所有文章做个索引,用来无聊的时候自恋用:) 话说对一个主题进行学习和写作还是有点用的,平时写代码光顾着用常用的代码,有蛮多细节平时都没注意到; 正好最近整理下自己也学习了蛮多,如果能对网友有用 那就最好了 之前的说一说java里面的hashcode系列已经写了13篇,大致从Object.hashcode(), String.hashcode()说起,中间仔细分析了HashMap, Hashtable,concurrentHashMap等类的代码, 上次说到说一说java里面的hashcode13–LinkedHashMap代码简要分析 今天这篇说下Collections.SynchronizedMap的代码分析, 之前已经说了HashMap不是线程安全的,HashTable和ConcurrentHashMap是线程安全的实现; 有的似乎还调用别人的代码,返回的是HashMap,有需要对该HashMap做多线程的并发操作,如果不想重新构造ConcurrentHashMap或者Hashtable的话, 那么可以用Collections.SynchronizedMap来返回一个线程安全的Map 下面是jdk的实现代码 public static Map synchronizedMap(Map m) { return new SynchronizedMap(m); } /** * @serial include */ private static class SynchronizedMap implements Map, Serializable { // use serialVersionUID from JDK 1.2.2 for interoperability private static final long serialVersionUID = 1978198479659022715L; private final Map m; // Backing Map final Object mutex; // Object on which to synchronize SynchronizedMap(Map m) { if (m==null) throw new NullPointerException(); this.m = m; mutex = this; } SynchronizedMap(Map m, Object mutex) { this.m = m; this.mutex = mutex; } public int size() { synchronized(mutex) {return m.size();} } public boolean isEmpty(){ synchronized(mutex) {return m.isEmpty();} } public boolean containsKey(Object key) { synchronized(mutex) {return m.containsKey(key);} } public boolean containsValue(Object value){ synchronized(mutex) {return m.containsValue(value);} } public V get(Object key) { synchronized(mutex) {return m.get(key);} } public V put(K key, V value) { synchronized(mutex) {return m.put(key, value);} } public V remove(Object key) { synchronized(mutex) {return m.remove(key);} } public void putAll(Map map) { synchronized(mutex) {m.putAll(map);} } public void clear() { synchronized(mutex) {m.clear();} } 可以看到,该代码实现的非常简单,内部就是用了一个Map的引用来保存原本的Map对象;然后用了一个对象做mutex final Object mutex; 在这个Map上的所有的读写操作,包括size(),isempty(),get(),set等,全部都用synchronized代码块保护起来 synchronized(mutex) 当然,这个基本和Hashtable类似,都是在全局加锁,和ConcurrentHashMap的分段加锁是有所不同的; |
|
返回顶楼 | |