Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - WeakHashMap 类



WeakHashMap 是 Map 接口的一个实现,它仅存储对其键的弱引用。仅存储弱引用允许在键不再在 WeakHashMap 之外被引用时垃圾收集键值对。

此类提供了利用弱引用的最简单方法。它可用于实现“类似注册表”的数据结构,其中当其键不再可由任何线程访问时,条目的效用消失。

WeakHashMap 的功能与 HashMap 完全相同,但有一个非常重要的例外:如果 Java 内存管理器不再对指定为键的对象具有强引用,则映射中的条目将被删除。

弱引用 - 如果对对象的唯一引用是弱引用,则垃圾收集器可以随时回收对象的内存。它不必等到系统内存不足。通常,它将在下次垃圾收集器运行时释放。

以下是 WeakHashMap 类支持的构造函数列表。

序号 构造函数和描述
1

WeakHashMap()

此构造函数使用默认初始容量 (16) 和默认加载因子 (0.75) 构造一个新的空 WeakHashMap。

2

WeakHashMap(int initialCapacity)

此构造函数使用给定的初始容量和默认加载因子 (0.75) 构造一个新的空 WeakHashMap。

3

WeakHashMap(int initialCapacity, float loadFactor)

此构造函数使用给定的初始容量和给定的加载因子构造一个新的空 WeakHashMap。

4

WeakHashMap(Map t)

此构造函数使用与指定 Map 相同的映射构造一个新的 WeakHashMap。

除了从其父类继承的方法外,TreeMap 还定义了以下方法 -

序号 方法和描述
1

void clear()

从此映射中删除所有映射。

2

boolean containsKey(Object key)

如果此映射包含指定键的映射,则返回 true。

3

boolean containsValue(Object value)

如果此映射将一个或多个键映射到指定值,则返回 true。

4

Set entrySet()

返回此映射中包含的映射的集合视图。

5

Object get(Object key)

返回在此弱散列映射中指定键映射到的值,如果映射不包含此键的映射,则返回 null。

6

boolean isEmpty()

如果此映射不包含键值映射,则返回 true。

7

Set keySet()

返回此映射中包含的键的集合视图。

8

Object put(Object key, Object value)

将指定值与此映射中的指定键关联。

9

void putAll(Map m)

将指定映射中的所有映射复制到此映射。这些映射将替换此映射对指定映射中当前存在的任何键具有的任何映射。

10

Object remove(Object key)

如果存在,从此映射中删除此键的映射。

11

int size()

返回此映射中键值映射的数量。

12

Collection values()

返回此映射中包含的值的集合视图。

示例

以下程序说明了此集合支持的几种方法 -

import java.util.*;
public class WeakHashMap_Demo {

   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Maine"), "Augusta");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Maine")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Thread waiting");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Main waiting");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

这将产生以下结果 -

输出

Main waiting
Thread waiting

如果您不包含对 System.gc() 的调用,则系统可能永远不会运行垃圾收集器,因为程序使用的内存不多。对于更活跃的程序,此调用将是不必要的。

java_collections.htm
广告
© . All rights reserved.