4,字符和字符串類

2020-1-6

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

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

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

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

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

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

//一般不需要考慮

常見編碼

ASCII:標(biāo)準(zhǔn)的單字節(jié)蒸绩,美國碼。

ISO8859-1:單字節(jié)增強(qiáng)碼铃肯,包容ASCII患亿,歐洲碼。

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

GBK:中國規(guī)定步藕,21886個(gè)漢字

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

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

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

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

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

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

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

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

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

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

//...

//例子,砍六填充到8

//0x7231

//0111,0010,0011,0001

//0111,001000,110001,

//11100111,10001000,10110001,

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

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)化搁骑,索引以及查找斧吐,比較以及復(fù)制,拆分仲器,大小寫轉(zhuǎn)化

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

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

? ? //String B = A;

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

StringBuilder://可變不安全字符串類,默認(rèn)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)的,國標(biāo)系文件向上兼容赴精。如果想值轉(zhuǎn)化佩捞,考慮字符映射表

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

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

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

? ? ? ? //舉個(gè)栗子:

? ? ? ? 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文件名谭确×庇可選擇轉(zhuǎn)化為ISO的byte數(shù)組,在轉(zhuǎn)化UTF-8字符串逐哈。缺點(diǎn)每次都要處理芬迄。

?

字符串都保存在常量池中,常量池的位置在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中代表一個(gè)char

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

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

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

//最終測試狞贱,還是使用了char[]來處理。優(yōu)點(diǎn)蜀涨,占用時(shí)間最少瞎嬉,空間使用最少(字符串長度600W,目標(biāo)容器600W和一個(gè)長度4的char數(shù)組)。 ? ?


個(gè)人項(xiàng)目的測試與學(xué)習(xí)

//訪問路徑: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)系作者
  • 序言:七十年代末氧枣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子别垮,更是在濱河造成了極大的恐慌便监,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碳想,死亡現(xiàn)場離奇詭異烧董,居然都是意外死亡毁靶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門解藻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來老充,“玉大人,你說我怎么就攤上這事螟左》茸牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵胶背,是天一觀的道長巷嚣。 經(jīng)常有香客問我,道長钳吟,這世上最難降的妖魔是什么廷粒? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮红且,結(jié)果婚禮上坝茎,老公的妹妹穿的比我還像新娘。我一直安慰自己暇番,他們只是感情好嗤放,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壁酬,像睡著了一般次酌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舆乔,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天岳服,我揣著相機(jī)與錄音,去河邊找鬼希俩。 笑死吊宋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颜武。 我是一名探鬼主播贫母,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盒刚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绿贞,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤因块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后籍铁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涡上,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾断,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吩愧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋酌。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雁佳,靈堂內(nèi)的尸體忽然破棺而出脐帝,到底是詐尸還是另有隱情,我是刑警寧澤糖权,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布堵腹,位于F島的核電站,受9級特大地震影響星澳,放射性物質(zhì)發(fā)生泄漏疚顷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一禁偎、第九天 我趴在偏房一處隱蔽的房頂上張望腿堤。 院中可真熱鬧,春花似錦如暖、人聲如沸笆檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误债。三九已至,卻和暖如春妄迁,著一層夾襖步出監(jiān)牢的瞬間寝蹈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工登淘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箫老,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓黔州,卻偏偏與公主長得像耍鬓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子流妻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 字符集和編碼簡介 在編程中常成瘢可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集绅这。確切的說...
    蘭山小亭閱讀 8,514評論 0 13
  • 字符串和字符 甲串是一系列字符涣达,如的"hello, world"或"albatross"。Swift字符串由Str...
    Fuuqiu閱讀 1,040評論 0 0
  • 字符串和字符 [TOC] 字符串是例如 "hello, world" , "albatross" 這樣的有序的 C...
    伍哥___閱讀 1,098評論 0 0
  • 用心對待寶物:服裝儀容 如果打算從事優(yōu)質(zhì)的工作度苔,想學(xué)到優(yōu)質(zhì)的事物匆篓,更要打理好自己的外在服裝儀容。 在服裝儀容上的用...
    麥子整理師閱讀 169評論 0 0
  • 默認(rèn)情況下寇窑,容器沒有資源限制鸦概,可以使用主機(jī)內(nèi)核調(diào)度程序允許的盡可能多的給定資源。 Memory 內(nèi)存風(fēng)險(xiǎn) 不允許容...
    Anoyi閱讀 4,252評論 1 11