黑马程序员技术交流社区

标题: hashCode() == equals 区别: [打印本页]

作者: 我能驾驭住    时间: 2012-6-3 10:01
标题: hashCode() == equals 区别:
String S1 = "I love you";
String S2 = "I love you";
System.out.println(S1.equals(S2));// 返回值是true
System.out.println(S1 == S2);// 返回值是true
System.out.println(S1.hashCode()==S2.hashCode());//返回值是true



String S1 =new String("I love you");
String S2 = new String("I love you");
System.out.println(S1.equals(S2));// 返回值是true
System.out.println(S1 == S2);// 返回值是flase(因为用new创建对象时返回的引用时不相同的)
System.out.println(S1.hashCode()==S2.hashCode());//返回值是true


WHY?????
作者: 吴超    时间: 2012-6-3 10:04
本帖最后由 吴超 于 2012-6-3 10:18 编辑

首先你要了解,==比较的是对象的地址
equals比较字符串的内容值
hascode和equals一样
建议看源码,能更深入了解三者区别

String S1 = "I love you";//放在常量池里
String S2 = "I love you";//相同字符串,会放在常量池里
System.out.println(S1.equals(S2));// 返回值是true
System.out.println(S1 == S2);// 返回值是true
System.out.println(S1.hashCode()==S2.hashCode());//返回值是true



String S1 =new String("I love you");//这是2个对象,一个是new 的一个对象,另一个是"I love you"字符串
String S2 = new String("I love you");
System.out.println(S1.equals(S2));// 返回值是true
System.out.println(S1 == S2);// 返回值是flase(因为用new创建对象时返回的引用时不相同的)
System.out.println(S1.hashCode()==S2.hashCode());//返回值是true





作者: 古银平    时间: 2012-6-3 10:13
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

作者: 黑马张扬    时间: 2012-6-3 10:18
==:是对两个对象的地址进行比较(也就是比较引用是否相同)
equals():是对两个对象的内容进行比较。
hashCode():是用来产生哈希玛的
作者: 杜俊彪    时间: 2012-6-3 10:21
其余的你应该好理解;   其实就hashCode() 方法,   如果你平时复写过hashCode()方法,你应该注意到了,里面的代码,  它只和对象里的成员变量有关; 如一个类中有二个成员变量private int age; private String name ;   复写hashCode()方法;
  1. @Override
  2.                 public int hashCode() {
  3.                         final int prime = 31;
  4.                         int result = 1;
  5.                         result = prime * result + age;
  6.                         result = prime * result + ((name == null) ? 0 : name.hashCode());
  7.                         return result;
  8.                 }
复制代码

作者: 何拴绪    时间: 2012-6-3 10:44
equals方法一般要被重写,而且重写equals方法必须重写hashCode方法,如果两个对象相等,则他们的哈希值就相同。
你的代码中比较的是字符串,String类重写了equals方法和hashCode方法,具体的实现参考String类的源码。
作者: 黄克帅    时间: 2012-6-3 11:25
==  比较的是地址值是否一样     Object的equals方法也是比较的地址值是否相同,但是String类重写了Object类的equals,改为比较里面的内容是否一样  同一类型的hashCode的计算,与他们的具体内容有关。

String S1 = "I love you";   
String S2 = "I love you";
"I love you"; 放在常量池  当创建s2的时候会去常量池里面,有相同的,就不会再开辟一个空间了,s2 直接指向存在的那个地址,所以他们指向的地址值一样

String S1 =new String("I love you");
String S2 = new String("I love you");
new一次 就创建一个新的对象,他们地址值不一样。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2