詳細講解Java中的方法參數傳遞機制,介紹string的不可變性

public class Test
{

	public static void main(String[] args)
	{
		String str1 = new String("abc");
		//上面這句話創建了二個對象,一個對象是在字符串池創建的,另外一個對象是在堆裏創建的。
		//如果前面字符串池有字面值爲"abc"的對象,則不會再次創建。
		//String str1這個不是對象,它只是一個對象的引用。
		
		String str2 = "abc";
		//結合上面已經在字符串池已經創建了字面值爲"abc"的對象。則不再繼續創建。所以這句話沒有創建任何對象。
		
		String str3 = new String("abc");
		//上面這句話創建了一個對象。就堆裏的那個對象,字符串池中已經存在了字面值爲"abc"的對象。

		System.out.println(str1 == str2);// flase;
		//一個字符串池中的對象和一個堆裏創建的對象,不相等
		
		System.out.println(str1 == str3);// false
		//二個堆裏創建的對象,不相等
		
		System.out.println(str2 == str3);// false
		
		//String類維護一個初始爲空的字符串的對象池,當intern方法被調用時,
		//如果對象池中已經包含這一個相等的字符串對象則返回對象池中的實例,
		//否則添加字符串到對象池並返回該字符串的引用。
		System.out.println(str1 == str1.intern());// flase;
		//一個堆中對象一個返回池中的對象,二個值不相等
		
		System.out.println(str2 == str2.intern());// true
		//都是返回池中的對象,
		
		System.out.println(str1.intern() == str3.intern());// true
        //都返回字面值爲"abc"的、在字符串池中的該對象值
		
		String str4 = "hello";
		String str5 = "hel";
		String str6 = "lo";
		System.out.println(str4 == "hel" + "lo");// true
		//"hel" + "lo"這裏創建了二個對象。在做完"+"操作後會先判斷字符串池中是否存在""hello"的對象,如果存在則不再創建,否則創建。
		//只有使用引號包含文本的方式創建的String對象之間使用“+”連接產生的新對象纔會被加入字符串池中
		
		System.out.println(str4 == "hel" + str5);// false
		//對於所有包含new方式新建對象(包括null)的“+”連接表達式,它所產生的新對象都不會被加入字符串池中.
		
		System.out.println(str4 == "hel" + str6);// false
	}

}

發佈了33 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章