package com.HelloWorld;
/*
String str1= "hello", String str2="he"+"llo";之所以str1==str2返回true是因為兩者都是在字符串常量池中
(由於初始化就會在此區域分布內存)而常量池中的有個與棧區類似的特性,就是當str2指向的常量在常量區已存在時,
他不會創建新的內存空間來存此常量,而是指向已有常量的內存(應該是以此節約空間),此時str1與str2這兩個引用變
量的值都是存"hello"的內存空間地址,但是String str3= "he"+a;String a="llo";時str1==str3返回的為false,
是因為:str1指向的hello在編譯期一如既往的還是分配在常量區內,a指向的llo也在常量區,雖然str3也是初始化但是
編譯器無法判斷a這貨到底是什么個情況,進而不會將str3的等號右側聲明在常量區內,而是在通過構造時在堆區中的非常
量池外的內存中聲明,至此str3與str1不止是分配內存的時期不同(一個在編譯期,一個在運行期)而且在內存空間的區
域也不同,上面最高票答案只區分了時間沒區分空間。
*/
public class StringOne {
public static void main(String[] args) {
String str1="kobe";
String str7="kobe";//str1與str7同時指向kobe字符串
String str2="bryant";
String str3="kobebryant";
String str4="kobe"+"bryant";
String str5="ko"+"be"+"bryant";
String str6=str1+str2;
System.out.println(str1==str7);//true
System.out.println(str3==str4);//true
System.out.println(str3==str5);//true
System.out.println(str3==str6);//false
System.out.println(str3.equals(str6));//true
String str8;
str8=str7;
str8="ok";//str8重新指向ok字符串
System.out.println(str1);//kobe
}
}