4,字符和字符串類

2020-1-6

計算機排列字節(jié)的方式有大端法(BE)和小端法(LE),數(shù)據(jù)的加載從地址的低到高,順序加載。

計算機排列字節(jié)的方式有大端法(BE)和小端法(LE),數(shù)據(jù)的加載從地址的低到高,順序加載。

//存儲的數(shù)據(jù)為0xABCDEF...

//存儲地址有0x100,0x101,0x102...

//大端法對應(yīng)存儲AB,CD,EF...每次順序拿地址,左右拼接起來。

//小端法對應(yīng)存儲...,EF,CD,AB,每次拿一個都會追加到前邊。

//一般不需要考慮

常見編碼

ASCII:標準的單字節(jié),美國碼。

ISO8859-1:單字節(jié)增強碼,包容ASCII,歐洲碼。

GB2312:中國規(guī)定,6763個通用漢字

GBK:中國規(guī)定,21886個漢字

GB18030:中國規(guī)定,70,244個漢字,向上兼容

Unicode:萬國碼,范圍0x0~0xFFFF,是一種規(guī)定,保存方式由UTF-8,UTF-16,UTF-32來實現(xiàn)。

? ? \u7231:視為Unicode字符,對應(yīng)中文"愛"=U+7231,

? ? 爱:也視為Unicode字符,有分號結(jié)尾

UTF-32:直接保存這16進制編號地址為二進制數(shù)。

UTF-16:U+0000~U+FFFF的范圍用兩個字節(jié),剩下的用四個字節(jié)

UTF-8:可變字節(jié)。

0x00~0x7F,單字節(jié)范圍對應(yīng)ASCII,0XXXXXX

0x80~0x7FF,兩個字節(jié),110XXXXX,10XXXXXX

0x800~0x7FFF,三個字節(jié),1110XXX,10XXXXXX,10XXXXXX

//...

//例子,砍六填充到8

//0x7231

//0111,0010,0011,0001

//0111,001000,110001,

//11100111,10001000,10110001,

URL編碼:URL只支持字母數(shù)字特殊符號以及一些保留字,不包括雙引號,要使用Base64進行編碼處理。

java中char使用的unicode編碼來存儲。


Charset.availableCharsets().keySet();//獲取java支持的所有編碼

StandardCharsets.UTF_8//獲取UTF-8等常用的靜態(tài)字符串,jdk1.6以及以下是沒有的

字符串類:本質(zhì)上用char數(shù)組來保存數(shù)據(jù),打印出來是雙引號包裹的字符串。


String://final修飾,處理都是重新賦值新的字符串,構(gòu)建以及轉(zhuǎn)化,索引以及查找,比較以及復制,拆分,大小寫轉(zhuǎn)化

? ? //String是引用傳遞,但值不可以改。

? ? //String A ="1";引用傳向?qū)ο驜,再修改B的值,d

? ? //String B = A;

? ? //String B =B+"2";//其中操作是常量池創(chuàng)建新字符串"12"再修改B的引用。A的引用還是指向"1"

StringBuilder://可變不安全字符串類,默認char數(shù)組長度16,

? ? //追加,//插入,長度,索引,翻轉(zhuǎn),截取,替換等功能 ? ?

StringBuffered://可變安全字符串類,是底層安全的StringBuilder對象

//方法和StringBuider一樣

//三者的優(yōu)選方式:StringBuider最優(yōu)先,線程安全考慮StringBuffered,簡易使用則用String

字符串之間的比較:


//常量池保存唯一的字符串(沒有則創(chuàng)建),并返回引用。對字符串的操作都返回新增字符串的地址。

Stringa="1";//a的值為常量池地址,

Stringb=newString("1");//b的值為堆地址

Stringc=String.valueOf(a);//繼承,a.toString返回的a對象引用。

//==比較引用指向的地址位置。上邊堆地址值肯定不等于常量池地址值。

//equals比較的是字符串的內(nèi)容。

Stringstr="a"+"b";//編譯后,String str = "ab";

finalStringa="a";

Stringb=a+"b";//結(jié)果,b =="ab";

Stringc=(newStringBuilder()).append(a).append(b).toString();//String c = a+b;jdk8的編譯器自動優(yōu)化

大批量的字符串拼接效率:


+? //字符串拼接

concat? //String對象的concat方法

StringUtils.join(Object[]objs)//apache.commons的字符串拼接方法,就是用的StringBuilder拼接并且返回String

StringBuffer.append()?

StringBuilder.append()

//StringBuilder>StringBuffer>String對象.concat>+ ? ? ? ? ? ?

字符串轉(zhuǎn)化:


//java內(nèi)所有的字符串都是unicode字符串。

//ISO-8859-1單字節(jié)文件,可以直接轉(zhuǎn)化為unicode和gbk等,常見的全英文文件不受編碼影響。

//非單字節(jié)文件,必須用對應(yīng)的編碼保存,不然變?nèi)珌y碼文件。

//不同的非單字的字節(jié)編號對應(yīng)的值都不同,GB18030在UTF-8的是不對應(yīng)的,國標系文件向上兼容。如果想值轉(zhuǎn)化,考慮字符映射表

//字符串的本質(zhì)就是byte[],大部分不同的數(shù)據(jù)類型是可以轉(zhuǎn)化的,轉(zhuǎn)化UTF系列是不可逆的。

"".getBytes(encoding);//獲取指定編碼的字符串,不傳編碼就拿本地編碼

newString(byte[],encoding);//byte[]轉(zhuǎn)化為字符串

? ? ? ? //舉個栗子:

? ? ? ? byte[]bytes="我愛你".getBytes(GBK);

? ? ? ? System.out.println("-----轉(zhuǎn)化為IBM855和轉(zhuǎn)回GBK");

? ? ? ? Strings1=newString(bytes,"IBM855");

? ? ? ? Strings2=newString(s1.getBytes("IBM855"),GBK);

? ? ? ? System.out.println(s2);

? ? ? ? System.out.println("-----轉(zhuǎn)化為ISO-8859-1和轉(zhuǎn)回GBK");

? ? ? ? s1=newString(bytes,"ISO-8859-1");

? ? ? ? s2=newString(s1.getBytes("ISO-8859-1"),GBK);

? ? ? ? System.out.println(s2);

? ? ? ? System.out.println("-----轉(zhuǎn)化為UTF-8和轉(zhuǎn)回GBK");

? ? ? ? s1=newString(bytes,"UTF-8");

? ? ? ? s2=newString(s1.getBytes("UTF-8"),GBK);

? ? ? ? System.out.println(s2);

//web服務(wù)接收的參數(shù)就是亂碼,一般是直接過濾器過濾掉非UTF-8編碼的請求。

//文件上傳功能傳遞文件名亂碼,tomcat會自動用ISO-8859-1轉(zhuǎn)化為String文件名??蛇x擇轉(zhuǎn)化為ISO的byte數(shù)組,在轉(zhuǎn)化UTF-8字符串。缺點每次都要處理。

?

字符串都保存在常量池中,常量池的位置在jdk1.6,1.7,1.8的位置不同。


java.lang.OutOfMemoryError:PermGenspace//永久代內(nèi)存不足,jdk1.6永久代放在堆外

java.lang.OutOfMemoryError:Javaheapspace//堆內(nèi)存不足,jdk1.7永久代放在堆中

java.lang.OutOfMemoryError:Metaspace//元空間內(nèi)存不足,jdk1.8永久代取消,被元空間替換,本地內(nèi)存中

Unicode字符串的處理與優(yōu)化:


chara='\uabcd'? ? //在java中代表一個char

Stringb="\\uabcd"http://unicode字符串固定長度6 ? ?

Stringc="ꯍ"http://unicode字符串固定長度8

//測試中,使用了subString(很低),new StringBuilder,StringBuilder替換指定位置,和char數(shù)組。Pattern類(性能低,在600W字節(jié)的測試數(shù)據(jù)中,一秒處理100個左右), ?

//最終測試,還是使用了char[]來處理。優(yōu)點,占用時間最少,空間使用最少(字符串長度600W,目標容器600W和一個長度4的char數(shù)組)。 ? ?


個人項目的測試與學習

//訪問路徑:https://github.com/JunOneWolf/test2learn

字符串和unicode的處理:cn.jof.test2020_1_15_testUnicode

//字符串拼接性能檢測:cn.jof.test2020_1_16_testStringConcat。

//檢測文件的編碼工具類:cn.jof.utils.EncodingDetect

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 9,091評論 0 13
  • 字符串和字符 甲串是一系列字符,如的"hello, world"或"albatross"。Swift字符串由Str...
    Fuuqiu閱讀 1,089評論 0 0
  • 字符串和字符 [TOC] 字符串是例如 "hello, world" , "albatross" 這樣的有序的 C...
    伍哥___閱讀 1,164評論 0 0
  • 用心對待寶物:服裝儀容 如果打算從事優(yōu)質(zhì)的工作,想學到優(yōu)質(zhì)的事物,更要打理好自己的外在服裝儀容。 在服裝儀容上的用...
    麥子整理師閱讀 221評論 0 0
  • 默認情況下,容器沒有資源限制,可以使用主機內(nèi)核調(diào)度程序允許的盡可能多的給定資源。 Memory 內(nèi)存風險 不允許容...
    Anoyi閱讀 4,400評論 1 11

友情鏈接更多精彩內(nèi)容