1.清除过期对象引用,防止内存泄漏
例子:
public Object pop() {
if (size == 0) {
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
一旦元素被释放,元素中包含的任何对象引用都要被清除。
常见内存泄漏:把引用放到缓存中,容易遗忘;监听器和回调,注册后没有取消。
2.equals和hashCode
hashCode返回一个数值型散列值,根据该值确定对象在散列表中存在的位置。所以相同的对象必须要有相同的hashCode。覆盖equals时,hashCode也需要覆盖。否则会出现这种情况。
class Dog {
String name;
public Dog(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Dog)){
return false;
}
return ((Dog) obj).name.equals(this.name);
}
}
@Test
public void test() {
Map<Dog, Object> map = new HashMap<>();
map.put(new Dog("aa"), "aa");
System.out.println(map.get(new Dog("aa"))); //null
}
覆盖了equals方法,两个dog实例是相等的,但是它们的散列值不同,所以第一个put的dog对象被放到了一个散列桶中,而第二个get的dog对象是在另一个散列桶中获取,自然为null