成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

Java String保存字符串的機(jī)制

瀏覽:3日期:2022-08-12 11:27:06
String 真的是 Immutable 的嗎

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

private final byte[] value;

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

但是數(shù)組元素理論上是可以修改的,比如下面通過反射的方式,將字符串常量 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();} }字符串?dāng)?shù)組如何保存為字節(jié)數(shù)組

通過如下代碼測試幾個字符串?dāng)?shù)組:

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)); }

結(jié)果如下:

Java String保存字符串的機(jī)制

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 進(jìn)制整數(shù),表達(dá)范圍為 U+0000~U+10FFFF。code point 符號是文字的規(guī)范化標(biāo)記,但是實際保存時肯定還是要保存為字節(jié)數(shù)組的。這些不同的保存方式就是 Character Encoding,比如 UTF-8,還有 Java String 內(nèi)部采用的 UTF-16。

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

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

“☺” 的 Unicode code point 為 U+1F60A,根據(jù) UTF-16 規(guī)范,U+10000~U+10FFFF 需要轉(zhuǎn)化為 surrogate pair 之后再保存成 byte, 轉(zhuǎn)換后為 U+D83D、U+DE0A,因此 'abc' 的字節(jié)長度為 10。

toCharArray()

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

Latin1 編碼時,char 數(shù)組為 byte 數(shù)組的填充,高字節(jié)為 0;UTF-16 編碼時,相當(dāng)于轉(zhuǎn)化過 surrogate pair 后的 Unicode 編碼數(shù)組,其中 0xD800~0xDFFF 范圍內(nèi)的為 surrogate 字符。

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

codePointCount()

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

String.length

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

str.getBytes().length

String 內(nèi)部是通過 UTF-16 編碼保存的字節(jié)數(shù)組,當(dāng)通過 getBytes 方法返回時,是需要指定 Encoding 的,默認(rèn)采用 UTF-8,因此會將 UTF-16 的字節(jié)數(shù)組轉(zhuǎn)化為 UTF-8 的字節(jié)數(shù)組,每個 Unicode 符號在 UTF-8 編碼后長度為 1~4 字節(jié)。

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 最后

到此這篇關(guān)于Java String保存字符串的機(jī)制的文章就介紹到這了,更多相關(guān)Java String保存字符串內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
91精品国产色综合久久ai换脸 | 国产伦精品一区| 91精品久久久久久久久99蜜臂| 亚洲视频在线观看一区| 91在线你懂得| 日韩欧美一级在线播放| 久久aⅴ国产欧美74aaa| 久久久噜噜噜| 天天操天天色综合| 久久aⅴ国产紧身牛仔裤| 亚洲一区视频在线| 亚洲美女色禁图| 樱桃国产成人精品视频| 国产最新精品精品你懂的| 久久精品主播| 亚洲已满18点击进入久久| 欧美日韩精品伦理作品在线免费观看| 91精品国产色综合久久不卡蜜臀 | 欧美日韩国产综合一区二区| 久久精品国产亚洲a| 91精品欧美综合在线观看最新| 国产乱码精品一品二品| 欧美zozo另类异族| 欧美fxxxxxx另类| 国产精品午夜电影| 中日韩男男gay无套| 亚洲一级在线观看| 色偷偷久久一区二区三区| 免费成人小视频| 欧美日韩久久久一区| 国产成人aaa| 久久丝袜美腿综合| 国内精品99| 亚洲在线免费播放| 欧美在线观看视频一区二区 | 偷拍日韩校园综合在线| 久久aⅴ国产紧身牛仔裤| 亚洲妇熟xx妇色黄| 正在播放亚洲| 亚洲午夜一区二区三区| 蜜桃精品久久久久久久免费影院| 午夜伦欧美伦电影理论片| 亚洲一区在线直播| 裸体在线国模精品偷拍| 欧美一区二区精品| 国产成人免费av在线| 久久先锋影音av| 91免费国产在线观看| 精品对白一区国产伦| av资源网一区| 久久久久九九视频| 亚洲欧美一区二区原创| 亚洲国产精品成人综合色在线婷婷| 91色九色蝌蚪| 国产午夜久久久久| 亚洲一二区在线| 亚洲精品美腿丝袜| 99视频日韩| 午夜精品久久一牛影视| 久久亚洲风情| 精品一区二区三区在线播放| 制服丝袜av成人在线看| 成人禁用看黄a在线| 6080午夜不卡| 精品一区二区三区免费视频| 欧美一级黄色录像| av福利精品导航| 久久综合色鬼综合色| 欧美午夜一区| 亚洲黄色小说网站| 色综合久久久网| 激情文学综合网| 日韩精品一区二| 99视频一区二区三区| 国产精品免费久久| 一区二区三区欧美成人| 首页综合国产亚洲丝袜| 久久看片网站| 99久久婷婷国产综合精品电影| 久久久久久免费网| 在线看片欧美| 天天色综合天天| 欧美麻豆精品久久久久久| 99国产精品视频免费观看| 亚洲欧洲av色图| 国产日韩一区二区三区| 免费在线视频一区| 欧美一区二区三区白人| 91社区在线播放| 亚洲精选一二三| 色婷婷亚洲一区二区三区| 日本午夜精品视频在线观看| 久久亚洲综合网| 国产自产2019最新不卡| 精品国产伦一区二区三区观看方式 | 国产精品77777竹菊影视小说| 精品国产99国产精品| 亚洲黄色毛片| 久久精品国产精品青草| 日韩亚洲国产中文字幕欧美| 欧美日韩在线大尺度| 三级一区在线视频先锋| 日韩欧美在线1卡| 在线观看一区欧美| 日韩av午夜在线观看| 91精品国产福利| 欧美a级在线| 一区二区三区四区高清精品免费观看| 久久国产精品亚洲77777| 精品一区二区三区免费观看 | 精品国产乱码久久久久久免费| 午夜欧美精品| 蜜乳av一区二区三区| 91精品国产黑色紧身裤美女| 欧美区一区二| 日本伊人午夜精品| 久久精品视频一区| 久久国产99| 国产高清精品网站| 亚洲午夜免费电影| 精品成人在线观看| 久久国产精品高清| 99精品欧美一区二区蜜桃免费| 亚洲国产一区视频| 精品对白一区国产伦| 麻豆9191精品国产| 成人精品小蝌蚪| 一区二区三区91| 欧美丝袜自拍制服另类| 欧美激情精品久久久六区热门| 亚洲成人手机在线| 国产亚洲午夜高清国产拍精品 | 亚洲综合国产激情另类一区| 免费观看一级特黄欧美大片| 国产午夜精品理论片a级大结局 | 日本欧美大码aⅴ在线播放| 2019国产精品| 麻豆成人小视频| 午夜精品久久久久99热蜜桃导演| 中文字幕免费观看一区| 欧美在线免费播放| 国产精品二区在线观看| 韩国三级电影一区二区| 国产精品美女久久久久高潮| 久久精品道一区二区三区| 91在线视频在线| 另类欧美日韩国产在线| 一区二区在线看| www成人在线观看| 色八戒一区二区三区| 亚洲网站啪啪| 国产精品1区2区3区| 亚洲高清久久久| 国产偷国产偷亚洲高清人白洁| 久久精品男女| 红桃视频亚洲| 国产一区二区三区美女| 日本中文在线一区| 亚洲欧美一区二区在线观看| 欧美一区二区二区| 玖玖在线精品| 日韩视频在线播放 | 北条麻妃国产九九精品视频| 午夜电影久久久| 国产精品久久看| 日韩一级黄色片| 亚洲在线电影| 黄色日韩在线| 99精品1区2区| 激情丁香综合五月| 亚洲不卡av一区二区三区| 亚洲欧洲精品一区二区精品久久久 | 99久久久久久99| 美女视频黄 久久| 亚洲另类中文字| 91精品国产欧美一区二区18 | 国产成人免费视频网站高清观看视频| 亚洲电影一区二区| 成人欧美一区二区三区白人| 欧美va亚洲va国产综合| 欧美在线免费视屏| 999在线观看精品免费不卡网站| 欧美va天堂在线| 国产乱码精品1区2区3区| 日韩精品一卡二卡三卡四卡无卡| 亚洲免费在线视频| 国产精品免费丝袜| 欧美成人乱码一区二区三区| 欧美亚洲一区| 亚洲一区中文| 亚洲一区二三| 日韩一区二区免费看| 色综合色狠狠综合色| av色综合久久天堂av综合| 国产v日产∨综合v精品视频| 麻豆91小视频| 日本视频中文字幕一区二区三区| 亚洲国产wwwccc36天堂| 亚洲精品国产第一综合99久久 | 亚洲老妇xxxxxx|