Soft HashMap : 哈希表映射 « 集合数据结构 « Java

En
Java
1. 图形用户界面
2. 三维图形动画
3. 高级图形
4. 蚂蚁编译
5. Apache类库
6. 统计图
7. 
8. 集合数据结构
9. 数据类型
10. 数据库JDBC
11. 设计模式
12. 开发相关类
13. EJB3
14. 电子邮件
15. 事件
16. 文件输入输出
17. 游戏
18. 泛型
19. GWT
20. Hibernate
21. 本地化
22. J2EE平台
23. 基于J2ME
24. JDK-6
25. JNDI的LDAP
26. JPA
27. JSP技术
28. JSTL
29. 语言基础知识
30. 网络协议
31. PDF格式RTF格式
32. 映射
33. 常规表达式
34. 脚本
35. 安全
36. Servlets
37. Spring
38. Swing组件
39. 图形用户界面
40. SWT-JFace-Eclipse
41. 线程
42. 应用程序
43. Velocity
44. Web服务SOA
45. 可扩展标记语言
Java 教程
Java » 集合数据结构 » 哈希表映射屏幕截图 
Soft HashMap
 

import java.util.*;
import java.lang.ref.*;

public class SoftHashMap extends AbstractMap implements Map {

  private Set entrySet = null;
  private Map hash;
  private ReferenceQueue queue = new ReferenceQueue();

  static private class SoftKey extends SoftReference {
    private int hash;

    private SoftKey(Object k) {
      super(k);
      hash = k.hashCode();
    }
    private static SoftKey create(Object k) {
      if (k == null) {
        return null;
      else {
        return new SoftKey(k);
      }
    }
    private SoftKey(Object k, ReferenceQueue q) {
      super(k, q);
      hash = k.hashCode();
    }
    private static SoftKey create(Object k, ReferenceQueue q) {
      if (k == null) {
        return null;
      else {
        return new SoftKey(k, q);
      }
    }
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      else if (!(instanceof SoftKey)) {
        return false;
      }
      Object t = this.get();
      Object u = ((SoftKey)o).get();
      if ((t == null|| (u == null)) {
        return false;
      else if (t == u) {
        return true;
      else {
        return t.equals(u);
      }
    }
    public int hashCode() {
      return hash;
    }
  }

  private void processQueue() {
    SoftKey sk;
    while ((sk = (SoftKey)queue.poll()) != null) {
      hash.remove(sk);
    }
  }

  public SoftHashMap() {
    hash = new HashMap();
  }

  public SoftHashMap(Map t) {
    this(Math.max(2*t.size()11)0.75f);
    putAll(t);
  }

  public SoftHashMap(int initialCapacity) {
    hash = new HashMap(initialCapacity);
  }

  public SoftHashMap(int initialCapacity, float loadFactor) {
    hash = new HashMap(initialCapacity, loadFactor);
  }

  public int size() {
    return entrySet().size();
  }

  public boolean isEmpty() {
    return entrySet().isEmpty();
  }

  public boolean containsKey(Object key) {
    return hash.containsKey(SoftKey.create(key));
  }

  public Object get(Object key) {
    return hash.get(SoftKey.create(key));
  }

  public Object put(Object key, Object value) {
    processQueue();
    return hash.put(SoftKey.create(key, queue), value);
  }

  public Object remove(Object key) {
    processQueue();
    return hash.remove(SoftKey.create(key));
  }

  public void clear() {
    processQueue();
    hash.clear();
  }

  private static class Entry implements Map.Entry {
    private Map.Entry ent;
    private Object key;

    Entry(Map.Entry ent, Object key) {
      this.ent = ent;
      this.key = key;
    }

    public Object getKey() {
      return key;
    }

    public Object getValue() {
      return ent.getValue();
    }

    public Object setValue(Object value) {
      return ent.setValue(value);
    }

    public boolean equals(Object o) {
      if (!(instanceof Map.Entry)) {
        return false;
      else {
        Map.Entry e = (Map.Entry)o;
        Object value = getValue();
        return (key==null ? e.getKey()==null : key.equals(e.getKey())) &&
               (value==null ? e.getValue()==null : value.equals(e.getValue()));
      }
    }

    public int hashCode() {
      Object value = getValue();
      return (((key == null: key.hashCode())
        ((value == null: value.hashCode()));
    }

  }

  public Set entrySet() {
    if (entrySet == null) {
      entrySet = new EntrySet();
    }
    return entrySet;
  }

  private class EntrySet extends AbstractSet {
    Set set = hash.entrySet();

    public Iterator iterator() {

      return new Iterator() {
        Iterator iter = set.iterator();
        Entry next = null;

        public boolean hasNext() {
          while (iter.hasNext()) {
            Map.Entry ent = (Map.Entry)iter.next();
            SoftKey sk = (SoftKey)ent.getKey();
            Object k = null;
            if ((sk != null&& ((k = sk.get()) == null)) {
              /* Soft key has been cleared by GC */
              continue;
            }
            next = new Entry(ent, k);
            return true;
          }
          return false;
        }

        public Object next() {
          if ((next == null&& !hasNext()) {
            throw new NoSuchElementException();
          }
          Entry element = next;
          next = null;
          return element;
        }

        public void remove() {
          iter.remove();
        }
      };
    }

    public boolean isEmpty() {
      return !(iterator().hasNext());
    }

    public int size() {
      int size = 0;
      for (Iterator i = iterator(); i.hasNext(); i.next(), size++);
      return size;
    }

    public boolean remove(Object o) {
      processQueue();
      if (!(instanceof Map.Entry)) {
        return false;
      }
      Map.Entry e = (Map.Entry)o;
      Object ev = e.getValue();
      SoftKey sk = SoftKey.create(e.getKey());
      Object hv = hash.get(sk);
      if ((hv == null)
          ((ev == null&& hash.containsKey(sk)) : hv.equals(ev)) {
        hash.remove(sk);
        return true;
      }
      return false;
    }

    public int hashCode() {
      int h = 0;
      for (Iterator i = set.iterator(); i.hasNext();) {
        Map.Entry ent = (Map.Entry)i.next();
        SoftKey sk = (SoftKey)ent.getKey();
        Object v;
        if (sk == null) {
          continue;
        }
        h += (sk.hashCode()
          (((v = ent.getValue()) == null: v.hashCode()));
      }
      return h;
    }
  }
}


           
         
  
Related examples in the same category
1. 在Java哈希表检查是否存在特定的键
2. 在Java哈希表检查是否存在特定的值
3. 从Java哈希表取得采集值
4. Get Set view of Keys from Java Hashtable
5. 获取尺寸Java哈希表
6. 遍历键Java哈希表
7. 从Java哈希表移除所有值
8. 扫描内容哈希表
9. 从Java哈希表删除值
10. 排序键哈希表
11. Associates keys with valuesAssociates keys with values
12. Iterate through values of Java Hashtable
13. 一个简单的映射实现一个简单的映射实现
14. Hash table with separate chaining
15. 哈希表与线性探测哈希表与线性探测
16. Hash table with double hashingHash table with double hashing
17. Working with Key-Value Pairs in a Hashtable
18. Demonstrate the Hashtable class, and an Enumeration
19. Demonstrate the HashMap class, and an IteratorDemonstrate the HashMap class, and an Iterator
20. MultiMap extends AbstractMap
21. Array Map extends AbstractMapArray Map extends AbstractMap
22. Demonstrating the WeakHashMapDemonstrating the WeakHashMap
23. 使用treemap使用treemap
24. 排序元素TreeMap排序元素TreeMap
25. What you can do with a TreeMapWhat you can do with a TreeMap
26. A Map implemented with ArrayLists
27. 简单的演示HashMap简单的演示HashMap
28. HashMap
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.