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 于上海

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值