java -- WeakHashMap

java -- WeakHashMap

 

 

特点

 

  • WeakHashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
  • WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映射。
  • WeakHashMap 键和值都可以是null。
  • WeakHashMap 的键是“弱键”。在 WeakHashMap 中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从映射中有效地移除了。
  • 非线程安全

 

 

扩容

 

    因为是与HashMap类似的散列表,所以扩容跟HashMap也是类似的。

 

 

 

自动删除原理

 

    1. 新建WeakHashMap,将“键值对”添加到WeakHashMap中。

        实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。

 

    2. 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)队列中。

 

    3. 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键值对;同步它们,就是删除table中被GC回收的键值对。

 

 

 

WeakHashMap例子

 

package com.alibaba.itbu.job.billing;  
  
import java.util.Map;  
import java.util.WeakHashMap;  
  
public class WeakHashMapTest {  
    static Map wMap = new WeakHashMap();  
    public static void init(){  
        wMap.put("1", "ding");  
        wMap.put("2", "job");  
    }  
    public static void testWeakHashMap(){  
  
        System.out.println("first get:"+wMap.get("1"));  
        try {  
            Thread.sleep(5000);  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        System.out.println("next get:"+wMap.get("1"));  
    }  
    public static void main(String[] args) {  
        testWeakHashMap();  
    }  
} 

 

上面例子, 第一次执行时要初始化,然后在5s内是不会清除的,大概在10几秒时会清除

 

第一次执行:

first get:ding

next get:ding

 

过一会再执行:

first get:null

next get:null

 

 

 

WeakHashMap的构造函数

 

// 默认构造函数。
WeakHashMap()

// 指定“容量大小”的构造函数
WeakHashMap(int capacity)

// 指定“容量大小”和“加载因子”的构造函数
WeakHashMap(int capacity, float loadFactor)

// 包含“子Map”的构造函数
WeakHashMap(Map<? extends K, ? extends V> map)

 

 

 

WeakHashMap的API

 

void                   clear()
Object                 clone()
boolean                containsKey(Object key)
boolean                containsValue(Object value)
Set<Entry<K, V>>       entrySet()
V                      get(Object key)
boolean                isEmpty()
Set<K>                 keySet()
V                      put(K key, V value)
void                   putAll(Map<? extends K, ? extends V> map)
V                      remove(Object key)
int                    size()
Collection<V>          values()

 

 

 

WeakHashMap遍历方式

方法一,遍历键值对

// 假设map是WeakHashMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    // 获取key
    key = (String)entry.getKey();
        // 获取value
    integ = (Integer)entry.getValue();
}

 

方法二,遍历键

// 假设map是WeakHashMap对象
// map中的key是String类型,value是Integer类型
String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
        // 获取key
    key = (String)iter.next();
        // 根据key,获取value
    integ = (Integer)map.get(key);
}

 

方法三,遍历值

// 假设map是WeakHashMap对象
// map中的key是String类型,value是Integer类型
Integer value = null;
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}

 

猜你喜欢

转载自youyu4.iteye.com/blog/2389921