91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java中使用String保存字符串

發布時間:2021-05-20 15:24:23 來源:億速云 閱讀:192 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關如何在Java中使用String保存字符串,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

String 真的是 Immutable 的嗎

Java 中的 Unicode 字符串會按照 Latin1(所有的字符都小于 0xFF 時)或者 UTF16 的編碼格式保存在 String 中,保存為 byte 數組:

private final byte[] value;

通常所說的 Immutable 都是指 final bytes 在 String 初始化后就不會修改,所有字符串的相關操作都是不會修改原數組而是創建新的副本。

但是數組元素理論上是可以修改的,比如下面通過反射的方式,將字符串常量 abc 修改為 Abc:

public static void main(String[] args) {
     setFirstValueToA("abc");
        String replaced = new String("abc");
        System.out.println(replaced); // Abc
    }
    
    private static void setFirstValueToA(String str) {
        Class<String> stringClass = String.class;
        try {
            Field value = stringClass.getDeclaredField("value");
            value.setAccessible(true);
            byte[] bytes = (byte[]) value.get(str);
            bytes[0] = 0x41; // A
 
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

字符串數組如何保存為字節數組

通過如下代碼測試幾個字符串數組:

public static void main(String[] args) {
        printString("abc");
        printString("中文");
        printString("abc中文");
        printString("abc");
    }
    private static void printString(String str) {
        System.out.println("======>" + str);
        // return the UTF-16 char[] size
        System.out.println("length: " + str.length());
        // Use default Encoding (UTF-8)
        System.out.println("getBytes: " + str.getBytes().length);
        // Convert UTF-16 char[] to char
        System.out.println("codePointCount: " + str.codePointCount(0, str.length()));
        // Get the UTF-16 char[]
        System.out.println("toCharArray: " + str.toCharArray().length);
        // The UTF-16 char[] to bytes
        System.out.println("internal value: " + getStringInternalValueLength(str));
    }

結果如下:

如何在Java中使用String保存字符串

internal value

首先解釋下 String 的 value 字段計算方式:

  • 所有字符都小于 0xFF 時,采用 Latin1 Character Encoding 來保存 Unicode code point,也就是每個字符都用一個 byte 來保存。比如“ABC”

  • 上述條件不滿足時,采用 UTF-16 Character Encoding 來保存,也就是每個字符都用 2 個或者 4 個 byte 來保存。

Unicode 是 Coded Character Set,將幾乎所有的人類文字映射到 code point 符號,通常格式為 U+xxxx,xxxx 為 16 進制整數,表達范圍為 U+0000~U+10FFFF。code point 符號是文字的規范化標記,但是實際保存時肯定還是要保存為字節數組的。這些不同的保存方式就是 Character Encoding,比如 UTF-8,還有 Java String 內部采用的 UTF-16。

UTF-16 是一種將 Unicode code point 表達成字符數組的編碼方式,對于 U+0000~U+FFFF,直接按照 2 個字節保存(細分的話還有大端字節序和小端字節序的區別);對于 U+10000~U+10FFFF,會先轉化為一對 U+D800~U+DFFF 范圍內的 code point(surrogate pair),再將這兩個 code point 按照前面的規則保存。之所以選擇這個范圍,是因為這個 Unicode 區間還沒有被分配有效的字符,因此可以和前面的規則區分。

“中文”這兩個漢字的 Unicode code point 非別為 U+4E2d、U+6587,大于 0xFF,所以保存 byte 長度為 4;"abc中文" 中存在不滿足條件的字符,所以全部用 UTF-16 保存,它們都是 2 個 byte 的,所以長度為 10。

“?” 的 Unicode code point 為 U+1F60A,根據 UTF-16 規范,U+10000~U+10FFFF 需要轉化為 surrogate pair 之后再保存成 byte, 轉換后為 U+D83D、U+DE0A,因此 "abc" 的字節長度為 10。

toCharArray()

Java 中 char 的大小為 2 個字節,剛好可以表示一個 U+0000~U+FFFF 的 Unicode 符號。

Latin1 編碼時,char 數組為 byte 數組的填充,高字節為 0;UTF-16 編碼時,相當于轉化過 surrogate pair 后的 Unicode 編碼數組,其中 0xD800~0xDFFF 范圍內的為 surrogate 字符。

“abc” 時為 Latin1 編碼,所以 char 數組大小等于 bytes 數組;“abc中文” 時為 UTF-16 編碼,所以 char 數組大小等于 bytes 數組的一半。

codePointCount()

toCharArray 方法將轉化后的 surrogate pair 也算在內,因此實際長度可能大于字符長度。而 codePointCount 就能去除 surrogate pair 的影響,返回初始的字符長度,它會將連續兩個 surrogate pair 只計數一次。

String.length

該方法就是 toCharArray 數組的長度,受到 surrogate pair 的影響,可能大于字符長度。

str.getBytes().length

String 內部是通過 UTF-16 編碼保存的字節數組,當通過 getBytes 方法返回時,是需要指定 Encoding 的,默認采用 UTF-8,因此會將 UTF-16 的字節數組轉化為 UTF-8 的字節數組,每個 Unicode 符號在 UTF-8 編碼后長度為 1~4 字節。

System.out.println("abc".getBytes(UTF_8).length); // 3
        System.out.println("中".getBytes(UTF_8).length); // 3
        System.out.println("文".getBytes(UTF_8).length); // 3
        System.out.println("".getBytes(UTF_8).length); // 4

Java可以用來干什么

Java主要應用于:1. web開發;2. Android開發;3. 客戶端開發;4. 網頁開發;5. 企業級應用開發;6. Java大數據開發;7.游戲開發等。

以上就是如何在Java中使用String保存字符串,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

陆丰市| 昆明市| 黄陵县| 安国市| 都兰县| 务川| 新乡县| 乌拉特后旗| 石城县| 炉霍县| 吉安市| 武邑县| 鄢陵县| 临洮县| 司法| 永安市| 江陵县| 松滋市| 察隅县| 玛多县| 永德县| 平罗县| 涞水县| 黔南| 顺义区| 康保县| 西宁市| 南充市| 荥阳市| 哈密市| 邵阳市| 黔东| 双峰县| 侯马市| 道孚县| 朝阳市| 漾濞| 濉溪县| 洛隆县| 建昌县| 嵊泗县|