第二章:创建和销毁对象。ITEM6:消除过期的对象引用。

 1 package com.twoslow.cha2;
 2 
 3 import java.util.Arrays;
 4 import java.util.EmptyStackException;
 5 
 6 public class Stack {
 7 
 8     private Object[] elements ; 
 9     
10     private int size = 0; 
11     
12     private static final int DEFAULT_INITIAL_CAPACITY = 16 ;
13     
14     public Stack() {
15         elements = new Object[DEFAULT_INITIAL_CAPACITY] ; 
16     }
17     
18     public void push(Object e) {
19         ensureCapacity() ;
20         elements[size++] = e ;
21     }
22     
23     public Object pop() {
24         if(size == 0)
25             throw new EmptyStackException() ;
26         Object result = elements[--size] ;
27         /*
28          *下列3种情形需要考虑手动处理资源:
29          *1) 类是自己管理内存,如例子中的 Stack 类。
30          *2) 使用对象缓存机制时,需要考虑被从缓存中换出的对象,或是长期不会被访问到的对象。
31          *3) 事件监听器和相关回调。用户经常会在需要时显示的注册,然而却经常会忘记在不用的时候注销这些回调接口实现类。 
32          *
33          *
34          *当我们调用 pop 方法是,该方法将返回当前栈顶的 elements,
35          *同时将该栈的活动区间(size)减一,
36          *然而此时被弹出的 Object 仍然保持至少两处引用,
37          *一个是返回的对象,另一个则是该返回对象在 elements 数组中原有栈顶位置的引用。
38          *这样即便外部对象在使用之后不再引用该 Object,那么它仍然不会被垃圾收集器释放,久而久之导致了更多类似对象的内存泄露
39          */
40         elements[size] = null ;
41         return  result;
42     }
43 
44     private void ensureCapacity() {
45         if(elements.length == size) 
46             elements = Arrays.copyOf(elements, 2 * size + 1) ;
47     }
48     
49 }

 

转载于:https://my.oschina.net/u/726229/blog/310076

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值