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