java谜题之==和equals()
来源:互联网 发布:小米平板下载软件 编辑:程序博客网 时间:2024/05/02 21:43
关于这个问题,前一篇博文《java谜题之等或不等》只涉及了Integer中的==问题,在ITEye和CSDN的论坛上看到两篇对于这个问题的解释,贴出相关链接,以备分享学习交流之用。
《java中==与equal的区别》,Author:xiashengchao
《java中的数据比较(再谈==与equal的区别)》,Author:darxin
文章中提到了关于内存的一些概念可以参看博客中的另一篇博文《java内存管理_堆和栈_内存泄露与检测》中列出的第一篇。
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
变量的值只能通过赋值表达式来改变;对象的内容只能通过自身的方法或属性来改变;
==只针对变量的值;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也是一样的,但是他们的地址却不一样,不这道这是为什么?
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
*/
- java谜题之==和equals()
- Java之equals和==详解
- JAVA之"equals"和"=="
- Java: equals 和 ==
- java equals和==
- java == 和equals
- Java == 和 equals()
- Java--equals 和 ==
- java == 和Equals()
- java equals 和 ==
- java ==和equals
- Java ==和equals
- java == 和equals
- Java对象之间的比较之equals和==
- Java之equals和==的区别
- java之"equals"和"=="的区别
- Java面试题之==和equals的区别
- java基础之“==” 和equals()方法的区别
- java内存管理_堆和栈_内存泄露…
- java学习_04.1_参数传递
- 类分解器JavaP--分析Java字节…
- java谜题之等或不等
- get trace name
- java谜题之==和equals()
- mini2440裸机之Touchpanel
- java实现快速排序法_常见内存异常…
- hdu 1020 Encoding
- [题解][LeetCode][Combinations]
- Change Internet Proxy settings
- centos6.3启动的相关知识
- mini2440裸机篇之RTC
- Java Thread&Concurrency(15): 深入理解ScheduledThreadPoolExecutor及其实现原理