本文是 《Effective Java Second Edition》第6條的讀書筆記,文中如有錯誤或表述不當,非常歡迎能批評指正,本人不勝感激!
我們來用一段通俗易懂的話來描述什麼是過期的對象引用
在我們的程序中,有一些對象我們程序員已經非常明確的知道其不會再被使用,由於還存在被引用(我們知道如果執行了這種引用就是非法操作),所以不會被GC(內存泄露),所以這種引用的額存在已經沒有任何的價值,故我們將這種引用行爲稱之爲 過期的對象引用。
在我們數據結構之中,堆棧和隊列的實現就是一個可能會存在過期的對象引用的例子。
看如下隊列實現的代碼
package com.blog.effective6;
/**
* 存在過期對象引用的隊列.
*
* @author 張俊強~.
* @date 2017/11/12-8:48.
*/
@SuppressWarnings("unchecked")
public class MyQueue<T> {
private T[] elements; //保存數據的對象數組
private int size = 0; //當前隊列的大小
private int cur = 0; //標識下一個pop出來的對象的位置
private static final int MyQueueSize = 20;//隊列的最大大小
public MyQueue() {
elements = (T[]) new Object[MyQueueSize];
}
public void push(T t) {
if (size < MyQueueSize) {
elements[size++] = t;
} else {
throw new RuntimeException("當前隊列已滿");
}
}
public T pop() {
if (cur < size) {
return elements[cur++];
}
throw new RuntimeException("當前隊列爲空");
}
}
如果我們首先push()
五個元素,再pop()
兩個元素出來。
這時候我們的cur
指向的就是第三個元素的位置
前兩個元素由於被pop()
出去,所以我們知道其不會再被使用,然後它仍然在內存中存在。那麼對這個存在的對象的應用就是過期的了!
如下圖示
那麼在這個例子中,我們要怎樣來消除這一引用呢?
如下,我們在pop()
的時候,將對應的要pop()
的數組元素的對象引用指向null
就可以了。
public T pop() {
if (cur < size) {
T t= elements[cur];
elements[cur]=null; //指向 null
cur++;
return t;
}
throw new RuntimeException("當前隊列爲空");
}
過期的對象引用勢必會引起內存泄露,有關內存泄露的更多內容下次再寫!
以上 2017/11/12 09:49 於上海