java谜题之==和equals()

来源:互联网 发布:小米平板下载软件 编辑:程序博客网 时间:2024/05/02 21:43

关于这个问题,前一篇博文《java谜题之等或不等》只涉及了Integer中的==问题,在ITEye和CSDN的论坛上看到两篇对于这个问题的解释,贴出相关链接,以备分享学习交流之用。

《java中==与equal的区别》,Author:xiashengchao

《java中的数据比较(再谈==与equal的区别)》,Author:darxin

 

文章中提到了关于内存的一些概念可以参看博客中的另一篇博文《java内存管理_堆和栈_内存泄露与检测》中列出的第一篇。

 

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

   ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

   equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

   ==比较的是2个对象的地址,而equals比较的是2个对象的内容。

   显然,当equals为true时,==不一定为true。

 

变量的值只能通过赋值表达式来改变;对象的内容只能通过自身的方法或属性来改变;

==只针对变量的值;equals只针对对象的内容;

引用类型的变量值是所指对象的内存地址;

值传递的本质是变量值的复制而不是对象内容的复制。


下面的代码是关于这个问题的演示

/** * Function:Test String Pool;== , equals() and equalsIgnoreCase(); * Author:BonJean * Date:20140828 */package array;public class CopyOfDemo_String {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString str01="hi, world!";String str02="hi, world!";String str03="HI, WORLD!";if (str01==str02) {System.out.println("OK01");}if (str01==str03) {System.out.println("OK02");}if (str01.equals(str02)) {System.out.println("OK03");}if (str01.equals(str03)) {System.out.println("OK04");}if (str01.equalsIgnoreCase(str03)) {System.out.println("OK05");}String str04=new String("hi, world!");String str05=new String("hi, world!");String str06=new String("HI, WORLD!");if (str04.equals(str05)) {System.out.println("OK06");}if (str04==str05) {System.out.println("OK06+");}if (str04.equals(str06)) {System.out.println("OK07");}if (str04.equalsIgnoreCase(str06)) {System.out.println("OK08");}if (str01==str04) {System.out.println("OK09");}if (str01.equals(str05)) {System.out.println("OK10");}String str07="hi, world! java!";String str08=new String("hi, world! java!");str01="hi, world! java!";if (str01==str02) {System.out.println("OK11");}if (str01==str07) {System.out.println("OK12");}if (str01==str08) {System.out.println("OK13");}if (str01.equals(str07)) {System.out.println("OK14");}if (str01.equals(str08)) {System.out.println("OK15");}str02=str02+" java!";if (str01==str02) {System.out.println("OK16");}if (str02==str07) {System.out.println("Ok17");}if (str02==str08) {System.out.println("OK18");}if (str01.equals(str02)) {System.out.println("OK19");}if (str02.equals(str07)) {System.out.println("OK20");}if (str02.equals(str08)) {System.out.println("OK21");}}}

运行结果

OK01
OK03
OK05
OK06
OK08
OK10
OK12
OK14
OK15
OK19
OK20
OK21

        java中的变量由JVM管理,可以获取其HashCode表示变量的位置,但就算HashCode的值相等也不意味着变量的位置就相等,因为在这个位置上可能管理了多个变量??不知道是不是可以这样理解?
       在创建String时,若直接赋值给变量,则将变量名放入String Pool,在堆去查找是否有与所赋值相同的Sting值。若有,则该变量指向改值,若没有,则重新分配内存。当该变量被重新赋值时,按同样的规则进行,在变量的基础上修改值,该变量的地址也会发生变化,但该地址与直接赋值修改的情况又不同(?)。==比较变量的地址,而equals()比较变量的内容。

       在上面的程序段中str01和str02经过修改后值是一样的,且HashCode也是一样的,但是他们的地址却不一样,不这道这是为什么?


/**
 *站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
 */

0 0