Effective Java -- 消除過期的對象引用

本文是 《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 於上海

發佈了179 篇原創文章 · 獲贊 230 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章