83.md 3.3 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10
# Java 中的弱引用

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

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

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

Java 中有 4 种引用类型:

W
wizardforcel 已提交
11 12 13 14
1.  强引用
2.  弱引用
3.  软引用
4.  幻影引用
W
init  
wizardforcel 已提交
15

W
wizardforcel 已提交
16
在这里,我们将讨论弱引用。
W
init  
wizardforcel 已提交
17

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

W
wizardforcel 已提交
20
弱引用是指不足以使对象保留在内存中的引用。 因此,弱引用可以让垃圾收集器确定对象的可及性以及所讨论的对象是否应保留在内存中。
W
init  
wizardforcel 已提交
21 22 23

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

W
wizardforcel 已提交
24
## 什么是弱可达性?
W
init  
wizardforcel 已提交
25 26 27 28 29 30 31

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

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

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

W
wizardforcel 已提交
32
## 弱引用在哪里使用?
W
init  
wizardforcel 已提交
33

W
wizardforcel 已提交
34
*   弱引用主要用于**规范化映射的实现中**。规范化映射是指映射仅包含特定值的一个实例。
W
init  
wizardforcel 已提交
35

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

W
wizardforcel 已提交
38
代码示例:
W
init  
wizardforcel 已提交
39

W
wizardforcel 已提交
40
私有静态类`TryingOut<K, V>`扩展了`WeakReference<Object>`实现`Map.Entry<K, V>`
W
init  
wizardforcel 已提交
41

W
wizardforcel 已提交
42
*   失效监听器问题也使用弱引用。 在这种情况下,可以通过弱引用来处理内存泄漏问题。
W
init  
wizardforcel 已提交
43

W
wizardforcel 已提交
44
## 实现弱引用:
W
init  
wizardforcel 已提交
45

W
wizardforcel 已提交
46
`java.lang.ref.WeakReference`类在处理和创建弱引用时使用。
W
init  
wizardforcel 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

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

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(); 
    } 
}

```

W
wizardforcel 已提交
87
代码的输出:
W
init  
wizardforcel 已提交
88 89 90 91

这被打印在屏幕上

这被打印在屏幕上