Java-字符串類(lèi)String對(duì)象的創(chuàng)建原理

  • 字符串是我們?cè)诰幊讨凶畛J褂玫囊环N數(shù)據(jù)類(lèi)型,它的表現(xiàn)形式可以分為兩種:String和StringBuffer。

  • 它不屬于8種基本的數(shù)據(jù)類(lèi)型,而是一種引用類(lèi)型。

  • String對(duì)象代表一組不可改變的Unicode字符序列,對(duì)它的任何修改實(shí)際上又產(chǎn)生一個(gè)新的字符串,String類(lèi)對(duì)象的內(nèi)容一旦被初始化就不能再改變。

  • StringBuffer對(duì)象代表一組可改變的Unicode字符序列。

  • 同時(shí),String類(lèi)是final類(lèi)型的類(lèi)。

  • String的創(chuàng)建:有兩種方式:

    • 靜態(tài)方式(常用)。像是給變量直接賦值一樣來(lái)使用。如:String s1 = “abc”; String s2 = “abc”;
    • 動(dòng)態(tài)方式。動(dòng)態(tài)的內(nèi)存分配,使用new運(yùn)算符。如:String s3= new String(“abc”); String s4= new String(“abc”);

那么這兩種方式創(chuàng)建的字符串是同一個(gè)字符串對(duì)象嘛?不,是有區(qū)別的。
在于:使用靜態(tài)方式創(chuàng)建的字符串,在方法區(qū)的常量池中只會(huì)產(chǎn)生唯一一個(gè)字符串對(duì)象,使用該方式產(chǎn)生同樣一個(gè)字符串時(shí),內(nèi)存中不再開(kāi)辟另外一塊空間,而是兩個(gè)引用變量指向同一個(gè)字符串對(duì)象。使用動(dòng)態(tài)方式創(chuàng)建的字符串,在堆內(nèi)存中會(huì)產(chǎn)生出不同的對(duì)象。

  • String對(duì)象的創(chuàng)建
    • String類(lèi)的構(gòu)造方法
      • 初始化一個(gè)新創(chuàng)建的 String 對(duì)象,它表示一個(gè)空字符序列。
String 變量名 = new String () ;
  • 初始化一個(gè)新創(chuàng)建的 String 對(duì)象,表示一個(gè)與該參數(shù)相同的字符序列
String 變量名 = new String (String value) ;
  • 分配一個(gè)新的字符串,它包含當(dāng)前包含在字符串緩沖區(qū)參數(shù)中的字符序列。
String 變量名 = new String (StringBuffer buf) ;
  • 字符串文字常量本身是一個(gè)String對(duì)象
String 變量名 = “hello” ;
  • String類(lèi)的構(gòu)造方法
    • 初始化一個(gè)新創(chuàng)建的 String 對(duì)象,通過(guò)使用指定的charset 解碼指定的 byte 數(shù)組
String 變量名 = new String(byte[] bytes, String charsetName);
  • 初始化一個(gè)新創(chuàng)建的 String 對(duì)象,通過(guò)使用指定的 charset解碼指定的 byte 子數(shù)組,構(gòu)造一個(gè)新的 String
 String 變量名 = new String(byte[] bytes, int offset, int length, Charset charset);
  • String類(lèi)構(gòu)造方法
    • String s = new String() 初始化一個(gè)新創(chuàng)建的String對(duì)象,表示一個(gè)空字符串(“ ”);注意空字符串與null的區(qū)別:空字符串表示String對(duì)象的內(nèi)容為空,而null表示String類(lèi)的變量不指向任何的String 對(duì)象。
    • String( String original) 創(chuàng)建一個(gè)String對(duì)象,并用original為該對(duì)象初始化。
    • String( char chars[ ]) 使用一個(gè)字符數(shù)組創(chuàng)建一個(gè)String對(duì)象。
    • String( char chars[ ], int startIndex, int numChars) 使用一個(gè)字符數(shù)組創(chuàng)建一個(gè)String對(duì)象,startIndex表示數(shù)組的偏移量,numChars表示由多少個(gè)字符創(chuàng)建。參數(shù)偏移量可以省略。
    • String( byte asciiChars[ ]) 使用一個(gè)字節(jié)數(shù)組創(chuàng)建一個(gè)String對(duì)象。
    • String( byte asciiChars[ ], int startIndex, int numChars)同上。
    • String(StringBuffer buffer) 使用StringBufffer對(duì)象中的內(nèi)容為該對(duì)象初始化。
  • String對(duì)象的創(chuàng)建
    • 連接操作符“+”,可以將其它各種類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成字符串,并前后連接成新的字符串
String str1 = “hello ”;
String str2 = “world”;
String str = str1 + str2; //str為“hello world”

練習(xí):

System.out.println(5+6+'A');
System.out.println(5+6+"A");
System.out.println(5+"A"+6);
  • String類(lèi)的創(chuàng)建
    • 任何一個(gè)String對(duì)象在創(chuàng)建之后都不能對(duì)它的內(nèi)容作出任何改變(immutable)
    • 連接、獲得子串和改變大小寫(xiě)等操作,如果返回值同原字符串不同,實(shí)際上是產(chǎn)生了一個(gè)新的String對(duì)象
    • 在程序的任何地方,相同的字符串字面常量都是同一個(gè)對(duì)象
    • String類(lèi)重置了equals方法,用于比較兩個(gè)字符串的內(nèi)容
String str1 = “hello ”;
String str2 =  new String(“hello”);
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
  • String對(duì)象的創(chuàng)建
public class TestStringCharset {
public static void main(String[] args) {
byte[] bname = new byte[10];
String name1 = "張三";
try {
bname = name1.getBytes("utf-8");
String name2 = new String(bname,"utf-8");
System.out.println("name2="+name2);
         for(int i = 0;i<bname.length;i++){
                System.out.print(bname[i]);
             }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}
}

示例代碼:

package 字符串類(lèi);

public class Test1 {

    public static void main(String[] args) {

        //Java語(yǔ)言是如何管理字符串對(duì)象的?
        
        String s1 = new String();//空序列 在堆區(qū)里面開(kāi)一個(gè)空間,新建一個(gè)字符串對(duì)象 
        //實(shí)例化了兩個(gè)對(duì)象:
        //一個(gè)在常量池里丟了一個(gè)adfaj字符串,
        //然后在堆區(qū)里面放了一個(gè)對(duì)象
        String s2 = new String("adfaj");//2個(gè)對(duì)象
        
        String s3 = "";//一個(gè)空序列
        
        String s4 = "456";//常量池中 有了一個(gè)對(duì)象
    }
}

以上就是我關(guān)于 Java-字符串類(lèi)String對(duì)象的創(chuàng)建原理 知識(shí)點(diǎn)的整理與總結(jié)的全部?jī)?nèi)容,另附源碼


分割線


博主為咯學(xué)編程:父母不同意學(xué)編程,現(xiàn)已斷絕關(guān)系;戀人不同意學(xué)編程,現(xiàn)已分手;親戚不同意學(xué)編程,現(xiàn)已斷絕來(lái)往;老板不同意學(xué)編程,現(xiàn)已失業(yè)三十年。。。。。。如果此博文有幫到你歡迎打賞,金額不限。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容