快速了解Java的字符串類型

快速了解Java的字符串類型

天津卓眾教育      2022-04-25 11:56:01     18

快速了解Java的字符串類型,1.Java內(nèi)置對字符串的支持;所謂的內(nèi)置支持,即不用像C語言通過char指針實現(xiàn)字符串類型,并且Java的字符串編碼是符合Unicode編碼

課程價格 請咨詢

上課時段: 授課校區(qū):

詳細介紹

1.Java內(nèi)置對字符串的支持;

所謂的內(nèi)置支持,即不用像C語言通過char指針實現(xiàn)字符串類型,并且Java的字符串編碼是符合Unicode編碼標準,這也意味著不用像C++那樣通過使用string和wstring類實現(xiàn)與C語言兼容和Unicode標準。Java內(nèi)部通過String類實現(xiàn)對字符串類型的支持。

這意味著:我們可以直接對字符串常量調(diào)用和String對象同樣的方法:

//可以再"abc"上直接調(diào)用String對象的所有方法int length="abc".length();以及String abc=new String("abc");int length=abc.length();

2.Java中的字符串值是constant(常量的)

這里的意思是字符串類型在創(chuàng)建完成之后,是不能改變其中的值的,從String的成員方法也可以看出沒有能改變值的方法接口;并且像"abc",new String("def")中的”abc","def"存放于Java虛擬機中的常量池。

以下的代碼中的"abc"存放于常量池中,因此變量a,ab指向的地址均為常量池中同一個"abc"。

public?class?StringTest?{????public?static?void?main(String[]?args)?{????????String?a="abc";????????String?ab="abc";????????String?abc=new?String("abc");????????System.out.println(ab==a);????????System.out.println(a==abc);????}}

那么動態(tài)生成的、可變的字符串又是如何實現(xiàn)的呢?Java中提供StringBuffer和StringBuilder類實現(xiàn)這一需求;Java中字符串連接可以使用“+”操作符;如:"abc"+"def";這里的內(nèi)部實現(xiàn)也可以使用StringBuilder類或者StringBuffer類實現(xiàn);那么StringBuilder和StringBuffer內(nèi)部又是如何實現(xiàn)呢?是通過字符數(shù)組存儲字符串。以下是從JDK附帶的源碼中找到的片段,可以看出StringBuffer內(nèi)部使用char數(shù)組對字符串進行存儲,其中的AbstractStringBuilder是StringBuffer的父類:

3.字符串中的編碼問題。

這里要理解兩個問題:如何處理源文件中的字符串編碼?編譯成class文件或者是代碼在Java虛擬機運行時字符串是采用什么編碼的?

第一個問題的理解是:源代碼中的字符串編碼取決于你的IDE或者文本編輯器。如以下的代碼是使用GBK編碼格式下編輯,然后使用UTF-8和GBK解碼打開

//GBK編碼格式,使用GBK格式打開

//GBK編碼格式,使用UTF-8格式打開,亂碼;如果此時系統(tǒng)默認的編碼格式不是GBK時,在編譯時需要在javac加入"-encoding GBK"參數(shù)選項值;

那么如何處理這種源代碼編碼的問題呢?答案是在編譯器javac的參數(shù)選項-encoding中指定,默認這一參數(shù)的值是跟系統(tǒng)默認的編碼一致。Windows的默認編碼一般為GBK(可以通過System.getProperty("file.encoding")獲得該值);在系統(tǒng)默認編碼為GBK,但是源代碼使用UTF-8編碼,此時應(yīng)該使用javac-encoding UTF-8進行編譯。

對”編譯成class文件或者是代碼在Java虛擬機運行時字符串是采用什么編碼的?“這個問題的理解是:首先,Java中的String類型是采用UTF-16編碼實現(xiàn)的,也就是不管在源碼的編碼如何,在Java虛擬機中的字符串都是使用UTF-16編碼實現(xiàn)。這意味著只要編譯器javac正確的理解了源碼文件中字符串的編碼,運行時或者class字節(jié)碼文件中的字符串是獨立于源碼中的編碼格式的。這里我們可以進一步對java中的char基本類型或者Character類進行理解解,這兩者內(nèi)部的編碼和java的字符串類型一樣,都是基于UTF-16編碼實現(xiàn)的,也就是不論‘a','1'這樣的字符還是漢字在Java中的長度都是16位。

并且在String類型中也有著通過指定定字符編碼,對底層二進制表示和字符串之間進行轉(zhuǎn)化,也就意味著我們可以正確地讀取GBK編碼、UTF-8編碼或者其他編碼的文本文件或者其他輸入流將其轉(zhuǎn)化為內(nèi)存中正確的字符串。

如String類中有如下的方法:

public String(byte[]bytes,Charset charset);通過指定定字符集編碼類型,和相應(yīng)的byte數(shù)組(byte長度為8位)構(gòu)造字符串;

public byte[]getBytes(Charset charset);指定字符集編碼類型,將字符串轉(zhuǎn)化為byte數(shù)組,即字符串的二進制表示。

還有需要注意String的另一個成員方法:

public byte[]getBytes();這個方法返回的byte數(shù)組,所根據(jù)的字符集編碼是指平臺默認的字符集編碼,而不一定是UTF-16。

以上就是天津卓眾教育java培訓機構(gòu)的小編針對“快速了解Java的字符串類型”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。

培訓啦提醒您:交易時請核實對方資質(zhì),對于過大宣傳或承諾需謹慎!任何要求預付定金、匯款等方式均存在風險,謹防上當。