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

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

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

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

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

private final byte[] value;

通常所說的 Immutable 都是指 final bytes 在 String 初始化后就不會(huì)修改,所有字符串的相關(guān)操作都是不會(huì)修改原數(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ù)組

通過如下代碼測(cè)試幾個(gè)字符串?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 字段計(jì)算方式:

所有字符都小于 0xFF 時(shí),采用 Latin1 Character Encoding 來保存 Unicode code point,也就是每個(gè)字符都用一個(gè) byte 來保存。比如“ABC” 上述條件不滿足時(shí),采用 UTF-16 Character Encoding 來保存,也就是每個(gè)字符都用 2 個(gè)或者 4 個(gè) byte 來保存。

Unicode 是 Coded Character Set,將幾乎所有的人類文字映射到 code point 符號(hào),通常格式為 U+xxxx,xxxx 為 16 進(jìn)制整數(shù),表達(dá)范圍為 U+0000~U+10FFFF。code point 符號(hào)是文字的規(guī)范化標(biāo)記,但是實(shí)際保存時(shí)肯定還是要保存為字節(jié)數(shù)組的。這些不同的保存方式就是 Character Encoding,比如 UTF-8,還有 Java String 內(nèi)部采用的 UTF-16。

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

“中文”這兩個(gè)漢字的 Unicode code point 非別為 U+4E2d、U+6587,大于 0xFF,所以保存 byte 長(zhǎng)度為 4;'abc中文' 中存在不滿足條件的字符,所以全部用 UTF-16 保存,它們都是 2 個(gè) byte 的,所以長(zhǎng)度為 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é)長(zhǎng)度為 10。

toCharArray()

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

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

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

codePointCount()

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

String.length

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

str.getBytes().length

String 內(nèi)部是通過 UTF-16 編碼保存的字節(jié)數(shù)組,當(dāng)通過 getBytes 方法返回時(shí),是需要指定 Encoding 的,默認(rèn)采用 UTF-8,因此會(huì)將 UTF-16 的字節(jié)數(shù)組轉(zhuǎn)化為 UTF-8 的字節(jié)數(shù)組,每個(gè) Unicode 符號(hào)在 UTF-8 編碼后長(zhǎng)度為 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)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品美女| 日韩精品一区二区三区中文 | 亚洲三级网站| 91看片一区| 国产极品嫩模在线观看91精品| 欧美亚洲自偷自偷| 久久精品99国产精品| 亚洲影院天堂中文av色| 精品一区av| 国产精品欧美大片| 一区二区小说| 日韩精品dvd| 亚洲精品永久免费视频| 国产精品久久久久毛片大屁完整版| 一区免费视频| 在线国产一区二区| 色婷婷精品视频| 国产精品成人a在线观看| 日本欧美大码aⅴ在线播放| 99视频在线精品国自产拍免费观看| 久久精品伊人| 精品亚洲二区| 国产精品久久久久9999高清| 综合欧美精品| 日本在线一区二区三区| 亚洲一级高清| 亚洲尤物在线| 天堂va在线高清一区| 蜜桃视频免费观看一区| 日韩一区二区三区精品| 日本在线一区二区三区| 日韩中文字幕一区二区高清99| 六月婷婷一区| 亚洲免费影视| 青草国产精品| 国产伦精品一区二区三区在线播放| 国产日韩在线观看视频| 日韩综合一区| 亚洲一级大片| 国产精品红桃| 精品国产网站| 狠狠久久婷婷| 91成人福利| 91欧美国产| 午夜一级在线看亚洲| 中文字幕一区二区三区在线视频| 涩涩涩久久久成人精品| 欧美日韩在线精品一区二区三区激情综合 | 欧美午夜三级| 免费在线亚洲欧美| 99精品网站| 亚洲久久在线| 99国产精品视频免费观看一公开| 久久国产小视频| 久久影院一区二区三区| 日韩网站中文字幕| 在线日韩成人| 精品视频91| 欧美三区不卡| 日本少妇一区二区| 日韩av有码| 中文精品电影| 国产福利91精品一区二区| 欧美色图一区| 久久精品超碰| 亚洲午夜一级| 国产精品亚洲综合在线观看| 免费观看亚洲天堂| 日韩一区二区免费看| 国产精品久久久久久久久免费高清 | 国产不卡一区| 蜜臀久久99精品久久久画质超高清| 日韩二区在线观看| 蜜桃成人av| 日本不卡中文字幕| 久久91导航| 国产精品嫩模av在线| 最新国产拍偷乱拍精品| 久久99国产精品视频| 亚洲小说春色综合另类电影| 日韩免费av| 久久不见久久见中文字幕免费| 亚洲永久字幕| 久久一区二区三区喷水| 久久精品国产精品亚洲毛片| 在线国产精品一区| 亚洲成人av观看| 国产aⅴ精品一区二区三区久久| 午夜一区在线| 日韩精品电影| 久久国产成人午夜av影院宅| 久久久久久自在自线| 国产suv精品一区| 久久精品国产99| 麻豆精品一区二区综合av| 亚州av日韩av| 91精品啪在线观看国产爱臀| 亚洲综合婷婷| 18国产精品| 国产精品国产三级在线观看| 久久国产乱子精品免费女| 日本不卡视频一二三区| 日韩一区二区三免费高清在线观看| 欧美1级日本1级| 免费高潮视频95在线观看网站| 国产一区福利| 99久久亚洲精品蜜臀| 日韩视频一区| 亚洲精品一二| 亚州精品视频| 日韩亚洲精品在线观看| 日韩福利视频导航| 国产亚洲高清在线观看| 久久久精品国产**网站| 国产一区二区精品福利地址| 视频在线在亚洲| 亚洲乱码一区| 日本不卡视频一二三区| 精品视频亚洲| 日韩免费福利视频| 国产高清一区| 日韩不卡一二三区| 播放一区二区| 日本精品另类| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美日韩亚洲一区三区| 超碰99在线| 视频一区二区三区入口| 蜜桃久久久久| 美女久久网站| 国产精品二区影院| 91精品国产成人观看| 日韩不卡免费视频| 日本美女一区| 日韩精品亚洲aⅴ在线影院| 黄色网一区二区| 亚洲一区二区日韩| 秋霞影视一区二区三区| 国产日韩欧美三区| 亚洲欧美日韩在线观看a三区| 国语对白精品一区二区| 日韩亚洲精品在线观看| 亚洲女同中文字幕| 岛国精品一区| 热久久久久久| 久久精品国内一区二区三区水蜜桃| 亚洲精品在线二区| 亚洲最新无码中文字幕久久| 亚洲精品激情| 久久网站免费观看| 国产精品一区二区三区av| 国产精品美女| 亚洲欧美伊人| 久久久国产精品网站| 欧美综合国产| 亚洲精品午夜av福利久久蜜桃| 精品视频在线你懂得| 国产日本精品| 日本特黄久久久高潮| 欧美极品中文字幕| 免费久久精品视频| 1024精品久久久久久久久| 88xx成人免费观看视频库| 日韩综合在线| 欧美三级精品| 欧美成人a交片免费看| 日韩电影免费网址| 色婷婷色综合| 精品久久国产一区| 国产精品亚洲人成在99www| 国产美女久久| 亚洲综合精品| 国产毛片精品| 婷婷视频一区二区三区| 日韩激情网站| 亚洲精品中文字幕99999| 在线视频亚洲欧美中文| 日韩午夜视频在线| 国产精品一区二区美女视频免费看| 欧美日本久久| 国产在线一区不卡| 国产 日韩 欧美一区| 日韩高清在线不卡| 久久伊人国产| 亚洲成人一区在线观看| 国产高清一区二区| 日韩在线电影| 97欧美在线视频| 中文字幕av一区二区三区四区| 亚洲精品成人图区| 午夜久久影院| 欧美亚洲人成在线| 亚洲风情在线资源| 久久国产精品99国产| 国产精品videossex| 久久激情一区| 亚洲精品大片| 精品久久一区| 国产亚洲精品v| 综合视频一区|