Java常用API(二)String
String --- 代表字符串的類, 是一個最終類,不能被繼承,沒有子類。所有的字符串都是他的對象 。?
字符串是一個常量,定義之后存儲在運行時常量池中且只存儲一份,定義好之后不可改變,一樣字符串是被共享的(同樣 的字符串地址相同)。
String s1 = ?"ab" ? // 在常量池中創(chuàng)建一個"ab"對象,s1 指向"ab"在常量池中的地址
String s2 = new Strin("ab"); ? //此過程產(chǎn)生兩個對象 ; 通過new關(guān)鍵字現(xiàn)在堆內(nèi)存中開辟一塊空間存放"ab"在常量池中的內(nèi)存地址。
String s3 = "a" + "b"; //此時"a" ?和"b" ?是兩個字面量(一般的整數(shù)、小數(shù)、字符串常量)在運算,JVM在編譯時會對這個運算進行優(yōu)化 String ?s3 = "ab";
String ?s4 = "a"; ?s4 +="b"; // 此過程產(chǎn)生了5個對象 ,在底層調(diào)用了StringBuilder的append()方法,底層實現(xiàn) s4 = new StringBuilder("a").append("b").toString();,其中toString()方法底層 是 new String(), ? 執(zhí)行完成之后s4指向了一個新的地址。
所以: s1 = s2; //false ? s1 = s3; //true ? s1 = s4; //false ? s2 = ?s3;//false ?s2 = s4; //false s3 = s4;//false
StringBuilder ?| ?StringBuffer ?兩個類中的方法一模一樣 ?但是StirngBuilder是線程不安全的 ,StringBuffer是線程安全的。
建議: ?"+" 和 append()拼接字符串 : "+"拼接時 每次拼接多產(chǎn)生3個對象 append() 每次拼接時多產(chǎn)生1個對象 , 所以append拼接字符串的效率在空間和時間上都要遠高于"+"。??所以拼接多個字符串建議使用StringBuilder 。
常用方法摘要:
1.charAt()?獲取指定下標上的字符
2.length() ?獲取字符串的長度
練習(xí): 1. 從控制臺輸入一個字符串,判斷是否是回文
2. 輸入一個字符串,統(tǒng)計這個字符串中字母、數(shù)字、即符號的個數(shù)
3. 輸入一個字符串,提取里面的數(shù)字并求和
4. 駛?cè)胍粋€字符串,提取數(shù)字并排序
5. 駛?cè)胍粋€字符串,記錄每個元素出現(xiàn)的次數(shù)
?
public class Demo_01 {public static void main(String[] args) {Scanner s = new Scanner(System.in);System.out.println("請輸入一個字符串");String ss = s.nextLine();s.close();isHuiwen(ss);printNum(ss);printSum(ss);printSortNum(ss);}/*** 判斷一個字符串是不是回文* */public static void isHuiwen(String str ){for(int i=0;i<str.length()/2;i++){if(str.charAt(i) != str.charAt(str.length()-1-i)){System.out.println("不是回文!");return;}}System.out.println("是回文");}/*** 統(tǒng)計字符串中數(shù)字、字母、其他字符的個數(shù)* */public static void printNum(String str ){int a = 0,b = 0,c = 0,d = 0;char[] cc = str.toCharArray();for(int i = 0;i<str.length();i++){if(cc[i]>=48&&cc[i]<=58){a++;}else if(cc[i]>=65&&cc[i]<=(65+26)){b++;}else if(cc[i]>=97&&cc[i]<=(97+26)){c++;}else{d++;}}System.out.println("數(shù)字的個數(shù):"+a);System.out.println("大寫字母的個數(shù):"+b);System.out.println("小寫字母的個數(shù):"+c);System.out.println("其他字符的個數(shù):"+d);}/*** 提取字符串中數(shù)字并求和* */public static void printSum(String str){int a = 0,b = 0;char[] cc = str.toCharArray();for(int i = 0;i<str.length();i++){if(cc[i]>=48&&cc[i]<=58){a+=cc[i]-48;}}System.out.println("字符串中數(shù)字的和:"+a);}/*** 提取字符串例的數(shù)字并排序* */public static void printSortNum(String str){int a = 0,b = 0;char[] cc = str.toCharArray();List<Integer> list = new ArrayList<Integer>();for(int i = 0;i<str.length();i++){if(cc[i]>=48&&cc[i]<=58){a=cc[i]-48;list.add(a);}}int[] iii = new int[list.size()];for(int i = 0;i<list.size() ; i++){iii[i] = list.get(i);}Arrays.sort(iii);System.out.println("字符串中數(shù)字排序后的數(shù)組:"+Arrays.toString(iii));}/*** 記錄字符串中每個元素出現(xiàn)的個數(shù)* */public static void printYuansuNum(String str){int count = 1;char[] cc = str.toCharArray();Arrays.sort(cc);System.out.println(cc);for(int i=0;i<cc.length-1;i++ ){if(cc[i]==cc[i+1]){count ++;}else{//輸出的是上一次比對的結(jié)果System.out.print(cc[i]+"出現(xiàn)了"+count+"次 ; ");count = 1;}}//輸出最后一次比對的結(jié)果System.out.print(cc[cc.length-1]+"出現(xiàn)了"+count+"次 ; ");} /*** 記錄字符串中每個元素出現(xiàn)的個數(shù)* */public static void printYuansuNum2(String str){char[] bs = str.toCharArray();boolean[] bls = new boolean[bs.length];int count = 1;for(int i = 0;i<bs.length;i++){if(!bls[i]){bls[i] = true;for(int j = i+1;j<bs.length;j++){if(bs[i] == bs[j]){count++;bls[j] = true;}}System.out.println(bs[i]+"出現(xiàn)了"+count+"次;");count = 1;}}} }3.comperTo() 按字典順序比較字符串 ?,
底層實現(xiàn): 1. 會把兩個字符串轉(zhuǎn)化為字符數(shù)組2.按位相減3.如果差不是0,則直接返回;如果差是0,下一位繼續(xù)相減4.如果每一位相減都為0,并且一個字符串首先遍歷完了,返回對象字符串與參數(shù)字符串的長度之差
結(jié)果: 0:這倆字符串一致,正數(shù):對象字符串比較大 ,反之參數(shù)字符串比較大
4.ComperToIgnoreCase() 忽略大小寫比較。
5.contact() ?將指定字符串拼接到對象字符串后。
底層實現(xiàn): 1. 將兩個字符串轉(zhuǎn)化為字符數(shù)組str.toCharArray() 2.將兩個字符數(shù)組進行合并System.arrayCopy() 3.將合并后數(shù)組轉(zhuǎn)換為字符串String str = new String(char[]);
6.String( char[] ,offset , count); ??要轉(zhuǎn)換的數(shù)組,偏移量(要開始轉(zhuǎn)換的起始下標),轉(zhuǎn)化的字符個數(shù)
7.contians() ?判斷字符串中是否包含指定的參數(shù)。返回true|false。
8.endsWith() 判斷次字符串是否是指定字符串結(jié)尾。
9.equals() ?判斷兩個字符串值是否相等。底層重寫了Object的equals方法 ?
10.equalsIgnoreCase() 不考慮大小寫比較字符串
toLowerCase() | toHeigherCase() 將所有字符轉(zhuǎn)為小 |大寫
getBytes(編碼) ?將字符串轉(zhuǎn)換為字節(jié)數(shù)組。
編碼:將不同的字符對應(yīng)不同的數(shù)字
碼表:ISO-8859-1 西歐碼表 一個字符存儲一個字節(jié)
GB2312 ?-->GBK 規(guī)定一個字符占兩個字節(jié) ?中國標準碼表 收錄了常見的基本的簡體漢字,以及一部分常見的繁體漢字
Unicode 編碼體系 ???包含utf-8 ???utf-8規(guī)定一個字符占3個字節(jié)
所有的碼表默認兼容西歐編碼 --- ?無論哪個碼表中,英文一個字符永遠占一個字節(jié)。
當沒有指定編碼的時候,會默認使用系統(tǒng)平臺碼。
windows默認GBK ?linux默認utf-8
11.String(byte[],編碼); 將字節(jié)數(shù)組按照指定編碼轉(zhuǎn)換為字符串
12.String(byte[] ,begin,count,編碼); ?將字節(jié)數(shù)組從begin位按照指定編碼轉(zhuǎn)換count個字節(jié)為字符串
練習(xí): 1. 輸入一個字符串和數(shù)字,這數(shù)字表示字節(jié)個數(shù),根據(jù)指定的字節(jié)個數(shù),截取指定的字符串(不能出現(xiàn)半個字符)
/*** 輸入一個字符串和數(shù)字,這數(shù)字表示字節(jié)個數(shù),根據(jù)指定的字節(jié)個數(shù),* 截取指定的字符串(不能出現(xiàn)半個字符)* */public static void print1(){Scanner s = new Scanner(System.in);System.out.println("請輸入一個字符串:");String str = s.nextLine();System.out.println("請輸入一個數(shù)字:");int num = s.nextInt();s.close();byte[] bs = str.getBytes();String str2 = new String(bs ,0 ,num );if(str2.charAt(str2.length()-1) != str.charAt(str2.length()-1)){str2 = new String(bs,0,num-1);}System.out.println(str2);}13.hashCode() ??String中的hashCode()做過重寫---同一個字符串無論是在什么情況下(設(shè)備、環(huán)境),哈希嗎一定一致---保證字符串的唯一性。返回的字符串在常量池中的地址,而不是對象在堆中的地址。
14.isEmpty() ?判斷字符串是不是一個空串 (判斷長度為0) ??
注意: null身上沒有任何的方法和屬性,只要用null區(qū)調(diào)用方法或?qū)傩砸欢〞隹罩羔槷惓!?/span>
15.indexOf(int ch) :獲取指定字符字字符串中第一次出現(xiàn)的下標。找不到則返回-1;找到則返回對應(yīng)位置。
16. indexOf(int ch,int fromIndex) : 獲取指定字符在字符串中從fromInde位置開始第一次出現(xiàn)的下標
練習(xí):獲取指定字符在字符串中出現(xiàn)的所有位置。
/*** 輸入一個字符串,獲取這個字符在字符串中出現(xiàn)的的所有位置。* */public static void getIndexs(String str,String s){int index = -1;for(int i=0;i<str.length();i++){index = str.indexOf(s,i);if(index>=0){System.out.print(index+" ");i = index;}}}17. lastIndexOf(int ch) :獲取指定字符在字符串中最后一次出現(xiàn)的位置。
18. lastIndexOf(int ch ,int fromIndex) : 獲取指定字符在字符串中指定位置之前(不包含)最后一次出現(xiàn)的位置。
19. replace(str,str) : 以第二個參數(shù)替換字符串中第一個參數(shù)的字符。
20. startWith(str) ?: 判斷字符串是否以指定字符串開頭。
21. subString(beginIndex , endIndex) : 按照指定的范圍截取字符串 ?(含左不含右)
22. trim() : 去掉頭部和尾部的空白字符。
23. valueOf(arg): 將參數(shù)轉(zhuǎn)換為字符串格式。 底層實現(xiàn):在打印對象時,調(diào)用其對象的toString() ;但是字符數(shù)組是轉(zhuǎn)換為一個字符串顯示。?
 
 
StringBuilder | StringBuffer
這兩個類中的屬性和方法幾乎一致,stringBuilder是線程不安全的;StringBuffer是線程安全的。
1.append(str) : 拼接字符串。
2. revese(); 反轉(zhuǎn)字符串。
3. spilt(ch) : 以指定字符切割字符串。
總結(jié)
以上是生活随笔為你收集整理的Java常用API(二)String的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Java常用API(一)Object
 - 下一篇: Java常用API(三)Pattern