亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解Java中的字符串類(lèi)型

 更新時(shí)間:2014年02月15日 15:49:05   作者:  
這篇文章主要介紹了Java中的字符串類(lèi)型,需要的朋友可以參考下

1.Java內(nèi)置對(duì)字符串的支持;
  所謂的內(nèi)置支持,即不用像C語(yǔ)言通過(guò)char指針實(shí)現(xiàn)字符串類(lèi)型,并且Java的字符串編碼是符合Unicode編碼標(biāo)準(zhǔn),這也意味著不用像C++那樣通過(guò)使用string和wstring類(lèi)實(shí)現(xiàn)與C語(yǔ)言兼容和Unicode標(biāo)準(zhǔn)。Java內(nèi)部通過(guò)String類(lèi)實(shí)現(xiàn)對(duì)字符串類(lèi)型的支持。
這意味著:我們可以直接對(duì)字符串常量調(diào)用和String對(duì)象同樣的方法:


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

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

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

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

復(fù)制代碼 代碼如下:

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);
    }
}
/*程序輸出:
 * true
 * false
 * */

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

3.字符串中的編碼問(wèn)題。
  這里要理解兩個(gè)問(wèn)題:如何處理源文件中的字符串編碼?編譯成class文件或者是代碼在Java虛擬機(jī)運(yùn)行時(shí)字符串是采用什么編碼的?
  第一個(gè)問(wèn)題的理解是:源代碼中的字符串編碼取決于你的IDE或者文本編輯器。如以下的代碼是使用GBK編碼格式下編輯,然后使用UTF-8和GBK解碼打開(kāi)
//GBK編碼格式,使用GBK格式打開(kāi)

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

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

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

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

如String類(lèi)中有如下的方法:
  public String(byte[] bytes, Charset charset);通過(guò)指定定字符集編碼類(lèi)型,和相應(yīng)的byte數(shù)組(byte長(zhǎng)度為8位)構(gòu)造字符串;
  public byte[] getBytes(Charset charset);指定字符集編碼類(lèi)型,將字符串轉(zhuǎn)化為byte數(shù)組,即字符串的二進(jìn)制表示。

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

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

相關(guān)文章

  • 解析Java的JVM以及類(lèi)與對(duì)象的概念

    解析Java的JVM以及類(lèi)與對(duì)象的概念

    這篇文章主要介紹了解析Java的JVM以及類(lèi)與對(duì)象的概念,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 精通Java泛型的使用與原理

    精通Java泛型的使用與原理

    針對(duì)利用繼承來(lái)實(shí)現(xiàn)通用程序設(shè)計(jì)所產(chǎn)生的問(wèn)題,泛型提供了更好的解決方案,本文詳細(xì)的介紹了Java泛型的使用與原理,感興趣的可以了解一下
    2022-03-03
  • Java游戲開(kāi)發(fā)之俄羅斯方塊的實(shí)現(xiàn)

    Java游戲開(kāi)發(fā)之俄羅斯方塊的實(shí)現(xiàn)

    俄羅斯方塊是一個(gè)最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計(jì)和編程的益智類(lèi)視頻游戲。本文和大家分享了利用Java語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的小游戲的示例代碼,需要的可以參考一下
    2022-05-05
  • java中如何執(zhí)行xshell命令

    java中如何執(zhí)行xshell命令

    這篇文章主要介紹了java中如何執(zhí)行xshell命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 同時(shí)使用@LoadBalanced?@RefreshScope注解負(fù)載均衡失效分析

    同時(shí)使用@LoadBalanced?@RefreshScope注解負(fù)載均衡失效分析

    這篇文章主要為大家介紹了同時(shí)使用@LoadBalanced?@RefreshScope負(fù)載均衡失效問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Spring中的@ConditionalOnProperty注解詳解

    Spring中的@ConditionalOnProperty注解詳解

    這篇文章主要介紹了Spring中的@ConditionalOnProperty注解詳解,常見(jiàn)的@Conditionalxxx開(kāi)頭的注解我們稱(chēng)之為條件注解,常見(jiàn)的條件注解有,簡(jiǎn)單來(lái)講,一般是在配置類(lèi)上或者是@Bean修飾的方法上,添加此注解表示一個(gè)類(lèi)是否要被Spring上下文加載,需要的朋友可以參考下
    2024-01-01
  • Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證方法

    Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證方法

    最近在負(fù)責(zé)一個(gè)對(duì)接第三方服務(wù)的事情,在對(duì)接期間因?yàn)榈谌椒?wù)為https的請(qǐng)求,這篇文章主要給大家介紹了關(guān)于Java發(fā)送https請(qǐng)求并跳過(guò)ssl證書(shū)驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • java字符串?dāng)?shù)組進(jìn)行大小排序的簡(jiǎn)單實(shí)現(xiàn)

    java字符串?dāng)?shù)組進(jìn)行大小排序的簡(jiǎn)單實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇java字符串?dāng)?shù)組進(jìn)行大小排序的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • SpringMVC mybatis整合實(shí)例代碼詳解

    SpringMVC mybatis整合實(shí)例代碼詳解

    這篇文章主要介紹了springmvc與mybatis實(shí)例詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 淺談java面向?qū)ο笾兴姆N權(quán)限

    淺談java面向?qū)ο笾兴姆N權(quán)限

    這篇文章主要介紹了淺談java面向?qū)ο笾兴姆N權(quán)限,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論