posts - 431,  comments - 344,  trackbacks - 0
今天看别人写的代码, 其中使用了两种Map子类, IdentityHashMap和WeakHashMap, 经查看JDK文档得知:
IdentityHashMap
此类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1k2 相等(在正常 Map 实现(如 HashMap)中,当且仅当满足下列条件时才认为两个键 k1k2 相等:(k1==null ? k2==null : e1.equals(e2)))。
也就是说, 如果Key是同一个对象才算是键相等, 如果只是值相等, 那么不算相等.
比如
  Map<Pet, String> map = new IdentityHashMap<Pet, String>();
  Pet p = new Pet("eric");
  map.put(new Pet("eric"), "eric");
  map.put(new Pet("eric"), "hello");
  System.out.println("size = " + map.size());
  
  Map<Pet, String> hashMap = new HashMap<Pet, String>();
  hashMap.put(new Pet("eric"), "eric");
  hashMap.put(new Pet("eric"), "hello");
  System.out.println("hashMap size = " + hashMap.size());
Pet中的equals中只要name相等, 就算这两个pet对象相等. 执行结果为:
size = 2
hashMap size = 1

WeakHashMap
弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。
其实就是除了本map引用以外, 没有其他对象引用该key对象, 则WeakHashMap会自动移除这个key以及对应的值.
posted on 2009-05-15 16:54 周锐 阅读(1481) 评论(5)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: