小编给大家分享一下equals和hashcode是什么,希望大家阅读完这篇文章后大所收获、下面让我们一起去探讨吧!
<强> equals和hashcode总结:强>
=方法没有重写的话,用于判断对象的内存地址引用是否是用一个地址。重写之后一般用来比较对象的内容是否相等(比如学生对象,里面有姓名和年龄,我们重写=方法来判断只要姓名和年龄相同就认为是用一个学生)。
hashcode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,当然你也可以重写它,hashcode方法只有在集合中用到。
对象放入集合中时,先判断hashcode是否相等,再判断=是否相等,都相等就算是同一个对象,则列表可以放入,因设置为不允许重复所以不会放入。
例如:
公开课学生{ 私人int年龄; 私人字符串名称; 公开学生(int年龄、字符串名称){ 这一点。年龄=年龄; this.name=名称; } 公共int getAge () { 返回年龄; } 公共空间setAge (int年龄){ 这一点。年龄=年龄; } 公共字符串getName () { 返回名称; } 公共空间setName(字符串名称){ this.name=名称; }//重写=方法,判断姓名和年龄相同就是相等的 公共布尔=(对象o) { 如果(o==null) { 返回错误; } 如果(this.getClass () !=o.getClass ()) { 返回错误; } 学生学生=(学生)o; 如果(name==null) { 返回错误; } 如果(年龄==student.getAge(),和name.equals (student.getName ())) { 返回true; } 返回错误; } 公共静态void main (String [] args) { 学生studentOne=新学生(1,“yjc"); 学生studentTwo=新学生(1,新的字符串(“yjc")); System.out.println (studentOne.equals (studentTwo)); System.out.println (“1:“+ studentOne.getName () .hashCode ()); System.out.println (“2:“+ studentTwo.getName () .hashCode ()); }//输出结果:没错 1:119666 2:119666 }
以上可以看的出,两个字符串都叫“yjc",无论是直接“yjc"还是新的字符串(“yjc"),他们的hashcode都相同,所以在重写hashcode方法时可以运用这一点。
比如你希望如果姓名和年龄相同,不仅等于相同,他们的hashcode也要相同,可以这样重写hashcode:
公共int hashcode () { 最后一个int '=31; int结果=1; 结果=' *结果+年龄; 结果=' *结果+ (name==零?0:name.hashcode ()); 返回结果;//直接写年龄+ (name==零?0:name.hashcode())也行就是感觉太简单0.0了 }
这样一来两个姓名和年龄相同的学生对象就是同一个对象了,放入组中会被认为是同一个,无论放几个这样的对象,set.size()都是等于1 .
同样,HashMap因也为关键是唯一的,HashMap对象是根据其关键的hashCode来定位存储位置,并使用=(关键)获取对应的价值,所以在放置时判断键是否重复用到了hashCode和等于,若重复了则会覆盖。
看完了这篇文章,相信你对equals和hashCode是什么有了一定的了解,想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!