item6:尽量避免创建不需要的对象
-
错误示范1
//"test"本身就是一个对象,调用String的构造函数再生成一个 // Stringd的对象s,没有什么意义 String s = new String("test");
-
错误示范2
public static long sum() { Long sum = 0; for (long i=0; i<=Integer.MAX_VALUE;i++) { sum += i; } } //这里的sum是Long类型。与long类型的i相加,会自动变成 //new Long(sum.longvalue+i) //警惕自动装箱。尽量使用原始数据类型
但注意:这条item的目的不是说创建对象很耗时,不推荐创建新对象。相反,得益于JVM的性能优化,创建销毁对象的性能很好。若创建新对象更方便,更清晰,那就创建新对象,只是不要创建无谓的新对象。
item8: 消灭无效引用
对不再有效的对象,却仍有引用指向,将引用置为null
interface Stack {
int getSize();
boolean isEmpty();
Object top();
void push(Object e);
Object pop();
}
class ArrayStack implements Stack {
private final int CAP = 16; //初始容量
private int capacity = 0; //当前容量, 也是插入元素的位置(即栈顶+1)
private Object[] elements;
public ArrayStack() {
elements = new Object[CAP];
}
@Override
public int getSize() {
return capacity;
}
@Override
public boolean isEmpty() {
return capacity == 0;
}
@Override
public Object top() {
return elements[capacity-1];
}
@Override
public void push(Object e) {
ensureCapcity();
elements[capacity++] = e;
}
@Override
public Object pop() {
// return elements[--capacity]; //保留了无效引用
Object result = elements[--capacity];
elements[capacity] = null; //把当前引用,即上一个栈顶元素引用置为null
return result;
}
public void ensureCapcity() {
if (elements.length == getSize()) {
elements = Arrays.copyOf(elements, getSize()*2 +1);
}
}
}