关于这个问题,前一篇博文《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 stub
String 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也是一样的,但是他们的地址却不一样,不这道这是为什么?
/**
*站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!
*/