日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java String保存字符串的機制

瀏覽:41日期:2022-08-12 11:27:06
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[] sizeSystem.out.println('length: ' + str.length());// Use default Encoding (UTF-8)System.out.println('getBytes: ' + str.getBytes().length);// Convert UTF-16 char[] to charSystem.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 bytesSystem.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); // 3System.out.println('中'.getBytes(UTF_8).length); // 3System.out.println('文'.getBytes(UTF_8).length); // 3System.out.println(''.getBytes(UTF_8).length); // 4 最后

到此這篇關于Java String保存字符串的機制的文章就介紹到這了,更多相關Java String保存字符串內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚州av乱码久久精品蜜桃| 免费精品视频| 精品视频一区二区三区在线观看| 欧美日韩中文字幕一区二区三区| 免费视频久久| 国产一区二区三区不卡av| 欧美特黄一级| 日韩欧美激情电影| 国产v日韩v欧美v| 91九色综合| 另类av一区二区| 久久久国产亚洲精品| 91嫩草精品| 亚洲免费观看高清完整版在线观| 亚洲韩日在线| 久久久精品网| 精品日产乱码久久久久久仙踪林| 99久久99久久精品国产片果冰| 国产精品视频一区二区三区四蜜臂 | 午夜在线视频一区二区区别| 日韩亚洲一区在线| 日韩精品中文字幕吗一区二区 | 日韩伦理一区| 精品国产不卡| 精品日本视频| 精品久久中文| 国产亚洲精品美女久久| 午夜国产欧美理论在线播放 | 国产调教精品| 国产精品观看| 国产剧情一区| av中文资源在线资源免费观看| 国产亚洲电影| 久久免费精品| 黑人精品一区| 自拍日韩欧美| 免费看欧美美女黄的网站| 自拍自偷一区二区三区| 欧美1区免费| 日韩欧美一区免费| 日韩成人精品一区二区| 成人羞羞视频播放网站| 激情综合网站| 国产精品免费看| 亚洲1区在线| 日韩视频1区| 久久免费精品| 久久久久国产精品一区三寸| 激情综合网站| 欧美自拍一区| 日韩av免费| 蜜臀国产一区二区三区在线播放| 亚州av日韩av| 精品亚洲a∨一区二区三区18| 久久九九电影| 日本精品久久| 99成人在线| 日韩av首页| 免费观看亚洲天堂| 日韩高清在线不卡| 激情综合网址| 成人黄色av| 国产午夜久久av| 亚洲日产国产精品| 一区久久精品| 久久在线免费| 日韩在线免费| 高清在线一区| 麻豆精品视频在线| 亚洲精品乱码| 首页国产欧美日韩丝袜| 99精品美女| 精品丝袜在线| 中文在线а√天堂| 国产一区二区三区不卡视频网站| 欧美久久精品| 日韩av不卡一区二区| 亚洲精品日本| 欧美午夜三级| 国产日产一区| 日本一区二区三区视频在线看 | 国产精品女主播一区二区三区| 三级精品视频| 日韩中文一区二区| 精品亚洲美女网站| av中文资源在线资源免费观看| 免费观看久久久4p| 国产一区二区三区免费在线 | 免费观看在线综合| 免费日韩一区二区| 国产亚洲福利| 亚洲精品在线国产| 国产一区二区三区久久久久久久久| 国际精品欧美精品| 激情婷婷欧美| 午夜久久av| 国产精品男女| 精品久久久亚洲| 不卡一区综合视频| 亚洲精品大片| 国产欧洲在线| 人人精品人人爱| 麻豆精品视频在线观看视频| 视频福利一区| 日韩在线观看中文字幕| 国产成人免费| 免费在线成人网| 久久精品人人| 在线综合亚洲| 国产日韩中文在线中文字幕| 国产传媒av在线| 99香蕉国产精品偷在线观看| 亚洲精品一区二区在线播放∴| jizzjizz中国精品麻豆| 欧美精品国产一区| 日韩一区精品字幕| 国内一区二区三区| 免费精品视频| 久久影院资源站| 欧美另类中文字幕| 日韩中出av| 亚洲一二三区视频| 91成人在线| 日韩高清一区在线| 亚洲精品一二| 蜜桃视频一区二区三区| 亚洲高清二区| 四虎4545www国产精品| 精品视频99| av在线日韩| 亚洲手机在线| 91精品国产调教在线观看| 桃色一区二区| 亚洲精品1区2区| 欧美精品黄色| 视频一区视频二区中文| 日韩精品国产欧美| 欧美日韩中出| 99视频精品视频高清免费| 综合激情网站| 日韩亚洲在线| 亚洲欧美日本日韩| 免费观看亚洲天堂| 国产美女一区| re久久精品视频| 亚洲久久视频| 成人av动漫在线观看| 欧美精品中文| 日韩久久99| 精品亚洲美女网站| av最新在线| 蜜臀av免费一区二区三区| 中文字幕在线视频网站| 亚洲特级毛片| 国产欧美一区二区色老头| 免费视频亚洲| 日韩视频一区| 免费美女久久99| 午夜日韩福利| 国产精品麻豆久久| 免费美女久久99| 亚洲免费高清| 中文精品在线| 91大神在线观看线路一区| 日韩在线观看一区二区| 亚洲一区欧美| 欧美特黄a级高清免费大片a级| 午夜久久中文| 亚洲精品系列| 亚洲高清不卡| 久久亚洲资源中文字| 久久一区二区三区电影| 亚洲欧美一区在线| 捆绑调教美女网站视频一区 | 亚洲欧美久久精品| 日韩精品欧美成人高清一区二区| 久久gogo国模啪啪裸体| 国产精品qvod| 三级一区在线视频先锋| 国产精品视区| 国产精品15p| 色8久久久久| 国产精品久久久久久妇女| 老牛国内精品亚洲成av人片| 日韩高清欧美| 日韩在线二区| 中文字幕亚洲在线观看| 国产精品久久久久9999高清| 国产精品久一| 久久影视一区| 国产精品久久久久久模特| 九九99久久精品在免费线bt| 久久久久久久久丰满| 在线观看亚洲精品福利片| 精品视频亚洲| 四虎精品永久免费| 精品久久久亚洲| 亚洲一区二区三区在线免费| 精品国产鲁一鲁****| 99久久精品网|