A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 樱木花道10 于 2013-3-19 23:02 编辑

public class equalsDemo {
        public static void main(String[] args) {
                String s1="123";
                String s2="123";
                String s3=new String("123");
                String s4=new String("123");
                System.out.println(s1.equals(s2));
                System.out.println(s3.equals(s4));
        }
        
}
这里的equals是比较的值,为什么“两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?”,这里面为什么答案又不是这样呢,很难理解了,而且我本来然为equals是对值进行比较的,,今天老师又说了一个是进行地址值比较的,,我吐了,,想不明白

点评

请对回复者的回答进行适当的回复,如果问题未解决,请继续追问,如果解决了,请尽快将分类改为“已解决”,谢谢  发表于 2013-3-18 22:31

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

8 个回复

倒序浏览
equals继承自Object对象,是比较两个对象的地址是否相等,但是String类覆写了此方法,
比较字符串的内容是否相等
Object的equals源码是比较hashcode的,实际很多类都重写了此方法

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 夏晓彤 于 2013-3-18 21:40 编辑

Object和String的equals方法是不同的。String的equals方法覆盖了Object的equals方法
Object的equals方法:指示其他某个对象是否与此对象“相等”。地址值相同指向同一对象
String:将此字符串与指定的对象比较。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
equals()是Object类继承过来的方法,在object中他就是比较的两个对象的地址也即hash code值,此时等同于==,
不过String重写了该方法,默认比较的是字符串中的字符序列!

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
equals是Object的方法,所有的类都继承自Object所以它们的对象都可以调用该方法,该方法比较的是hashcode值是否相等。
但是在String的equals方法复写了Object的equals方法,它比较的是字符串的内容是否相等。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
String类的equals()方法来说,它覆写了Object类中的equals()方法,它是判断当前字符串与传进来的字符串的内容是否一致。对于String对象的相等性判断来说,请使用equals()方法,来判断字符串的内容是否相等。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
这个问题分为两点说
一:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。(来自API文档)。在Object类中有有equals方法,Object中的equals方法比较的是地址值
二:由于Object是根类,所以在java中,任何类中也有equals方法。但是,在继承体系中,有一个比较重要的概念---复写。就是当子类继承父类的时候,要么直接使用父类中的方法,要么根据实际情况,复写父类中的方法(也就是改变父类中某些函数的功能来满足自己的要求)。在String类中,对equals方法进行了复写,功能是比较字符串的两个值是否相同,与此情况相同的有包装类Integer,Integer中equals方法比较的也是值而非地址值
另:Object中的toString()方法,hashCode()也经常会被复写来满足需求。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
equals 方法是 java.lang.Object 类的方法。
有两种用法说明:
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其
对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
  1. String s1="123";
  2. String s2="123";
  3. String s3=new String("123");
  4. String s4=new String("123");
  5. System.out.println(s1.equals(s2));   //ture   
  6. System.out.println(s3.equals(s4));      //ture  因为String重写了Object的equals( )所以这里比较的是内容,而不是地址值所以结果都为true
复制代码
“两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?”


这句话不对,注意:两个对象值相同  他没说是谁的对象,如果是Object类的对象,,equals( )比较的是地址值
  如果是String类的对象,,如你的例子,String类重写了equals( )所以比较的是内容

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马