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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhouchao 中级黑马   /  2013-7-24 09:55  /  1410 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhouchao 于 2013-7-24 11:55 编辑

public class Test {
        public static void main(String[] args) {
                String s = new String("ABC");
                System.out.println(s);
                Integer x = new Integer(2);
               
                System.out.println(x.equals(s));
                System.out.println(x == s);
        }

}
System.out.println(x.equals(s));
这句可以运行
System.out.println(x == s);
这句在编译时就无法通过,

这是什么原因?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 董凯 于 2013-7-24 10:34 编辑

eqauls 与 = =之异同

1)比较方式角度:

= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

         2)Object Reference1(对象引用)= = Object Reference2(对象引用)

         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

           这三种比较

           但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。



2)比较目的角度:

1)    如果要比较两个基本类型是否相等,请用= =;

2)    如果要比较两个对象引用是否相等,请用= =;

3)    如果要比较两个对象(逻辑上)是否一致,请用equals;



对两个对象(逻辑上)是否一致的阐释:

   有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是 “+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由  equals()来实现 。   



还有你的这里的
Integer x = new Integer(2);新建对象跟String s=new String("ABC")对象的 类型不兼容!
你把String s=new String("ABC")改成String x=("ABC");就ok了!


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张亚军 于 2013-7-24 10:24 编辑

     ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如
     String s1 = new String("ABC");
     String s2 = new String("ABC");  
        System.out.println(s1.equals(s2));//比较的是实例化的内容即堆内存中的存的对象“ABC”是否相等,结果为true
        System.out.println(s1 == s2); //比较的是首地址的值,存储位置不同,在堆内存中new了两个内存空间,所以结果为false
         一般字符串的比较基本上都是使用equals方法。

     如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
     boolean equals(Object o){
     return this==o;
}
     这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
==判断时两边必须是同种类型的数据或对象,不然会在编译时出错
回复 使用道具 举报
按道理来说,==是比较二者的内存地址的,不同类型应该能比较。但是编译器报错,提示类型不兼容。所以就是个规则了,我想应该是这样,既然二者类型不同了,那对象的地址就不会相同了,所以两边类型必须一致才具有可比性。==和equals不必太过深究,只要会用,记住一个是内存,一个是内容就行了
回复 使用道具 举报
equals比较的是内容,   ,内容不一样,自然就返回假,
==比较的是内存中的地址值  ,.   你拿两个类型的函数 互相比较.  那地址值不是一样不一样的问题了.  是比不了.
就好像是.  猫和猫比 .   狗和狗比 ..      猫比颜色啊 体重啊 什么的.   狗比大小啊. 血统啊 什么的.  
结果 你要用猫和狗比.  那能比吗.. .  要想比也行.   复写==  . 就可以比了 .  

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
= =: 是面向过程的操作符,它是用来比较两个变量的值是否相等,也就是说比较的是内存中的地址值,不属于任何类。
equals: 是面向对象的操作符,它是类中的一个方法,用于比较两个独立对象的内容是否相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马