Java中的hashcode⽅法
剪纸歌1. 什么是hashcode⽅法?
在java中hashcode⽅法是Object类的native⽅法,返回值为int类型,根据⼀定的规则将与对象相关的信息(⽐如对象的存储地址,对象的字段等)映射成⼀个数值,这个数值称作为散列值。
2. hashcode⽅法的作⽤
在java中hashcode是⽤于快速查找对象物理存储区使⽤的,主要作⽤于散列集合(HashSet,HashMap,),在插⼊散列集合前需要判断obj是否存在,⾸先判断插⼊obj的hashcode值是否存在,hashcode值不存在则直接插⼊集合,值存在还需判断equals⽅法判断对象是否相等。使⽤hashcode码确定对象存放区,若存放区不存在则对象⼀定不存在⽆需equals判断直接插⼊。若该区存在只⽐较该区对象equals判断。所以这种⽅法⼤量节省判断时间。
通过⼀个例⼦我们来认识这这个⽅法
public class Test {
public static void main(String[] args) {
// 创建两个不同的集合
Collection c1 = new ArrayList();
Collection c2 = new HashSet();
// 创建四个对象
TestPoint p1 = new TestPoint(2,2);
TestPoint p2 = new TestPoint(3,3);
TestPoint p3 = new TestPoint(4,4);
TestPoint p4 = new TestPoint(2,2);
c1.add(p1);c1.add(p2);c1.add(p4);c1.add(p4);绿豆薏仁
System.out.println(c1.size()); //4中华优秀传统
c2.add(p1);c2.add(p2);c2.add(p3);c2.add(p4);
System.out.println(c2.size()); //3 这是TestPoint重写了hashcode和equals⽅法
帮扶
// 未重写equals⽅法答案为4 ,证明hashcode相同不⼀定对象相同,两个对象相同需要重写equals⽅法
// 未重写hashcode⽅法答案依然为4,说明散列集合判断对象是否存在需要hashcode⽅法
// 当然两个⽅法都不重写答案⼀定是4吧,个⼈认为,因为对象不同指定堆栈地址不同
//这⾥还可以测试⼀个问题当⼀个对象加⼊散列集合中,若对象成员改变会有哪些影响
p1.x = 3; // 通过对象对应堆栈地址,散列集合中对象值也改变
System.out.println(p1);
for(Object Array()) {
System.out.println(obj);
}
// 修改后的对象hashcode值改变 equals⽅法也判断为错
System.out.println(c2.size()); // 答案为3错字成语
for(Object Array()) {
System.out.println(obj);
}
// 移除不了时这时,程序员若未发现会让这个对象⼀直存在,如果类似对象循环积累会造成内存溢出
}
}
Test中需要的测试实体:
public class TestPoint {
public int x;
private int y;
public TestPoint(int x,int y) {
this.x = x;
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 fal;
if (getClass() != Class())
return fal;
TestPoint other = (TestPoint) obj;
if (x != other.x)
return fal;
if (y != other.y)
return fal;
return true;
}
}
suv汽车大全10万左右3. 总结:
1) 在散列集合中只实现插⼊对象通过hashcode值不能确定对象对象是否存在,hashcode值相同,还需判断对象equals确定对象是否存在。
2.)在散列集合存储⽆重复对象需重写hashcode和equals⽅法,hashcode⽅法是为了检索对象范围。equals才是判断对象是否相等的⽅法。所以相同对象hashcode⼀定相同,相同hashcode的对象不⼀
什么柚子最好吃定相等。
3) 存储在散列集合中的对象被改变后,在集合中被忽略⽆法remove,内存⽆法释放回收,⼤量积累会造成内存溢出。