`
mzlly999
  • 浏览: 53337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WeakHashMap和HashMap的区别

 
阅读更多

WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,

见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap  remove掉a 并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象而言,当HashMap  remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以

WeakHashMap将会保留

package test;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

public class Test {
	public static void main(String[] args) throws Exception {
		String a = new String("a");
		String b = new String("b");
		Map weakmap = new WeakHashMap();
		Map map = new HashMap();
		map.put(a, "aaa");
		map.put(b, "bbb");

		
		weakmap.put(a, "aaa");
		weakmap.put(b, "bbb");
		
		map.remove(a);
		
		a=null;
		b=null;
		
		System.gc();
		Iterator i = map.entrySet().iterator();
		while (i.hasNext()) {
			Map.Entry en = (Map.Entry)i.next();
			System.out.println("map:"+en.getKey()+":"+en.getValue());
		}

		Iterator j = weakmap.entrySet().iterator();
		while (j.hasNext()) {
			Map.Entry en = (Map.Entry)j.next();
			System.out.println("weakmap:"+en.getKey()+":"+en.getValue());
			
		}
	}

	
}

 

分享到:
评论
2 楼 froest 2013-08-24  
只要键的内存地址没有在任何其他地方被引用,那么下一次gc的时候就会被回收掉;
class A {
  private String a;

  A(String a) {
    this.a = a;
  }
}
String a1 = new String("a");
String b1 = new String("b");
A a = new A(a1);
A b = new A(b1);
这样运行的结果为:
map:com.froest.excel.A@1fb8ee3:bbb
weakmap:com.froest.excel.A@1fb8ee3:bbb
1 楼 bawanglb 2011-12-13  
恩,不错,支持,懂了

相关推荐

    比较Vector、ArrayList和hashtable hashmap

    和 HashMap 不同的是,Hashtable 不允许 null 键和 null 值。此外,Hashtable 的行为更接近于传统数据库的表格,它不允许空引用作为键或值,因此在某些场景下可能更严谨。 WeakHashMap 类 WeakHashMap 是 HashMap ...

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    WeakHashMap的使用方法详解

    3. WeakHashMap 与 HashMap 的区别:WeakHashMap 的键是弱引用的,而 HashMap 的键是强引用的,意味着 HashMap 的键对象永远不会被垃圾回收器回收。 4. WeakHashMap 的应用实例:Tomcat 中的缓存机制使用了 ...

    HASHMAP缓存.txt

    在深入探讨《HASHMAP缓存.txt》所提及的知识点前,我们先来解析一下文档的标题、描述和部分内容,以确保我们对所讨论的主题有全面的理解。标题“HASHMAP缓存.txt”暗示了文档主要关注的是Java编程语言中HashMap作为...

    Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.

    Java中的容器类是Java集合框架的重要组成部分,它们用于存储和管理数据。...在实际应用中,通常推荐使用非同步的实现,如ArrayList和HashMap,因为它们的性能更高,然后根据需要在多线程场景下添加同步机制。

    Java编程WeakHashMap实例解析

    WeakHashMap是Java编程中的一种特殊的HashMap实现,它使用弱引用来保存键和值,这样可以使得垃圾回收器自动清理键和值。在WeakHashMap中,键和值都是弱引用的,这样可以避免内存泄露的问题。 WeakHashMap的实现...

    Java 集合框架高难度进阶版面试题集锦解析

    15. IdentityHashMap 和 HashMap 的区别: - IdentityHashMap 使用对象的引用相等性而非对象的equals()方法来判断键是否相同。 - HashMap 默认使用对象的equals()和hashCode()方法来比较键。 16. Iterator 和 ...

    线程死锁CPU过高,请求原因分析

    WeakHashMap在死锁和CPU过高的问题中可能扮演的角色: 1. **锁竞争**:虽然WeakHashMap本身的内部实现是线程安全的,但在并发访问时,如果多个线程同时操作同一个WeakHashMap,可能会引发锁竞争,导致CPU升高。 2. *...

    数据结构和Java集合框架

    Map接口则用于存储键值对,例如HashMap、TreeMap和WeakHashMap。HashMap提供快速的存取,基于哈希表实现;TreeMap则按照键的自然顺序或自定义比较器排序;WeakHashMap使用弱引用作为键,当键不再被引用时,键值对会...

    Java中HashMap和Hashtable及HashSet的区别

    在Java编程语言中,`HashMap`、`Hashtable`和`HashSet`都是集合框架的重要组成部分,分别用于存储键值对和不重复元素。下面将详细解释它们之间的区别。 首先,`Hashtable`是`Map`接口的一个早期实现,它提供了一个...

    java容器(持有对象)

    常见的Map实现有HashMap、TreeMap、Hashtable和WeakHashMap。HashMap是基于哈希表的,快速查找但无序;TreeMap基于红黑树,有序且支持按键或按键值排序;Hashtable是线程安全的老式实现,与Vector一样已较少使用;...

    Java基础总结下1

    Map接口的实现有HashMap、LinkedHashMap、TreeMap和WeakHashMap,HashMap提供快速查找,LinkedHashMap保持插入顺序,TreeMap按自然顺序或定制比较器排序,WeakHashMap则使用弱引用键。此外,Hashtable是古老的线程...

    2019阿里内推面经1

    `WeakHashMap`与`HashMap`的主要区别在于键的引用类型。在`HashMap`中,键是强引用,即使在其他地方没有引用,只要存在于`HashMap`中,对象就不会被垃圾回收。而在`WeakHashMap`中,键是弱引用,当垃圾回收器回收了...

    Java集合框架完整说明便于了解集合

    6. HashMap和HashSet的区别:HashMap关注键值对,HashSet关注元素的唯一性,两者都基于哈希表实现,但HashSet的元素是HashMap的键。 7. 多线程问题:HashMap在多线程环境下不安全,可能导致死循环,应使用...

    java中集合的用法与区别.docx

    Map接口的实现类有Hashtable、HashMap、LinkedHashMap、WeakHashMap和IdentityHashMap。Hashtable与HashMap类似,但它是线程安全的,不接受null键值。HashMap是非同步的,允许null键和null值。LinkedHashMap保持了...

    map,list,set,stack,queue,vector等区别和特点1

    在Java编程语言中,集合框架是处理对象组织和操作的...在多线程环境中,线程安全的实现如Vector和Hashtable是必要的,但在单线程或性能要求较高的情况下,非线程安全的实现如ArrayList、LinkedList和HashMap通常更优。

    Java弱引用与WeakHashMap

    书中还提到可以用WeakHashMap来作为缓存的容器可以有效解决这一问题。之前也确实遇到过类似问题,但是没有接触过“弱引用”相关的问题,于是查阅了一些资料。  《Java 理论与实践: 用弱引用堵住内存泄漏》一文也...

    多年的开发经验,与大家共享

    首先,让我们讨论`Hashtable`和`HashMap`的区别。`Hashtable`是`Dictionary`的子类,它是一个线程安全的容器,其方法默认是同步的。这意味着在多线程环境中,你可以直接使用`Hashtable`而不用担心数据同步问题。相反...

    1216集合类的说明与区别

    常见的Map实现类有Hashtable、HashMap和WeakHashMap。Hashtable与Vector类似,是线程安全的,但不推荐在现代Java中使用,因为它不允许null键和值。HashMap是非同步的,提供快速的查找,插入和删除操作,键和值都可以...

Global site tag (gtag.js) - Google Analytics