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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张志民 中级黑马   /  2014-5-14 22:34  /  3274 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张志民 于 2014-5-15 08:05 编辑

求帮忙总结==和equals的区别和用法的不同

评分

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

查看全部评分

23 个回复

倒序浏览
equals 是方法,用来检测两个对象的内容是否相等。
==是符号,他比较的是一个对象在内存中的地址值。
比如:
  1. String s1="a";
  2.                 String s2="b";
  3.                 if(s1.equals(s2))
  4.                         System.out.println("eqal");
  5.                 if(s1.getClass()==s2.getClass())
  6.                         System.out.println("==");
  7.                 //结果为==
复制代码
回复 使用道具 举报
用equals方法来比较对象是否相等的。于是继续找到equals的源代码,如下:
  public boolean equals(Object obj) {
  return (this == obj);
  }
equals 方法是 java.lang.Object 类的方法。
有两种用法说明:

(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。

点评

回答问题 请自己用心回答哦  发表于 2014-5-16 14:15
回复 使用道具 举报
1007886543 来自手机 中级黑马 2014-5-14 22:53:23
板凳
==比较两个对象是否引用同一个实例;equals()用于比较两个对象是否相等。
回复 使用道具 举报

用equals方法来比较对象是否相等的。于是继续找到equals的源代码,如下:
  public boolean equals(Object obj) {
  return (this == obj);
  }
equals 方法是 java.lang.Object 类的方法。
有两种用法说明:

(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。
回复 使用道具 举报 1 0
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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 很给力!

查看全部评分

回复 使用道具 举报
==比较的是两个变量的存储地址(有可能内容相同却不是正确的)
equal比较的是两个变量中的内容
回复 使用道具 举报
stream 中级黑马 2014-5-15 11:41:14
8#
equal是OBJECT里的方法,都能用的呗。。==比较的是地址。。这个运算符能不能重载啊?
回复 使用道具 举报
张百振 发表于 2014-5-15 01:08
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

非常感谢
回复 使用道具 举报
"==" 是判断符号两边的对象是否相等,即它们的内存地址是否相等;
equals() 是判断两个对象的值是否相等,而不管它们的内存地址是否相等.(当然,若它们的内存地址相等,值一定相等);

  1. public class Test2 {
  2.   public static void main(String[] args) {
  3.      String str1 = "apple";   ⁄*先查看字符串池里有没有这个值,若没有,则开辟一个空间用来存放这个值*/
  4.      String str2 = "apple";   ⁄*先查看字符串池里有没有这个值,若有,则str2指向这个内存地址*/
  5.      System.out.println("str1==str2:"+(str1==str2));  ⁄*因为str1与str2的内存地址一样,所以"=="的结果为true*/
  6.      System.out.println("str1 equals str2:"+str1.equals(str2));

  7.      String str3 = new String("banana");
  8.      String str4 = new String("banana"); ⁄*分别创建了两个不同的字符串对象,str3和str4*/
  9.      System.out.println("str3为"+str3+"\nstr4为"+str4);
  10.      System.out.println("str3==str4:"+(str3==str4));
  11.      System.out.println("str3 equals str4:"+(str3.equals(str4)));
  12.    ⁄*str3和str4分别代表两个不同的内存地址,所以"=="的结果为false*/
  13.    ⁄*这时应该看得出String类型的两种创建对象的方法之间的区别了吧!要注意的是第一种创建对象方法采用的池技术对象的值可以重复利用*/

  14.     int i1 = 10;
  15.     int i2 = 10;
  16.     System.out.println("i1==i2:"+(i1==i2));
  17.     ⁄*为什么结果为true?本人的理解是:int只是一个基本数据类型,不是一个封装类型.而它的封装类型Integer则符合上面的原理请看下面代码*/

  18.     Integer integer1 = new Integer(10);
  19.     Integer integer2 = new Integer(10);
  20.     System.out.println("integer1==integer2:"+(integer1==integer2));
  21.     System.out.println("integet1 equals integer2:"+integer1.equals(integer2));

  22.     Object obj1 = new Object();
  23.     Object obj2 = obj1;
  24.     System.out.println("obj1==obj2:"+(obj1==obj2));
  25.     //对象obj1和obj2都指向同一个内存地址.
  26.   }
复制代码
运行结果:




评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!

查看全部评分

回复 使用道具 举报
"=="比"equal"运行速度快,因为"=="只是比较引用.
详述:
①==和equals的实质。
在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。
基本数据类型在"栈"中存的是其内容值,而对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。
java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。
其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。
总之,"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.
②==操作符。专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相当,只能用==操作符。
Java的基本数据类型为(char,byte,short,int,long,float,double,boolean)。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(对内存),变量本身也占用一块内存,例如Object obj = new Object()变量obj是一个内存,new Object()是一个内存,此时,变量所对应的内存中存储的数据就是对象占用的那块内存的首地址。对于指向对象内存的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
③构造器形成的差别。对于String和Integer来说,由于他们特有的创建对象的方式。使用构造器和不使用构造器得到一个对象,==方法比较所产生的结果是不同的。 String a = “abc”; String b = "abc"; 此时a==b得到结果为true。String a = new String("abc"); String b = new String("abc");此时a==b得到的结果为false。Integer a = 1; Integer b = 1;此时a==b的结果是true。Integer a = new Integer(1); Integer b = new Integer(1);此时a==b得到的结果为false。
通过这一点其实我们也能够更加容易理解==对内存的实际操作,实际执行的是近似于基本类型比较。
String对象和字符串连接池:
引号内包含文本是String类特有创建对象的方式.但是"=="返回的结果是true,为什么呢?因为在JVM内,存在字符串池,其中保存着很多 String对象,并且可以被共享使用,因此它提高了效率.字符串池由String类维护,我们可以调用intern()方法来访问字符串池。当运用引号内包含文本创建对象时,所创建的对象是加入到字符串池里面的.如果要创建下一个字符串对象,JVM首先会到字符串池中寻找,是否存在对应的字符串对象,如果存在,则返回一个己存在对象的对象的引用给要创建的对象引用.如果不存在,才会创建一个新的对象,并返回一个新对象的对象引用给要创建的对象引用.以上这段话理解起来可能比较拗口.用代码理解就是str2和str1是两个对象引用,并指向了同一个对象.所以'=='返回的是true.
只有引号内包含文本创建对象才会将创建的对象放入到字符串池。String str = new String("abc")这种方法创建的字符串对象是不放入到字符串池的。所以,引号内包含文本创建对象的性能要比后来那种方法创建字符串对象的性能要好。
String str1 = "abc";
String str2 = "abc";
String str3 = str1+str2; //这种创建方式是不放入字符串池的.
String str4 = str1+"cd"; //这种创建方式是不放入字符串池的.
String str5 = "ab"+str2; //这种创建方式是不放入字符串池的.
String str6 = "ab"+"cd"; //这种创建方式是放入字符串池的.这种情况实际上是创建了1个对象,abcd"1个对象
String str7 = "abcd";
System.out.println(str1==str2); //返回ture
System.out.println(str6==str7); //返回ture
另一个问题:
我们首先来看一段 Java代码:
String str=new String("abc");
紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器:
public String(String original) {
//other code ...
}
大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:
我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。
使用new创建对象是调用Class类的newInstance方法,利用反射机制创建对象。
④equals方法。用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,他们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b即返回false,而这两个对象中内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否相等,许多人稍不注意就使用==进行比较了,这是错误的,有大量这样的错误。记住,字符串的比较基本都是使用equals方法。
⑤如果一个类没有定义equals方法。它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是比较两个变量指向的对象是否是同一个对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可以认为两个对象的内容是相同的。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
“==”和“!=”比较的就是对象的引用,而equals的比较就要看具体的情况,例如:在String中比较的就是两个String对象的值是否相同,所以当要用equals的时候需要查看API文档
回复 使用道具 举报
小小6456 来自手机 初级黑马 2014-5-18 09:28:46
13#
路过路过。。。。。
回复 使用道具 举报
当用来比较基本数据类型是,==和equals是一样的,当用来比较引用数据类型是,就不同了,==比较的是两个对象的地址,equals比较的是两个对象的内容
回复 使用道具 举报
张百振 发表于 2014-5-15 01:08
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

太详细了!
回复 使用道具 举报
==比较的是两个对象的地址,equals比较的是两个对象的内容
回复 使用道具 举报
pray 发表于 2014-5-15 01:03
用equals方法来比较对象是否相等的。于是继续找到equals的源代码,如下:
  public boolean equals(Objec ...

分析的很好,长见识了。
回复 使用道具 举报
“==”与equal的区别:
    1、“==”是一个关系运算符,而equal是java.lang.Object类的方法;
    2、对于定义的常量,只能使用“==”来进行判断,判断的是两常量的值是否相同;
    3、当对字符串变量进行判断的时候,含义不同:
         1):使用“==”时,是比较两个变量本身的值,即两个对象在内存中的首地址。
         2):使用equal时,比较字符串中所包含的内容是否相同;
              例:
  1. public static void main(String[] args) {

  2.                 int i = 3;
  3.                 int j = 3;
  4.                
  5.                 System.out.println(i==j);
  6.                
  7.                 String s = new String("abc");
  8.                 String q = new String("abc");
  9.                 System.out.println(s==q);//s和q分别对应两个String对象,两个对象在内存中存储的收地址不同,所以返回的记过是false;
  10.                 System.out.println(s.equals(q));//equal比较的是两个对象中所包含的内容是否相同,返回的是true;
  11.         }
复制代码

    4、对于非字符串的变量来说,“==”和equal的作用相同,都是比较对象的内存地址,也就是用来判断两个引用变量是否指向的是同一个对象;
回复 使用道具 举报
张百振 发表于 2014-5-15 01:08
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚) ...

很详细,学习了
回复 使用道具 举报
看过一次视频还没复习 不知道说的 有错没
好像是String改写了equal吧
用白话说就是 在不改写的情况下 equal就是判断两边的对象是不是同一个对象
"==" 通常是当两边变量指向同一个对象时返回真
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马