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