public class MyStack { private Object[] elements;// 栈用来装元素的 private int size = 0;// 栈的大小 private static final int DEFALT_INITIAL_CAPACITY = 16; public MyStack(){ elements = new Object[DEFALT_INITIAL_CAPACITY]; } /* * 入栈 */ public void push(Object e) { ensureCapacity(); } /** * 出栈 */ public Object pop() { if(size==0) throw new EmptyStackException(); return elements[--size]; } /** * 动态扩展栈的空间,确保栈中有足够的空间 */ private void ensureCapacity() { if(elements.length==size) { elements = Arrays.copyOf(elements, 2*size+1); } } }二、hashCode与内存泄露:
public class MemoryLeakDemo { public static void main(String[] args) { Point p1 = new Point(1,2); Point p2 = new Point(3,4); Point p3 = new Point(3,6); Collection<Point> c = new HashSet<Point>(); c.add(p1); c.add(p2); c.add(p3); c.add(p1); System.out.println("原来的对象数量:"+c.size()); // p1.setX(5); c.remove(p1); System.out.println("处理后的对象数量:"+c.size());// 原来有三个对象,删除后还有两个,打开上面的注释后,变成三个。 } } class Point { private int x; private int y; public Point(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Point other = (Point) obj; if (x != other.x) return false; if (y != other.y) return false; return true; } }原来有3个对象,删除后还有2个,打开上面的注释后,变成3个。为什么会对象删不掉呢?因为修改hashCode后,这个对象所在存储区域发生变化(哈希查找基本思路:通过计算对象的哈希码,然后进行哈希码分组,将对象存储到不同的区域,当需要对象时只需通过哈希码就可以确定对象属于哪个存储区域,从而加快了查找效率),执行remove方法后对象没有被删除,所以仍然是这么多元素。因为不用的对象占着内存不释放,所以出现了内存泄露的问题。那么,随着增删操作元素的次数不断增加,内存的耗用越来越大,从而导致程序异常结束。
原文地址:http://blog.csdn.net/u010213127/article/details/45113093