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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 武超 黑马帝   /  2011-12-3 15:26  /  3407 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 武超 于 2011-12-4 20:18 编辑

equals:是比较内存地址值,还是比较内存地址值所指向的内存中的内容啊?还要==呢?它是比较哪个的呢?

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

13 个回复

倒序浏览
equals是比较内存地址的 值 就是 0x3242 这种
== 是逻辑运算符  比较的应该是数据在电脑中的二进制数据吧
我是这么理解的
回复 使用道具 举报
从理论上来说,equal是比较内存中真正存放的数据,==是比较内存地址是否一致。
但是要知道equal方法时object对象中的方法,也就是说每个类在创建之后默认都是直接继承了object对象中的equal方法,而object类中equal方法的实现却是直接比较两个对象的内存地址,也就是简单的“==”一下,所以除非你重写你所创建类的equal方法,否则这个类即使调用equal方法也只会简单的比较内存地址是否一致,这点要注意了

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
杨强 发表于 2011-12-3 15:32
equals是比较内存地址的 值 就是 0x3242 这种
== 是逻辑运算符  比较的应该是数据在电脑中的二进制数据吧
...

刚又看了下 equals 比较的是地址值储存的内容
回复 使用道具 举报
我就知道equals比较是的地址值的内容,比较地址值的是compare.
==我感觉的就是比较具体数值是否相等。
回复 使用道具 举报
equals方法是字符串String的一个方法,只有字符串能用。int型的比较方法是"==",而不是equals。
回复 使用道具 举报
韩军博 黑马帝 2011-12-3 16:26:32
7#
==是比较引用是否相等,即引用的是否是同一个实例对象。
equals是比较实例对象的值是否相等。


回复 使用道具 举报
段波 黑马帝 2011-12-3 18:11:56
8#
==运算符可以用于基本数据的变量比较,也可以用于对象的比较,不过比较的是两个变量的值是否相等,equals()用于比较两个对象的内容是否一致。
         public class EqualsDemo {
        public static void main(String[] args) {
        String str1= new String("abc");
        String str2= new String("bc");
        String str3=str1;
        if(str1==str2){
                System.out.println("str1==str2");
        }else {
                        System.out.println("str1!=str2");
                }
        
               
        if(str1==str3){
                System.out.println("str1==str3");
                }
        else{
                System.out.println("str1!=str3");
        }

}
        }
运行结果是:str1!=str2
                  str1==str3
                                str1 str2 str3都是变量存在于栈内存中,对象存在堆内存中
                str1指向堆内存中的一个由参数abc构建的对象
                str2指向堆内存中的一个由参数bc构建的对象,这两个对象是不一样的
                str3和str1的值相同,当然也就和str1所指向的对象相同

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
许邦存 来自手机 黑马帝 2011-12-3 19:07:08
9#
equal比较的是对象的是否一样,继承的是object的equal的方法,比较的话如果地址一样就会返回true.一般都会覆写equal方法,比如你说两个人是否一样,可以覆写equal方法,比如你可以说名字一样就一样,或者身高一样就一样,这都看你自己决定。除了字符串和基本包装类外吧,都有对应的equal,一般类都要覆写吧。==就是逻辑运算符,是直接判定具体内容是否一样而没有覆写的吧。

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王德云 于 2011-12-3 19:24 编辑

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

     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
(以上借鉴张老师原创java就业面试宝典上解答,个人认为还是非常不错的。)

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

回复 使用道具 举报
首先,==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
然后,equals方法是用于比较两个独立对象的内容是否相同。
切记,字符串的比较基本上都是使用equals方法。
另外,如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法
回复 使用道具 举报
== 比较的是内存地址 equals 在object类中和 == 相同 但是String中就是不同了 用来比较String对象中的内容 因为String重写了equals方法所以才不同的 只有重写equals方法才会发生改变。一般会同时重写hashcode方法~
回复 使用道具 举报
fly51888 黑马帝 2011-12-4 11:52:55
13#
==是用来比较内存地址的,而equals是用来比较值的。但也有一些例外需要注意一下:在Object类中其中的equals方法的源代码也是用==来判断的,即是根据内存地址。
1,如果是比较基本数据类型(int,long,char,boolean,double,float,short,byte)用==是比较内存地址,因为基本数据类型用的是享元模式,且没有equals方法。
2,如果是比较基本数据类型对象(Integer,Long,Character,Boolean,Double,Float,Short,Byte)用==比较的是内存地址,用equals比较的是值,因为基本数据类型对象重写了Object中的equals()方法,此时的equals()是根据值而不是根据内存地址。
3,String类比较:如下
String str1 = "123";
String str2 = "123";
String str3 = new String("123");
               
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));

输出结果是:
true
true
false
true
上例中两个“123”的内存地址是一样的,而new String("123");地址跟前两个是不一样的,但值是一样的。
可以看出==是根据内存地址比较的,而equals()是根据值比较的,因为String类已经重写了Object中的equals方法。
4,自己写的类进行比较:
如果想通过值比较自己写的类,那么这个类必须重写equals()方法,不然的话,在比较的时候,该类会调用Object类的中equals方法,而Object 中equals方法是按内存地址比较的。
回复 使用道具 举报
小小无语一下啊。。。这个问题,回答了差不多3次了。。。。。可以先在版块内容上搜一下问题,是搜不到的问题的话再问不迟啊。

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
admin + 1 + 5 这位同学说得很有道理!很频繁的提问,将不.

查看全部评分

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