论坛首页 Java企业应用论坛

说一说java里面的hashcode–Object.hashcode()

浏览 12383 次
精华帖 (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 {
0 请登录后投票
   发表时间: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的分段加锁是有所不同的;
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics