1. 程式人生 > >Java字串常量和static物件的區別

Java字串常量和static物件的區別

java中將記憶體分為四個區:heap、stack、data segment、code segment

字串常量和靜態變數都存於資料區;字串常量存於資料區,如果內容相同,則地址指向相同;靜態變數也存於資料區,如果內容也相同,那麼如何呢?

/*

    2018-1-19 17:51:01

該程式證明了常量與物件的區別


    字串常量  與靜態String new出來的物件內容可能相同   且都存於資料區, 但是地址指向完全不同


    兩個內容相同的字串常量 都存於資料區,但其地址指向相同


    無論在什麼區  new出來的物件  應是先分配記憶體,後進行物件內容的賦值  所以地址指向不同


    字串常量在資料區,會比較內容的異同  故 內容相同的字串常量 地址指向相同


    兩者之間應區分明白
 */
 

class String_static
{
    static String  str1 = new String("abc");

    static String  str4 = new String("abc");


	public static void main(String[] args)
	{
        String  str3 = new String("abc");
        String  str6 = new String("abc");

        String str2 = "abc";
        String str5 = "abc";

        System.out.println(str1.equals(str2) ); // equals方法比較的是指向的物件,也就是其中的內容,與地址無關


        System.out.println(str2 == str5); // str2 和 str5 的物件存於資料區,但由於內容相同,故指向了同一塊記憶體
        System.out.println(str3 == str6); // str3 和 str6 new出來 的物件都存於堆區中,雖然物件內容相同,但在堆中指向並不是一塊記憶體
        System.out.println(str1 == str4);//str1 和 str4 因為是靜態的,雖然也是new出來的,且其物件內容也相同,也都存於資料區,但是地址指向完全不同   與str2 和str5 的情況形成比較;  與str3和str6 雖然不在同一區,但是情況類似


        System.out.println(str1 == str3);//str1 存在於資料區 ,str3 存在於堆區,地址指向完全不同
        System.out.println(str1 == str2);//str1 因為是靜態的 存於資料區   str2是字串常量 也存於資料區  且物件內容等,但地址指向並不相同;與str2 和str5 的情況形成比較;,與str1 和 str4 、str3和str6類似


    }

}