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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wedge 中级黑马   /  2013-7-14 17:55  /  1689 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请哪位帮忙解释一个这两个的区别,以及最好能举例说明 在什么时候用哪个比较合适?

评分

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

查看全部评分

13 个回复

倒序浏览
  1. /**
  2. *
  3. */
  4. package com.itheima.test;

  5. /**
  6. * @author Administrator
  7. *
  8. */
  9. public class StringTest {
  10. public static void main(String[] args) {
  11.         String str=new String("aaa");
  12.         String str1="aaa";
  13.         //==是比较地址的,这两个地址不同,所以会返回null;
  14.         System.out.println(str1==str);
  15.         //equals是比较字符内容的,因为内容相同返回true
  16.         System.out.println(str.equals(str1));
  17. }
  18. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
==操作符专门用来比较变量的值是否相等,==操作符并不涉及到对象内容的比较。对象内容的比较,正是equals方法做的事。
回复 使用道具 举报
Object里面的equals源码还是用的==,  一般根据自己需求重写, 下面是张孝祥 面试题里面的解释

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

评分

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

查看全部评分

回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变
    量所对应的内存中所存储的数值是否相同,要比较两个基本类型
    的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块
内存,对象本身占用一块内存(堆内存),变量也占用一块内存,
例如Objet obj = new Object();变量obj是一个内存,new Object()是
另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占
用的那块内存的首地址。对于指向对象类型的变量,如果要比较两
个变量是否指向同一个对象,即要看这两个变量所对应的内存中的
地址是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。

评分

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

查看全部评分

回复 使用道具 举报
==是一个逻辑运算符,判断运算符两边的数值或类型是否相等
而Equals是一个方法,虽然两个者有相近的意近,但还是有所不能的,在C#,所有的类型都是从Object继承,作为Object的回个方法之一的Equals就会被继承下来,所以能用来判断,但==这个运算符就不一定了,下面举个例子

    struct AA
    {
        public int i;
    }



static void Main(string[] args)
        {         

            AA a = new AA();
            a.i = 100;
            AA c = new AA();
            c.i = 101;
           Console.WriteLine (  a==c     );
           Console.WriteLine(a.Equals (c));

         }

你会发现a==c会报错,说==不支持这种判断,但a.Equals(c)是没错的,因为struct也继承至Object。

ok??
回复 使用道具 举报
如果判断比较的双方是否是同一个东西,就用“==”,如判断两个引用型变量是否指向同一个对象;如果是判断比较双方的某种属性或内容等是否相同,则用equals。
我的个人见解啊
回复 使用道具 举报
如果判断比较的双方是否是同一个东西,就用“==”,如判断两个引用型变量是否指向同一个对象;如果是判断比较双方的某种属性或内容等是否相同,则用equals。
我的个人见解啊
回复 使用道具 举报
本帖最后由 牛海亮 于 2013-7-15 11:16 编辑

这两种方法可用于对象间的比较。“==”操作符用于比较两个变量的值是否相等,equals()方法用于比较两个对象的内容是否一致。
  1. public class Compare
  2. {
  3.         
  4.         public static void main(String[] args)
  5.         {
  6.                 String str1 = new String("abc");
  7.                 String str2 = new String("abc");               
  8.                 if(str1 == str2)
  9.                 {
  10.                         System.out.println("str1==str2");
  11.                         
  12.                 }
  13.                 else
  14.                 {
  15.                         System.out.println("str1!=str2");
  16.                 }
  17.                 if(str1.equals(str2))
  18.                 {
  19.                         System.out.println("str1.equals(str2)");
  20.                 }
  21.                 else
  22.                 {

  23.                         System.out.println("!str1.equals(str2)");
  24.                 }

  25.         }

  26. }
复制代码
这段代码的运行结果为:
str1!=str2
str1.equals(str2)
这个最好从变量在内存中的状态去理解:
1.str1是对象的引用,它里面存的是对象的地址,也就是创建对象时申请的那块地址,在创建对象str2时又申请了一块地址,两块地址肯定不会是一样的,str1和str2的值就是这两个地址,所以在用“==”比较时,是“不等的”。
2.str1和str2这两个对象都是字符串“abc”,所以他们在堆内存中存储时,尽管存储的位置不一样,但转换成的二进制代码一定是一摸一样的,而equals方法就是对对象的内容比较的,由于两个对象在内存中的状态一模一样,所以用equals比较时是“相等的”。
下面这个图帮你理解一下对象和对象引用在内存中的状态。

捕获.PNG (19.68 KB, 下载次数: 0)

捕获.PNG
回复 使用道具 举报
有个概念要清楚。java中变量类型分为值类型和引用类型。值类型就是值的本身,而引用类型是变量在内存中分配的地址引用。所以==  equals也就比较好理解了。
== :比较两个变量值是否相等,对于引用类型的话比较的是引用类型地址中存储的内容的是否相等;
equals:比较是两个变量是否是对同一个对象的引用。
回复 使用道具 举报
==判断两个对象在内存中是否是一个,是否值相同一块内存,而equal是用hashCode来判断两个对象是否相同,根据特定hashcode的算法计算两个对象的hashcode相同时,这两个对象就是一个对象
回复 使用道具 举报
本帖最后由 py强子 于 2013-7-15 23:38 编辑

==操作符专门用来比较变量的值是否相等;
String a = "abc";
String b = "abc";
a == b;
结果:true
对象内容的比较,正是equals方法做的事
String   a=new   String( "abc ");
String   b=new   String( "abc ");
a.equals(b);
结果:true
回复 使用道具 举报
“==”是看两个对象是否是同一个对象,也就是两个对象引用是否指向同一个对象(Java分配的内存地址一样)当然如果用于int,long,double就不是看两个值是否相等了。 equals()是比较两个对象的内容是否相等,一般如果用户自己不定义针对自己的类的equals()方法,那么就会使用Object的活着你的类的父类的这个方法。如果你的类里没有对象引用的域,就不必要覆盖equals()(注意String域也是对象)String有自己的equals()方法(它已经覆盖了Object的该方法了。 如果你的类中的域有对象引用,那么你需要重写equals() 因为Object的equals()的工作实质是对你的所有的域进行“==”比较历遍,所以如果你的域有对象引用,“==”比较就又变成了对域的对象引用是否指向同一个对象了
回复 使用道具 举报
==操作符专门用来比较变量的值是否相等,==操作符并不涉及到对象内容的比较。equals()主要比较的是对象的地址值。每个对象都有equals()方法。对应在内存中的地址值是不一样的。就像分别用New连个相同对象。他们地址值是不一样的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马