# Java 中的弱引用

> 原文： [https://javatutorial.net/weak-references-in-java](https://javatutorial.net/weak-references-in-java)

本文讨论 Java 中弱引用的概念。

在开始之前，让我们先了解一些基础知识。

Java 中有 4 种引用类型：

1.  强引用
2.  弱引用
3.  软引用
4.  幻影引用

在这里，我们将讨论弱引用。

弱引用与 Java 中的垃圾收集有关。 [垃圾收集](https://javatutorial.net/java-garbage-collection)只是从内存中自动取消分配未引用对象的方法。

弱引用是指不足以使对象保留在内存中的引用。 因此，弱引用可以让垃圾收集器确定对象的可及性以及所讨论的对象是否应保留在内存中。

弱引用需要显式声明，因为默认情况下，Java 将引用标记为强引用。

## 什么是弱可达性？

这意味着一个对象既没有强引用也没有软引用指向它，并且只能通过遍历弱引用来访问。

因此，如果该对象被弱引用，则垃圾收集器会将其从内存中删除，这将清除更多空间并实现更好的内存管理。

垃圾收集器删除了弱引用之后，将该引用放入引用队列中，并最终确定以前弱可访问的对象。

## 弱引用在哪里使用？

*   弱引用主要用于**规范化映射的实现中**。规范化映射是指映射仅包含特定值的一个实例。

*   弱引用还广泛用于[`WeakHashMap`](https://javatutorial.net/java-weakhashmap-example)类中。 这是`Map`接口的实现，其中每个键值都存储为弱引用。 键值对扩展了`WeakReference`类。 因此，垃圾收集器删除此键也会导致实体也被删除。

代码示例：

私有静态类`TryingOut<K, V>`扩展了`WeakReference<Object>`实现`Map.Entry<K, V>`

*   失效监听器问题也使用弱引用。 在这种情况下，可以通过弱引用来处理内存泄漏问题。

## 实现弱引用：

`java.lang.ref.WeakReference`类在处理和创建弱引用时使用。

可以使用弱引用的一种实际的实际场景是在建立数据库连接时使用，当使用数据库的应用程序关闭时，垃圾收集器可能会清除该数据库连接。

Java 中的弱引用的编码示例如下所示：

```java
// Illustrating Weak references in Java 
import java.lang.ref.WeakReference; 
class WeakestRef 
{ 
    //coding starts from here
    public void something() 
    { 
        System.out.println("This is printed out on the screen"); 
    } 
} 

public class TryingOutWeak
{ 
    public static void main(String[] args) 
    { 
        // Strong Reference 
        WeakestRef obj1 = new WeakestRef ();    
        obj1.something(); 

        // Creating Weak Reference to WeakestRef -type object to which 'obj1' is also pointing. 
        WeakReference< WeakestRef > weakref = new WeakReference< WeakestRef >(obj1); 

        //Now, WeakestRef -type object to which 'obj1' was pointing earlier is not available for garbage   //collection. But will be only be garbage collected when JVM needs memory. 
        Obj1 = null;  

        // Note: You can also retrieve back the object which has been weakly referenced. It succesfully     //calls the method. 
        Obj1 = weakref.get();  

        Obj1.something(); 
    } 
}

```

代码的输出：

这被打印在屏幕上

这被打印在屏幕上