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

© 微凉的暮色 中级黑马   /  2015-6-11 23:51  /  15989 人查看  /  72 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
本帖最后由 微凉的暮色 于 2015-6-12 00:04 编辑

题目:== 跟 equals 比较的具体是是什么?具体用String来解释:
我知道:
equals 比较的是 具体内容,==比较的是内存地址
但只能明白 equals 的比较原理 ,至于==是怎么回事?
0、按通常说的 hashCode() 代表虚拟地址值,两个新对象完全不应该相等,但实际输出的值一样 ?
忽略了String 覆写hashCode();方法了。。。。。。。。。
1、通过getBytes(),转化为二进制,直接输出 结果不同,但输出数组内容确一样?
2、据说 == 比较的是引用值 ?这个值能输出么?有什么方式展现下?
  1.                 String str =new String("XYZ");
  2.                 String s = new String(str);
  3.                 String s2 = new String(str);        
  4.                 System.out.println(s.hashCode());
  5.                 System.out.println(s2.hashCode());
复制代码






72 个回复

正序浏览
视频上的老师是说,==比较的是地址值,就是引用,
在Object以及它的子类上,如果没有覆写equals方法的话,比较的也是引用,
我们可以覆写equals方法,用来比较我们指定的内容。
回复 使用道具 举报
微凉的暮色 发表于 2015-7-6 09:02
可能是我问的 问题不太明确,其实我想的是把 equals两边的东西输出到控制台,不过由于JAVA的特性,这个问 ...

是的,你甚至都得不到,所以不能输出的。恩,好的,你试试吧
回复 使用道具 举报
hakey 发表于 2015-7-3 20:39
hashcode() 方法,在object类中定义如下:
  public native int hashCode();
说明是一个本地方法,它的实 ...

可能是我问的 问题不太明确,其实我想的是把 equals两边的东西输出到控制台,不过由于JAVA的特性,这个问题没法输出
回头 我按照你的试试去
回复 使用道具 举报
比较的就是父类的属性.
回复 使用道具 举报
楼主似乎已经不再关心此问题了哈,希望你可以看看我的,因为确实花了很长时间解决的。
回复 使用道具 举报
==如果比较的是基本类型,那比较的是值是否相等,如果比较的是引用类型,那比较的就是内存地址是否一样
equals是Object根类的一个方法,该方法如果没有被重写,那么比较的就是hashCode()虚拟地址是否相同,比如你自己定义一个学生类,如果你的学生类没有重写equals()方法,那么比较的就是这两个学生对象的地址是否相同,如果你重写了该方法,那就按你重写的规则做比较。String类(继承了Object根类)是重写了equals()方法的,重写后equals()方法是按内容是否相同返回布尔类型值。
回复 使用道具 举报
10楼正解
回复 使用道具 举报
围观下。菜鸟还没学习到这个地方
回复 使用道具 举报
this.name == s.name; //比较2个人的名字是否相等,因为name是String类型,String是一个类,所以这个式子可以写成this.name.toString() == s.name.toString();    toString()是对象后面默认加的的,只是省略不写了,例如System.out.print(s.toString)一般写为System.out.print(s);  然而toString()在String中被重写了,重写之后变成输出String的内容了。其他没有重写的类任然是输出地址值。所以可以在比较内容的时候要用equals。如this.name.equals(s.name)。总结,基本类型数据比较用==,引用类型的比较用equals
回复 使用道具 举报
楼上正解
回复 使用道具 举报
这是put()  方法的源码:
public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

    先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素
Hashcode()  地址代表一个域,与对象是一对多的关系,,,判断hashcode后,再判断内容的方式,以会提高效率。
    具体hashcode()产生方式,可以参考源码。  不过不在object    hashcode() 是native类型,用c/c++写成的  
回复 使用道具 举报
wgy 中级黑马 2015-6-23 07:37:30
60#
我认为应该是比较两个变量的值是否相等,其中包括数值型变量和引用类型变量。:):)
回复 使用道具 举报
我学了半个月的理解就是  ==是用于基本类型的比较 而equals比较的是 引用类型里面的内容。
回复 使用道具 举报
楼主说的这个问题我重点研究过 ==比较的是值是否相等,如果比较的是基本类型,那么就会比较这两个值,比如3==2,返回值是false  如果比较的是引用类型,比如两个学生对象,那么比较的是地址值,这个地址值就是栈内存变量指向堆内存空间的地址值,你可以造一个没有重写toString()方法的对象,用println输出一下对象名来看一下这个地址值。。
equal()是一个方法,它存在于Object这个类中,又因为这个类是所有类的父类,所以所有对象都可以调用这个方法,而且这个方法的参数接受的也是任意类型对象  这个方法在Object中,代码大致是return this==obj,就是默认返回的结果是比较这两个对象的地址值是否相同,如果你想要让这个方法比较的是对象的内容是否相同(比如一个学生类  比较姓名 年龄等等),那你自己就需要重写,根据你的需求来重写具体要比较什么,然后设置返回值是true还是false。。至于怎么重写,你可以用eclipse自动生成开看一下 或者你可以通过API查看String这个类,然后看看它里面的equal方法。。这个方法就是重写后的(java工作人员,封装这个类的时候 重写的)  还有一个需要注意的地方,ArrayList集合中的contains这个方法,底层依赖的是equal方法,如果你集合中的对象中 没有重写equal方法,那么比较是否包含的结果永远都会返回fslse。哥们,纯手打,希望给点分  如果还有不懂的可以加我扣扣  363246266
回复 使用道具 举报
==:是比较它们的内存空间是不是相同的,而

equals:是比较它们的值
回复 使用道具 举报
实际上,“==”,从实现原理上来说,这个比较是计算机认为的相等,而equals()比较的是人认为的相等。
回复 使用道具 举报
最精确的说:“==”比较的是变量值,“equals()”比较的是对象内容。阐述一下,8个基本类型,用==比较不必说,就是比较变量值;对象引用类型,比较时也是比较的引用变量值,何为引用变量呢,这就是实现机制问题了,引用本身也是一个变量,其值就是该对象的存储地址。而equals(),比较的是变量实际表示的值,那么基本类型不必说,对象引用类型实际表示的值是对象内部成员的值,而不是引用变量的值。区别就在这,二者有交叉,有区别。
回复 使用道具 举报
       值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同 。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true时,==不一定为true。
         

回复 使用道具 举报
       值类型是存储在内存中的栈,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
       ==操作比较的是两个变量的值是否相等,
       对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。        
        equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
        ==比较的是2个对象的地址,而equals比较的是2个对象的内容。显然,当equals为true时,==不一定为true。
         

回复 使用道具 举报
本帖最后由 bowen-xiao 于 2015-6-21 08:54 编辑
wx_d9b6mRbI 发表于 2015-6-12 13:33
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们 ...
  1. String s1 = new String("123");
  2.                 String s2 = new String("123");
  3.                
  4.                 System.out.println(s1 == s2);//
复制代码


猜猜什么结果
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 加入黑马