今天看了hashCode()的视频,以前有接触过hashCode()这个方法,但是并不是很了解。
上网再查了一些关于hashCode()见解,下面就赶紧把自己的一些理解记下来:
hashCode()方法主要用来规定一个对象在内存上的位置,这要从集合类ArrayList、hashSet说起
,ArrayList是List接口的实现类,允许存在重复的元素,HashSet是Set接口的实现类,不允许存在重复的元素,
那么对于重复该如何定义呢?
如果用equals来一个个判断,随着集合元素的增加,程序的性能就会下降,比如集合内已经有100个对象,那么要加入第101个对象的时候就要比较100次后在加入。
针对这种情况。有个牛人就发明了hashCode这种算法
在加入对象时。先通过hashCode()来算的该对象在内存上的位置。位置确定后。加入对象时。如果该位置上已经有对象了,则调用equals()方法来判断这两个对象是否相同。这样就可以有效的降低了调用equals()方法的次数
另一个牛人的观点:如果元素被加入hashSet中。最好就不要修改用来算hashCode的元素的值。如果修改就会造成内存泄漏
所谓的内存泄漏,就是你以为把集合里面的一个元素删掉了,但实际上那个元素还偷偷的保留在你的内存上了。
如下所示,如果没有
// r1.setX(3);
// allSet.remove(r1);
这两句输出的长度为三,按理说执行完remove()方法后。输出的长度应该为2.但是由于改变了对象r1的x的值。造成内存泄漏。最终输出的值还是3
VO类
package cn.yangtao.reflect;
public class ReflectPoint {
private int x;
private int 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;
final ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
主类
package cn.yangtao.reflect;
import java.lang.reflect.*;
import java.util.HashSet;
import java.util.Set;
public class ColectionReflect {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Set allSet=new HashSet();
ReflectPoint r1=new ReflectPoint(1,3);
ReflectPoint r2=new ReflectPoint(3,2);
ReflectPoint r3=new ReflectPoint(1,4);
ReflectPoint r4=new ReflectPoint(1,3);
allSet.add(r1);
allSet.add(r2);
allSet.add(r3);
// r1.setX(3);
// allSet.remove(r1);
System.out.println(allSet.size());
}
}
再说一下经常忘记做的一件事,就是连接完数据库经常在用完之后就忘记关闭了。这也是内存泄漏的一种。