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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 愿㊡╃數曐曐メ 中级黑马   /  2013-5-29 22:34  /  2497 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有两个字符串 s1="abcd" ,s2="1234",s1==s2和s1.equais(s2)是对s1和s2做同样的比较吗?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

15 个回复

倒序浏览
Object里的equals就是==的调用,比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量的地址是否相同,不过String类复写了Object里的equals方法,用于比较字符串的内容

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
s1==s2比较的是 内存地址值
String 类 复写了 equals方法
s1.equais(s2) 比较的是字符串的内容

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
A. equals(B)         
变量A与变量B中字符串是否相容
假如A中是java, B中是JAVA ,则A不等于B


A==B   比较A和B的数据类型,A和B变量内的数据   
A、B数据类型和变量内数据同时相等,则A==B

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
对于“==”是比较内存地址,对于equals比较是内容
例如:
String s1=new String("sos");
String s2=new String("sos");
s1==s2返回false
s1.equals(s2)返回true

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
A==B 比较两引用变量是否指向同一对象
A.equals(B)比较两个引用变量对象的值
回复 使用道具 举报
"==" 数值比较运算符,在这个例子中,由于s1 与 s2是两个引用变量,他们的值为指向的对象的内存地址值。由于字符串是对象,很明显,s1与s2指向的不是同一个对象,所以他们的内存地址值肯定不相同。

而equals是Object类(上帝)中的比较方法,在Object类的源代码中,equals是这样定义的:
  1. public boolean equals(Object obj)
  2. {
  3.         return (this==obj);
  4. }
复制代码
可以看到equals原本是比较两个引用的,即内存地址。

但是,
String类是继承的Object类,并且复写了Object类中的equals方法。
复写之后,String中的equals比较的是两个字符串对象的“内容”,即:将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
用个代码说一下:
  1. class  StringTest0
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String s = new String("abc");
  6.                 String s1 = "abc";
  7.                 String s2 = "abc";
  8.                 System.out.println(s1==s2);
  9.                 System.out.println(s==s2);
  10.                 System.out.println(s.equals(s1));
  11.         }
  12. }
复制代码
这里的结果是 true false true
回复 使用道具 举报
有两个字符串 s1="abcd" ,s2="1234",s1==s2和s1.equais(s2)是对s1和s2做同样的比较吗?
楼主:
1、s1和s2是String类型的变量,变量里存放的是地址。因此这里,s1里存放的是字符串"abcd”的内存地址,s2存放的是字符串"1234"的内存地址,二者地址肯定是不同的。
2、符号"==",比较两边值是否相等,s1与s2值(即"abcd"与"1234”内存地址肯定不同)。
3、s1.equais(s2),比较的是变量s1和s2地址指向的字符串的值是否相等。
回复 使用道具 举报
嗯  我开始也是这么记住的==比较的是地址值,equals比较的是内容,String复写了object的equals方法。其实我举个例子你就明白了 为什么equals用的是==却比较的是内容
class Person
{
        /*
          public boolean equals(Object obj)//Object obj = p2;
          {
              return this == obj;//比较地址值
             }
        */

    private String name;
    private int age;

    Person(String name,int age)
        {
           this.name = name;
           this.age = age;
        }

        public boolean equals(Object obj)//Object obj = p2;多态,父类引用指向自己的子类对象
        {
                //调用这个方法的对象,和传递对象地址值一致,同一个对象,直接返回true
                if(this == obj)
                        return true;
           //原先是比较地址值,改变比较形式,比较的是对象中的年龄
           if(obj instanceof Person)
                {
             Person p = (Person)obj;//将父类的引用强转成子类的实例对象
             return this.age == p.age;//或者换成name比较也可以
                }
                return false;
        }
}
class ObjectDemo
{
        public static void main(String[] args)
        {
                Person p1 = new Person("悟空",500);
                Person p2 = new Person("八戒",800);

                boolean b = p1.equals(p1);//这样比较的就是内容了
                System.out.println("b="+b);
                System.out.println("p1==p2"+(p1==p2));//比较的是地址值
        }
}

希望对你的理解有帮助

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
风乐 发表于 2013-5-29 22:47
Object里的equals就是==的调用,比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量的地址是否 ...

那就是不能比较是吧!
回复 使用道具 举报
孔雀东南飞 发表于 2013-6-1 08:31
有两个字符串 s1="abcd" ,s2="1234",s1==s2和s1.equais(s2)是对s1和s2做同样的比较吗?
楼主:
1、s1和s2是 ...

我喜欢这个回答!
回复 使用道具 举报
s1 == s2 是比较的内存地址。如果这个类没有复写equals方法,用equsls比较的还是内存地址。复写后就按照复写的内容进行判断了
回复 使用道具 举报
s1 == s2 比较的是内存,而 s1.equals(s2),比较的是 字符。。这个涉及到字符的常量池
回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
虽然能达到相同的功能,但是在执行效率和内存存储对象个数上是有区别的,
回复 使用道具 举报
用于比较基本类型和引用类型,对于基本类型来说比较好理解,就是值是否相等,引用类型比较的是对象的地址值,其实就是“栈”里的内容
而“equals”比较的是对象内容,是堆里的内容。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马