淺談String的不可變性以及String拼接的簡單總結


一、String的不可變性,實例化的兩種方式以及預備知識
1.String的不可變性:
String是一個final類,不可被繼承所以其字符序列不可變,
String對象的字符內容是存儲在一個字符數組value[]中的,字符串是常量,創建之后不能更改

String的聲明為下圖:

 

 

2.String實例化的兩種方式:
①通過字面量定義的方式
②通過new+構造函數的方式
3.預備知識:內存解析
堆:此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。
棧:即虛擬機棧,用於存儲局部變量等。局部變量存放了編譯期可知長度的各種基本數據類型(boolean,byte,char,short,int,float,double,long等),對象引用(不等同於對象本身,是對象在堆內的首地址)方法執行完自動釋放。
方法區:用於存放已被虛擬機加載的類信息,常量(常量池),靜態變量,即時編譯器編譯后的代碼等數據。

二、字面量定義實例化

public class 字面量實例化 {
    public static void main(String[] args) {

        String s1="abc";//字符串常量存儲在字符串常量池里,目的是共享,並且字符串常量池中是不會存儲相同內容的字符串的。
        //即s1,s2在棧中為一項,二者常量池指的是同一常量
        String s2="abc";
        String s3="111";
        System.out.println(s1==s2);//true,比較的是常量池中的地址
        s1="111";//value數組為final類型,所以不能對現有數組進行重新賦值,故新添加常量
        System.out.println(s1);//111,重寫了指定內存區域賦值,指向字符串常量池中新添加的常量111
        System.out.println(s1==s2);//false,111和abc分別表示不同的內存區域,所以不相等。
        System.out.println(s1==s3);//true,指向相同的內存區域,所以相等
        System.out.println("*****************");
        String s4="abc";
        s4+="456";//經試驗發現s4進行連接運算后,s2並未發生變化,所以s4依然是新創建的
        System.out.println(s4);//abc456,重寫了指定內存區域賦值,重新指向內存區域賦值
        System.out.println(s2);//abc
        System.out.println("*****************");
        String s5="abc";//經試驗發現調用了replace()方法后,s5值依舊保持不變,所以s6新創建的
        String s6=s5.replace("a","m");//重寫了指定內存區域賦值,重新指向內存區域賦值
        System.out.println(s5);//abc
        System.out.println(s6);
        }
       }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM