黑马程序员技术交流社区

标题: java中的==到底比较的是什么 [打印本页]

作者: ko889910    时间: 2015-3-9 08:59
标题: java中的==到底比较的是什么
以前对==的理解是比较两个对象的地址,在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却相同,那么==到底比较的是什么呢?求解答啊


作者: 付江涛    时间: 2015-3-9 09:49
首先要明白
==比较的是地址引用一致
equals是对象自己的内部等于条件一致,一般与地址引用无关。

然后你的str1 == str2  是对象和内容进行比较,肯定是false
作者: 杨强彪    时间: 2015-3-9 09:58

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

equals在默认的情况下  比较的也是对象的地址  只有你的子类重写了equals方法   系统才会按照子类的equals定义比较对象
那为什么String对象equals也可以比较值呢?  原因是String对象已经重写了equals方法
作者: xxzlhx    时间: 2015-3-9 10:02
java中==:是比较它们的内存空间是不是相同的
作者: 一般现在时    时间: 2015-3-9 10:41
  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不是字面量定义的,所以是独立对象。
作者: ko889910    时间: 2015-3-9 10:43
付江涛 发表于 2015-3-9 09:49
首先要明白
==比较的是地址引用一致
equals是对象自己的内部等于条件一致,一般与地址引用无关。

地址引用和hashcode有什么关系吗,为什么str1,str2,str3,str4hashcode都相同,==的结果却不同
作者: 付江涛    时间: 2015-3-9 10:52
字符串的hash值是根据字符串的值计算的,相同值的字符串对象hash值一定相同,具体的计算方法在jdk的文档中有描述:



也就是说哈希值是通过哈希算法得来的,而地址值是通过是和物理层面有关,是系统分配的





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2