Java 学习笔记

所有文章
📖 最新文章 transmittable-thread-local 库 JOOR 反射库 Lombok 库:为你减少样板代码 Slf4j 日志组件的使用 加速maven、gradle依赖下载
📖 Java 基础 安装 第一个程序 使用 UTF-8 编写代码 空值 null 正则表达式 线程 日期/时间 匿名类 枚举 ThreadLocal 线程本地变量 动态代理 jar 命令

Java WeakHashMap


本文的示例中需要触发垃圾回收,用了Java 如何触发垃圾回收 给出的方法。

WeakHashMap 首先是一个 Map,可以用key-value的形式存储数据。

其次,它继承自 WeakReference,当 key 只剩下弱引用时,会以懒处理的方式清理该 key-value 。

懒处理,是指在调用 WeakHashMap 的 size、put、get 等方法时才去清理。

回顾弱引用:WeakReference

当一个对象只有弱引用时,gc时会把该对象回收。

import java.lang.ref.WeakReference;

public class Main {

    public static void main(String[] args) {
        String name = new String("ltt");  // new String,可以防止常量池的副作用

        WeakReference<String> nameRef = new WeakReference<>(name);  // 生成弱引用

        System.out.println(nameRef.get()); // ltt

        name = null;  // 解除强引用

        // 触发垃圾回收
        System.gc();
        System.runFinalization();

        System.out.println(nameRef.get());  // null
    }

}

运行结果:

ltt
null

WeakHashMap 的使用

import java.util.WeakHashMap;

public class Main2 {

    public static void main(String[] args) {
        String name = new String("ltt");
        WeakHashMap<String, Integer> map = new WeakHashMap<>();
        map.put(name, 18);
        System.out.println(map.size()); // 1

        name = null;  // 解除强引用

        // 触发垃圾回收
        System.gc();
        System.runFinalization();

        // map 中无数据了
        System.out.println(map.size()); // 0
    }
}

运行结果:

1
0

( 本文完 )

文章目录