"==" 比较的是字符串的引用地址 由于字符串的类型是final,是常量,要改变其内容就是重新new一个新的字符串出来,将指针指向新的内容(1): String str1="Welcome to java"; //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to"; //"Welcome to"在栈中创建,没对str2在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to"String str3=str2+" java"; //重载操作符"+",在堆中重新分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它由于其中一个是new操作来的,一个栈变量,一个堆变量,不同的内存空间,所以不同(2): String str1=new String("Welcome to java"); //在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它String str2=new String("Welcome to java"); //在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它两个都是new操作来的,在堆中分配了不同的内存空间,都是堆变量,内容相同堆中地址不同,所以不同(3): String str1="Welcome to java"; //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to java"; //"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"因为没在堆中分配内存空间,两者只是建立一个句柄(指针)指向栈中内容"Welcome to java",所以两个相同(1)中的str1 和(3)中的str1 比较也应该相等.
{
public static void main(String args[])
{
String str1,str2,str3;
str1="Welcome to java";//常量池的一个常量,赋个一内存地址
str2="Welcome to";//分配了另一个地址
str3=str2+" java";//指向一个新地址,储存字符操作的变化量
if(str1==str3)
System.out.println("yes");
else
System.out.println("no");
}
}
輸出結果爲NO.
String str1=new String("Welcome to java");
String str2=new String("Welcome to java");
if(str1==str2)//两个对象比较明显不一样
System.out.println("yes");
else
System.out.println("no");
輸出結果爲NO. String str1="Welcome to java";
String str2="Welcome to java";
if(str1==str2)//在常量池里面的同一个常量比较一样,都是指向一个常量
System.out.println("yes");
else
System.out.println("no");
輸出結果爲YES.
請問這三個例子有什麽不同.
2.str3=str2+" java";是引用地址。常量一样,指向相同地址。你要了解,有空了解一下常量池对你有帮助。如果要比较字符串就用equal,JAVA比较时,类型一定要相同。左右对称的说法。
由于字符串的类型是final,是常量,要改变其内容就是重新new一个新的字符串出来,将指针指向新的内容(1):
String str1="Welcome to java";
//"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to";
//"Welcome to"在栈中创建,没对str2在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to"String str3=str2+" java";
//重载操作符"+",在堆中重新分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它由于其中一个是new操作来的,一个栈变量,一个堆变量,不同的内存空间,所以不同(2):
String str1=new String("Welcome to java");
//在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它String str2=new String("Welcome to java");
//在堆中分配空间,复制栈中"Welcome to java"内容到堆,并将指针指向它两个都是new操作来的,在堆中分配了不同的内存空间,都是堆变量,内容相同堆中地址不同,所以不同(3):
String str1="Welcome to java";
//"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"String str2="Welcome to java";
//"Welcome to java"在栈中创建,没对str1在堆中分配内存空间,只是建立一个指针指向栈中"Welcome to java"因为没在堆中分配内存空间,两者只是建立一个句柄(指针)指向栈中内容"Welcome to java",所以两个相同(1)中的str1 和(3)中的str1 比较也应该相等.