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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王瑞 中级黑马   /  2013-3-26 18:11  /  1693 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王瑞 于 2013-3-26 20:36 编辑

正在学习集合框架,遇到这三个关键字了,哪个高手帮忙指点一下,具体怎么使用?分别有什么区别?
equals == 和instanceof。谢谢!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

正序浏览
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
回复 使用道具 举报
yufeng47 发表于 2013-3-26 18:28
==判断的是两个变量或实例是否是指向同一个内存地址;
equals是判断两个变量或实例所指向的内存空间的值是 ...

这哥们的头像太喜感了。。。。。。
回复 使用道具 举报
谢谢楼上各位,了解了~~~~~~
回复 使用道具 举报
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

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

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

比如:

String s1,s2,s3 = "abc", s4 ="abc" ;

s1 = new String("abc");

s2 = new String("abc");

那么:

s1==s2   是 false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,

故不相等。



s1.equals(s2) 是 true    //两个变量的所包含的内容是abc,故相等。



注意(1):

如果:        StringBuffer s1 = new StringBuffer("a");
                 StringBuffer s2 = new StringBuffer("a");
                       

结果:      s1.equals(s2)  //是false

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类, 而Object类中的equals方法是用来比较“地址”的,所以等于false.

注意(2):

对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符

串常量所生成的变量,其中所存放的内存地址是相等的,

所以s3==s4是true(即使没有s3=s4这样一个赋值语句)


(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其

对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

class A

{

      A obj1   =   new  A();

      A obj2   =   new  A();

}

那么:obj1==obj2是false

            obj1.equals(obj2)是false



但是如加上这样一句:obj1=obj2;

那么  obj1==obj2  是true

          obj1.equals(obj2) 是true



总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较

其指向的对象是否相同的。

             == 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

  



String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。



顺便总结下equals方法和instanceof 的区别:

instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例
对于引用类型变量,Java 编译器只根据变量被先生声明的类去编译。
   instanceof 左边操作元被显式声明的类型与右边操作元必须是同种类或者有继承关系,即位于继承树的同一个继承分支上,否则编译出错
Object 类的 equals() 方法的比较规则为:当参数 obj 引用的对象与当前对象为同一个对象时,就返回true,否则返回false
在JDK中有一些类覆盖了 Object 类的equals()方法,它们的比较规则为:
  如果两个对象的类型一致,并且内容一致,则返回true。
这些类包括:java.io.File、java.util.Date、java.lang.String、包装类(如java.lang.Integer和java.lang.Double类)。
如果是自己定义的类的话,可以复写equals()方法,自己定义比较规则

Java语言对equals()的要求如下,这些要求是必须遵循的,以下几点也算是和instance of 的区别:
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。



点评

哥们,虽然你这个没加分,但是真全面啊,赞一个  发表于 2013-3-26 20:44

评分

参与人数 1黑马币 +15 收起 理由
王瑞 + 15

查看全部评分

回复 使用道具 举报
等号判断变量或实例的内存空间的地址是否相同;
equals确定变量或实例指定的值是不是相同;
instanc左边的对象是不是右边的类的实例边的类的实例  有代码 自己看
  1. class URShift {
  2.                   public static void main(String[] args) {
  3.                     int i = -1;
  4.                   
  5.                     i = -1;
  6.                     int i1=-1;
  7.                     
  8.                     Integer i3=new Integer(-1);
  9.                     System.out.println(i==i3);
  10.                     System.out.println(i3==(new Integer(i1)));
  11.                     System.out.println(i3.equals(new Integer(i1)));
  12.                     System.out.print(i3 instanceof Integer);
  13.                     
  14.                   }
  15.                 }
复制代码
回复 使用道具 举报
==判断的是两个变量或实例是否是指向同一个内存地址;
equals是判断两个变量或实例所指向的内存空间的值是不是相同;
instanceof是判断两个变量(引用)是否是同一个类类型的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
equals:是用来比较对象是否相等的。是Object的方法,如果你的对象没有重写这个方法,当你调用的时候就会调用Objectr 的 equals方法。
            在Object的equals比较的是地址值。所以我们通常都会在自定义的对象中去重写这个方法,让它实现你想要的比较方式,比如:进行值比较。

== :是一个运算符。用来比较两个对象是否相等。它比较的是地址是否相同。
instanceof:这个方法去来判断你指定的对象是不是某个类的实例。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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