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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 微凉的暮色 中级黑马   /  2015-6-11 23:51  /  14684 人查看  /  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());
复制代码






最佳答案

查看完整内容

hashcode() 方法,在object类中定义如下: public native int hashCode(); 说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double。。。。等等这些类都是覆盖了hashcode()方法的。例如在String类中定义的hashcode()方法如下: public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; in ...

72 个回复

倒序浏览

居然在最后一页,顶一下,望采纳

本帖最后由 hakey 于 2015-7-4 02:09 编辑

hashcode() 方法,在object类中定义如下:
  public native int hashCode();
说明是一个本地方法,它的实现是根据本地机器相关的。当然我们可以在自己写的类中覆盖hashcode()方法,比如String、Integer、Double。。。。等等这些类都是覆盖了hashcode()方法的。例如在String类中定义的hashcode()方法如下:
    public int hashCode() {
int h = hash;
if (h == 0) {
    int off = offset;
    char val[] = value;
    int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
}
解释一下这个程序(String的API中写到):
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希码为 0。)

3.这里我们首先要明白一个问题:
equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。
反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。解释下第3点的使用范围,我的理解是在object、String等类中都能使用。在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了;在String类中,equals()返回的是两个对象内容的比较,当两个对象内容相等时,
Hashcode()方法根据String类的重写(第2点里面已经分析了)代码的分析,也可知道hashcode()返回结果也会相等。以此类推,可以知道Integer、Double等封装类中经过重写的equals()和hashcode()方法也同样适合于这个原则。当然没有经过重写的类,在继承了object类的equals()和hashcode()方法后,也会遵守这个原则。

在String类中的重写了equals方法,实现的事内容的比较。      每new一个对象,就在对空间中开辟一个新的地址,所以s和s2进行“==”比较得到的是false因为他们指向的地址不同。至于hashcode根据上面的产生方法,因为s和s2的对应的值一样,所以产生的hashcode也是一样的。

楼主想要知道“==”两边比较的是什么如果是两个对象那就是两个对象的地址,此时s==s2为false。

如果是基本数据类型例如: String s="黑马"; String s2="黑马";s,s2为字符串常量,存放在java虚拟机为它分配的内存在常量池中。如果常量池中存在“黑马“,s,s2就会指向其内存地址。如果不存在Java虚拟机会为“黑马”分配一个地址.
所以,s==s2得到的是true。

看了很久,搜了很多东西,不知道能不能解决你的的疑惑,我自己也学到了不少。哈哈  多多交流,欢迎给出意见。
回复 使用道具 举报
新人不太懂这些,看到类似帖子,望采纳:
"=="和equals方法究竟有什么区别?(转)
http://bbs.itheima.com/thread-194145-1-1.html
(出处: 黑马程序员IT技术论坛)
回复 使用道具 举报
VIP1108210117 发表于 2015-6-12 00:02
新人不太懂这些,看到类似帖子,望采纳:
"=="和equals方法究竟有什么区别?(转)
http://bbs.itheima.com/t ...

(⊙o⊙)…这个说的很笼统,没涉及我问的
回复 使用道具 举报
应该是等号比较是的是地址和内容,equals比较的只是内容
回复 使用道具 举报
equals方法没有被重写时,与==作用是一样的,被重写时常用来比较对象内容。
回复 使用道具 举报
另外当equals方法被重写时,通常也会重写hashcode方法
回复 使用道具 举报
海洋你好 发表于 2015-6-12 09:13
应该是等号比较是的是地址和内容,equals比较的只是内容

简单理解可以这么说。不过我想把他的比较内容取出来
回复 使用道具 举报
world.net 发表于 2015-6-12 09:22
equals方法没有被重写时,与==作用是一样的,被重写时常用来比较对象内容。 ...

:lol
我想要知道的是具体的比较内容(⊙o⊙)
==前后是什么?
回复 使用道具 举报
通过getBytes(),转化为二进制,直接输出 结果不同是因为创建了新对象,对象的应用不同。但输出数组内容一样,我想说的是对象的拷贝

评分

参与人数 1黑马币 +1 收起 理由
微凉的暮色 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
回复 使用道具 举报
wx_d9b6mRbI 发表于 2015-6-12 13:33
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们 ...

说的不错,不过不是我要的答案,
:L其实你说的这些,我知道:handshake
回复 使用道具 举报
vilion 发表于 2015-6-12 12:38
通过getBytes(),转化为二进制,直接输出 结果不同是因为创建了新对象,对象的应用不同。但输出数组内容一样 ...

我用String 测试,忽略会改hashcode()了
:lol 帖子没去改
回复 使用道具 举报
libin159 发表于 2015-6-12 18:40
==操作运算符是用来比较两个变量的值是否相等的,也是用来比较存储内存中储存的数值是否相同,比较两个基本 ...

:o这不会是复制的吧,看着好熟悉
其实我想输出==两边比较的东西
回复 使用道具 举报
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。       如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
回复 使用道具 举报
围观大牛解答
回复 使用道具 举报
什么意思,是想输出当他们作比较的时候,他们是以怎样的形式做比较的吗
回复 使用道具 举报
再次学习了
回复 使用道具 举报
逝....曾经 发表于 2015-6-12 22:26
什么意思,是想输出当他们作比较的时候,他们是以怎样的形式做比较的吗

差不多,输出的是他们的引用值
回复 使用道具 举报
再来学习了
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 加入黑马