你錯(cuò)了,是 1234 為什么呢?原因如下:
<!--
對(duì)象:一個(gè)對(duì)象可以被很多引用關(guān)聯(lián)
引用:一個(gè)引用只能關(guān)聯(lián)一個(gè)對(duì)象

Ojbect xiaoyi1; Ojbect xiaoyi1; Ojbect xiaoyi1; 這里創(chuàng)建了三個(gè)引用 并沒(méi)有創(chuàng)建對(duì)象

xiaoyi xy = new xiaoyi();

xy是一個(gè)引用, new xiaoyi()這個(gè)在內(nèi)存中創(chuàng)建了一個(gè)對(duì)象,這個(gè)對(duì)象被 xy這個(gè)引用所關(guān)聯(lián)
引用就好比一個(gè)句柄對(duì)象,通過(guò)xy這個(gè)引用(句柄對(duì)象) 可以操作 new xiaoyi()對(duì)象
引用也是一個(gè)值,只不過(guò)他的值記錄了其關(guān)聯(lián)對(duì)象的地址信息而已。
public void test(String s1){
只要是參數(shù)在方法內(nèi)使用時(shí),都會(huì)產(chǎn)生參數(shù)的副本的,記住這一點(diǎn),無(wú)論java,C#,C,C++。
1>String temp = s1;
這里s1只是一個(gè)引用的副本,是實(shí)際S1引用的一副本,好比你main方法內(nèi)str實(shí)際引用的副本
2>s1="welcome";
在這里進(jìn)行交換的時(shí)候你交換的僅僅是副本而已,雖然S1和main方法的str指向同一個(gè)對(duì)象,但是你交換的是main方法str引用的副本而已

另外:String str="XIAOYI";
str.toLowerCase() ;
System.out.println(str);
結(jié)果是什么?xiaoyi? 那么你又錯(cuò)了。。
因?yàn)樵谀阏{(diào)用toLowerCase()方法是會(huì)新開(kāi)辟內(nèi)存來(lái)保存轉(zhuǎn)換完成的對(duì)象,而你并沒(méi)有把原來(lái)對(duì)象的引用重新關(guān)聯(lián)被轉(zhuǎn)換后的對(duì)象,所以輸出的仍然是轉(zhuǎn)換前的對(duì)象 XIAOYI,要想改變結(jié)果怎么辦?
重新關(guān)聯(lián):str=str.toLowerCase(); 這樣就可以了
-->
關(guān)于 Java字符串池(String pool)
public class Sub{
String str=new String( "good "); //一個(gè)地址的傳遞,new出來(lái)的對(duì)象,在內(nèi)存中已經(jīng)開(kāi)辟了空間
public static void main(String args[]){
Sub ex=new Sub();
ex.change(ex.str);
System.out.println(ex.str);
}
public void change(String bb){
bb= "test ok " }
問(wèn)題:String str=new String( "good ") 和String str="good"的區(qū)別?
體會(huì)1:str是一個(gè)String類(lèi)型的對(duì)象引用,他是Sub類(lèi)的類(lèi)變量。當(dāng)ex對(duì)象引用使用change方法時(shí)。bb是str引用的拷貝??梢酝ㄟ^(guò)bb訪問(wèn)原str的對(duì)象。而方法里當(dāng)bb="test ok"的時(shí)候他把bb指向了一個(gè)新的對(duì)象中。這時(shí)候我們就要引出java字符串的概念了。
體會(huì)2:字符串池(轉(zhuǎn))String a = "Hello";
String b = "Hello";
String c = new String("Hello");
String d = new String("Hello");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));
結(jié)果是true,false,false,true,true,true。這里就涉及到字符串池。“字符串池”,是Java為了提高內(nèi)存利用率而采用的措施:
當(dāng)遇到String a = "Hello"; 這樣的語(yǔ)句時(shí),Java會(huì)先在字符串池中尋找是否已經(jīng)存在"Hello"這個(gè)字符串,如果沒(méi)有,則建立字符串"Hello"對(duì)象,然后變量 a 指向這個(gè)地址;然后遇到語(yǔ)句String b = "Hello",這時(shí)字符串池中已經(jīng)有 "Hello"了,所以直接讓變量b也指向這個(gè)地址,省去了重新分配的麻煩。而在Java中,操作符“==”對(duì)于兩個(gè)基本型來(lái)說(shuō),是判斷其內(nèi)容是否相同,對(duì)于兩個(gè)對(duì)象來(lái)說(shuō),則是判斷其地址是否相同,所以a == b返回 true。
那么String c = new String("Hello")又如何處理呢?如果是這種寫(xiě)法,則不會(huì)去訪問(wèn)字符串池,而是先為變量 c 開(kāi)辟空間,然后將值寫(xiě)入空間。所以a == c返回false,c == d同樣返回false。
至于String的equals方法,因?yàn)樗容^的不是對(duì)象的地址,而是對(duì)象的值,所以都返回true就不奇怪了。
Java虛擬機(jī)有一個(gè)字符串池,保存著幾乎所有的字符串對(duì)象。字符串表達(dá)式總是指向字符串池中的一個(gè)對(duì)象。使用new操作創(chuàng)建的字符串對(duì)象不指向字符串池中的對(duì)象但是可以使用intern方法使其指向字符串池中的對(duì)象.(注:如果池中已經(jīng)有相同的字符串--使用equals方法確定,則直接返回池中的字符串,否則先將字符串添加到池中,再返回)。池中兩個(gè)相等的字符串如果使用“==”來(lái)比較將返回真。
總結(jié):也就是在change這個(gè)方法中,bb已經(jīng)寫(xiě)入str空間。而bb在等于“test ok”的時(shí)候是運(yùn)用字符串池創(chuàng)建了對(duì)象中了。所以不能賦值??梢赃@樣 bb="test ok"; this.str=bb;
理解有錯(cuò)誤,希望看到的高手可以告訴我,以便我可以更好的修改,謝謝了。