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