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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ko889910 中级黑马   /  2015-3-9 08:59  /  1046 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以前对==的理解是比较两个对象的地址,在java中就是比较hashcode,但以下代码改变了我的想法
  1. package com.sun.question;

  2. public class StringDemo {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub4
  5.                 String str1=new String("abc");
  6.                 String str2=str1.intern();//返回的是常量池中的abc
  7.                 String str3=new String("abc");
  8.                 String str4=str3.intern();//返回的仍旧是常量池中的abc
  9.                 System.out.println(str2);
  10.                 System.out.println(str1==str2);//false
  11.                 System.out.println(str2==str4);//true
  12.                 System.out.println(str1.hashCode());
  13.                 System.out.println(str2.hashCode());
  14. System.out.println(str2.hashCode());
  15.                 System.out.println(str4.hashCode());//str1,str2,str3,str4,hashcode都相同
  16.                

  17.         }

  18. }
复制代码

str2!=str1 但是他们的hashcode却相同,那么==到底比较的是什么呢?求解答啊

7 个回复

倒序浏览
付江涛 来自手机 金牌黑马 2015-3-9 09:49:24
沙发
首先要明白
==比较的是地址引用一致
equals是对象自己的内部等于条件一致,一般与地址引用无关。

然后你的str1 == str2  是对象和内容进行比较,肯定是false

点评

str2也是一个对象  发表于 2015-3-9 10:29
回复 使用道具 举报

只要是对象类型  那么“==”比的都是地址!
只有基本类型  比如说是int float比较的才是值。

equals在默认的情况下  比较的也是对象的地址  只有你的子类重写了equals方法   系统才会按照子类的equals定义比较对象
那为什么String对象equals也可以比较值呢?  原因是String对象已经重写了equals方法
回复 使用道具 举报
java中==:是比较它们的内存空间是不是相同的
回复 使用道具 举报
  1. String a = new String("abc");
  2. String b = new String("abc");
复制代码

a和b是两个独立的对象,它们有各自的存储。所以不相同。但如果
  1. String a = new String("abc").intern();
  2. String b = new String("abc").intern();
复制代码
现在a和b其实是一个对象,a == b。它们只是同一个对象的两个名字。在debug时,可以看到他们的id是一样的。这样跟
  1. String a = new String("abc");
  2. String b = a;
复制代码

效果是一样的
原理是这样的
  1. String a = new String("abc");
  2. String b = "abc";//等于String b="abc".intern();
  3. String c = "abc";//等于String c="abc".intern();
复制代码

对于字面量定义的b和c都会自动调用intern,(等用于String b = "abc".intern())。所以此时b和c是指向同一个对象。但a不是字面量定义的,所以是独立对象。
回复 使用道具 举报
付江涛 发表于 2015-3-9 09:49
首先要明白
==比较的是地址引用一致
equals是对象自己的内部等于条件一致,一般与地址引用无关。

地址引用和hashcode有什么关系吗,为什么str1,str2,str3,str4hashcode都相同,==的结果却不同
回复 使用道具 举报
字符串的hash值是根据字符串的值计算的,相同值的字符串对象hash值一定相同,具体的计算方法在jdk的文档中有描述:



也就是说哈希值是通过哈希算法得来的,而地址值是通过是和物理层面有关,是系统分配的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马