String:字串型別

wah369發表於2020-10-29

String:字串型別。

有多種構造方式,常用的有以下三種:

        //第一種用的最多
        String str1 = "helloworld";
        //第二種
        String str2 = new String("helloworld");
        //第三種
        char[] array = {'h','e','l','l','o'};
        String str3 = new String(array);

“helloword”是儲存在堆中的常量池當中的。並且在常量池中只有一份。

 String原始碼中是被final所修飾的,被final修飾的都不能被繼承

被final所修飾的方法:密封方法

被final所修飾的類:密封類

String使用雙等號進行比較時,並不是比較內容,比較的是兩個引用是否指向同一個物件。

然後選擇題中會問到str1是否等於str2

        String str1 = "hello";
        String str2 = new String("hello");
        System.out.println(str1 == str2);  //false
        System.out.println(str1.equals(str2));  //true

因為str1 == str2 比較的是兩個的引用的地址是否相同,如下圖,

而str1.equals(str2)比較的是兩個裡面的內容是否相同。

再看下面兩個:理解常量池中的儲存的物件只有一份

        String str3 = "he"+"llo";  //兩個常量在比較前就會合成hello
        System.out.println(str1 == str3);      //hello在常量池中只有一份
        //true
        String str4 = "he";  //he在常量池
        String str5 = str4+"llo";  //llo也是常量,在常量池,str4是變數,在執行時才會
        System.out.println(str4 == str5);  //str5引用的是he 和llo拼接起來的在堆當中的value
        //false

最後一個:

        String str6 = new String("he")+"llo";
        System.out.println(str1 == str6);

str6引用的是:new了一個value在堆上,指向he;value的地址和llo的地址的組合就是str6所指向的。

String的intern方法手動把String物件加入到常量池中。

        String str1 = "hello";
        String str2 = new String("hello").intern();
        System.out.println(str1 == str2);

上面已經說了不加intern是false,加了之後就會把hello的地址給str2。

String字串不可改變:

為什麼不可變?看下面程式碼註釋

String str = "hello" ; 
str = str + " world" ;  //在常量池中建立了一個world
str += "!!!" ;        //又在常量池中建立了一個  hello world
System.out.println(str); 
//列印出hello world  ,但world本身沒有變

還有就是substring修改:也是不能改變原來的Hello字串

        String str = "Hello";
        str = "h" + str.substring(1);  //建立新的字串
        System.out.println(str);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章