------<a target="blank">java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------
String類
(一). 認識String
字符串是一個特殊的對象,一旦初始化就不可改變。
有兩種方式定義一個字符串對象:
(1)String str = “abc”; //它在執行時是在字符串常量池中創建一個對象,并把地址賦給引用型變量
(2)String str1 = new String("abc");//它在執行時是在堆內存中,創建了兩個對象,用new方式創建了一個字符串對象;緊接著在構造時,又接收了一個字符串對象。
String s = new String();//等效于String s = “”; //不等效于String s = null; 因為前兩者都是創建了一個空的字符串,最后一個是常量值空
特別注意兩者的區別:
雖然str、str1的值都為“abc”,但是其引用地址是不一樣的。所以str不等于str1,但是如果定義String str2 = “abc”;這時如果將str2與str比較,兩者是等同的,因為
當在字符串常量池中創建對象時,會先查找該常量池中是否存在該內容,如果存在就直接把引用地址賦給變量,如果池中不存在才新建一個。
1.1 String功能
(1)獲取(牢記)
實踐見真知
1 public class StringDemo { 2 public static void main(String[] args){ 3 StringPRacticeDemo(); 4 } 5 public static void StringPracticeDemo() { 6 String s = "abcdefeagkl"; 7 System.out.println("length:"+s.length());//10 8 System.out.println("At:"+s.charAt(4));//e 9 System.out.println("indexOf:"+s.indexOf('k'));//810 System.out.println("indexOf:"+s.indexOf('m') );//11 //indexOf有兩個作用,1是索引位置,2是判斷存在,如果不存在就返回-1,我們可以通過返回值來判斷該字符存在不存在12 System.out.println("lastIndexOf:"+s.lastIndexOf('a'));//713 System.out.println("indexOf str:"+s.indexOf("def"));//314 System.out.println("lastIndex str:"+s.lastIndexOf("eag"));//615 16 //獲取子串17 System.out.println("substring:"+s.substring(6));18 //包含開始,不包含結尾 該子字符串從指定的 beginIndex 處開始,直到索引 endIndex - 1 處的字符19 System.out.println("substring:"+s.substring(6,9)); 20 }21 }
(2)轉換
實踐見真知
1 public class StringDemo { 2 public static void main(String[] args){ 3 StringPracticeDemo1(); 4 } 5 public static void StringPracticeDemo1() { 6 //字符串切割 7 String str = "張三,李四,王五"; 8 String[] names = str.split(","); 9 for(String name : names){10 System.out.println(name);11 }12 //字符串轉字符數組13 String str1 = "abcdef";14 char[] ch = str1.toCharArray();15 for(int i=0;i<ch.length;i++){16 if(i<ch.length-1){17 System.out.print(ch[i]+",");18 }else{19 System.out.println(ch[i]);//a,b,c,d,e,f20 } 21 }22 //字符串轉字節數組23 byte[] by = str1.getBytes();24 for(int i=0;i<by.length;i++){25 if(i<by.length-1){26 System.out.print(by[i]+",");27 }else{28 System.out.println(by[i]);//97,98,99,100,101,10229 } 30 }31 //字符串大小寫轉換32 System.out.println(str1.toUpperCase());//ABCDEF33 System.out.println("AVBCD".toLowerCase());//avbcd34 //字符串連接35 String str2 = str1.concat("abc");36 System.out.println(str2);//abcdefabc37 //字符串替換38 String str3 = str2.replace("abc", "cba");39 // String str3 = str2.replace("abd", "cba");//abcdefabc如果找不到則返回原串40 System.out.println(str3);41 //去除字符串兩端空格42 String str4 = " -abc d- ";43 System.out.println(str4.trim());//-abc d-44 //將基本數據類型轉換為字符串45 int c = 5+1;46 String b = "";47 System.out.println("b="+b.valueOf(c));//b=648 }49 }
(3)判斷
實踐見真知
1 public class StringDemo { 2 public static void main(String[] args){ 3 StringPracticeDemo2(); 4 } 5 public static void StringPracticeDemo2() { 6 //比較,忽略大小寫比較 7 String s1 = "abc"; 8 String s2 = "ABC"; 9 System.out.println(s1.equals(s2));//false10 System.out.println(s1.equalsIgnoreCase(s2));//true11 12 //是否包含某個字符串13 String s3 = "abcdfaf";14 System.out.println(s3.contains("cdfe"));//false15 16 //是否以指定字符串開始,已制定字符串結尾17 String s4="Hello.java";18 System.out.println(s4.startsWith("Hel"));//true19 System.out.println(s4.endsWith(".java"));//true20 }21
(4)比較
0;如果此字符串按字典順序小于字符串參數,則返回一個小于 0 的值;如果此字符串按字典順序大于字符串參數,則返回一個大于 0 的值。實踐見真知
1 public class StringDemo { 2 public static void main(String[] args){ 3 StringPracticeDemo3(); 4 } 5 public static void StringPracticeDemo3() { 6 String s6 = new String("alsjf"); 7 String s7 = "asvsd"; 8 System.out.println(s6.compareTo(s7));//-7 s6小于s7 9 10 String s8 = s6.intern();11 System.out.println(s6==s8);//false 是因為intern方法是從字符串池中創建,而s6是在堆內存中12 }
(二). StringBuffer字符串緩沖區(可變長度數組)
2.1 StringBuffer特點
2.2 StringBuffer功能
2.2.1 添加功能
實踐見真知
1 public class StringBufferDemo { 2 public static void main(String[] args) { 3 StringBuffer sb = new StringBuffer(); 4 //添加功能 5 sb.append(9+"11").append("nihao");//添加鏈 6 sb.append(true); 7 System.out.println(sb);//911nihaotrue 8 //插入功能 9 sb.insert(3, "hehe");10 System.out.println(sb);//411hehenihaotrue11 }12 }
2.2.2 刪除功能
實踐見真知
1 public class StringBufferDemo { 2 public static void main(String[] args) { 3 Demo_2(); 4 } 5 public static void Demo_2() { 6 StringBuffer sb = new StringBuffer(); 7 sb.append("abcdefgh"); 8 sb.deleteCharAt(3);//刪除指定位置上的字符 9 System.out.println(sb);//abcefgh10 sb.delete(2, 5);//刪除包含頭元素,不包含尾元素11 System.out.println(sb);//abgh12 sb.delete(0, sb.length());//該方法是清空緩沖區13 System.out.println(sb.length());//014 }15 }
2.2.3 查找功能(與string的獲取功能類似)
實踐見真知
1 public class StringBufferDemo { 2 public static void main(String[] args) { 3 Demo_3(); 4 } 5 public static void Demo_3() { 6 StringBuffer sb = new StringBuffer(); 7 sb.append("abcdefg"); 8 char ch = sb.charAt(3);//返回字符串上某個位置的元素 9 System.out.println(ch);//d10 11 int i = sb.indexOf("cde");//返回子串在主串上的位置12 System.out.println(i);//213 14 int j = sb.lastIndexOf("de");15 System.out.println(j);//316 17 int x = sb.indexOf("ef", 3);//從指定位置上查找子串所在位置18 System.out.println(x);//419 }20 }
2.2.4 修改功能
實踐見真知
1 public class StringBufferDemo { 2 public static void main(String[] args) { 3 Demo_4(); 4 } 5 public static void Demo_4() { 6 StringBuffer sb = new StringBuffer(); 7 sb.append("abcdefg"); 8 sb.replace(1, 4, "123");//包含開頭元素,不包含結尾 9 System.out.println(sb);//a123efg10 // sb.replace(0, sb.length(), "");//這就相當于清空緩沖區11 // System.out.println(sb.length());//012 13 sb.setCharAt(5, 'x');//在指定位置上插入某個字符14 System.out.println(sb);//a123exg15 }16 }
2.2.5 額外功能
實踐見真知
1 public class StringBufferDemo { 2 public static void main(String[] args) { 3 Demo_5(); 4 } 5 public static void Demo_5() { 6 StringBuffer sb = new StringBuffer(); 7 sb.append("abcdefg"); 8 //字符串反轉 9 sb.reverse();10 System.out.println(sb);//gfedcba11 //設置字符串長度,當設置為0時,相當于清空緩沖區12 sb.setLength(0);13 System.out.println(sb.length());//014 }15 }
2.2.6 構造方法StringBuffer()與StringBuffer(int capacity)的區別
StringBuffer()構造方法,是構造一個不帶字符串的字符串緩沖區,初始容量為16個字符。當超過該容量時,可繼續增加容量。而StringBuffer(int capacity)是構造一個固定長度的字符串緩沖區,但是當超過該固定容量時,依然可以繼續擴展容量。二者的區別在于效率方面。當已知自己有35個字符的數據時,直接創建StringBuffer(40),效率更高。否則如果使用StringBuffer()創建,當發現容量不足時,還要繼續創建,將會降低效率。
2.2.7 StringBuilder
從jdk1.5才開始出現StringBuilder,不保證同步,線程不安全,但是效率高,單線程時優先考慮使用StringBuilder
(三). StringBuffer與StringBuilder的區別
相同點:兩者功能相同,使用方法相同
不同點:jdk1.0開始出現StringBuffer,線程安全,同步,多用于多線程
jdk1.5以后出現了和StringBuffer功能一樣的StringBuilder,不保證同步,線程不安全,但是效率高,通常用于單線程
StringBuilder的出現是為了解決StringBuffer在處理單線程時效率慢問題,提高緩沖區的效率而出現的。
對比數組與StringBuffer或StringBuilder緩沖區:
1 public class StingBuilderDemo { 2 /** 3 * 需求:將一個int數組變成字符串 ,分別用數組、緩沖區方式 輸出 4 * 對比使用數組與使用緩沖區的區別 5 * @param args 6 */ 7 public static void main(String[] args) { 8 int[] arr = {2,5,8,33,23,6}; 9 // ShowArr(arr);10 String s = StringBuilderDemo(arr);11 System.out.println(s);12 }13 //使用緩沖區方式14 public static String StringBuilderDemo(int[] arr) {15 StringBuilder sb = new StringBuilder();16 System.out.print("{");17 for (int i = 0; i < arr.length; i++) {18 if(i!=arr.length-1){19 sb.append(arr[i]+",");20 }else{21 sb.append(arr[i]+"}");22 }23 }24 return sb.toString(); 25 }26 27 //使用數組方式28 public static void ShowArr(int[] arr) {29 System.out.print("{");30 for (int i = 0; i < arr.length; i++) {31 if(i!=arr.length-1){32 System.out.print(arr[i]+",");33 }else{34 System.out.println(arr[i]+"}");35 }36 } 37 }38 39
結論:使用數組方式輸出時,每遍歷一次,連接一次“,” 如:( System.out.print(arr[i]+",");)就會在字符串常量池中產生一個常量,當全部輸出字符串時會在常量池中產生n多個常量。而使用StringBuffer或StringBuilder的方式,不斷的往數組中裝,最后只返回一個字符串。
(四). 實踐見真知
實踐一
1 package com.itsuper.p3.String; 2 3 public class Practice1 { 4 5 /** 6 * 將字符串數組按照字典順序進行排序 7 * "nba","abc","cba","zz","QQ","haha" 8 * @param args 9 */10 public static void main(String[] args) {11 String[] arr = {"nba","abc","cba","zz","qq","haha"};12 printArray(arr);13 sortArray(arr);14 printArray(arr);15 }16 17 public static void sortArray(String[] arr) {18 for (int i = 0; i < arr.length-1; i++) {19 for (int j = i+1; j < arr.length; j++) {20 if((arr[i].compareTo(arr[j])>0)){21 swap(arr,i,j);22 }23 }24 }25 }26 //交換功能27 private static void swap(String[] arr, int i, int j) {28 String temp = arr[j];29 arr[j] = arr[i];30 arr[i] = temp;31 }32 33 //打印功能34 public static void printArray(String[] arr) {35 for(int i=0;i<arr.length;i++){36 if(i!=arr.length-1){37 System.out.print(arr[i]+",");38 }else{39 System.out.println(arr[i]);40 }41 }42 43 }44 45 }
實踐二
1 package com.itsuper.p3.String; 2 3 public class Practice2 { 4 5 /** 6 * 查找子串nba在字符串中出現的次數 7 * asnbadfjanbaljdgnbasjgljljnbassdfa 8 * @param args 9 * @return 10 */11 12 public static void main(String[] args) {13 /*14 * 分析:15 * 次數:計數器16 * 找nba,得有包含contains,先判斷是否有nba,如果有則繼續,如果沒有則為017 * 首先找到nba出現位置,找到后計數1次;然后取剩余的子串,在找nba出現的位置,在計數一次;再取剩余子串,依次類推18 * 得用到循環19 */20 String str = "asnbadfjaljdgnbasjgljljnbassdfa";21 String key = "nba";22 int count = getStringKeyCount(str,key);23 System.out.println("key-count:" + count );24 }25 26 public static int getStringKeyCount(String str, String key) {27 int count = 0;28 if(!str.contains(key)){29 System.out.println("nba出現次數:"+count);30 }else{31 while(str.contains(key)){32 //首先索引到第一次nba出現位置33 int first = str.indexOf(key);//234 count++;35 //找到下一次nba出現的位置36 str = str.substring(first+key.length());37 System.out.println(str);38 }39 // System.out.println("key出現次數:"+count);40 }41 return count;42 }43 44 }
實踐三
1 package com.itsuper.p3.String; 2 3 public class Pratice3 { 4 5 /** 6 * 判斷兩個字符串中的最大相同子串。 abcefgkvcdejflsndlssdf、mendkgkvcdejfieksel 7 * 8 * @param args 9 */10 11 /*12 * 分析: 先拿短的字符串去看大串中是否包含,如果含有,則最大相同子串就是短的字符串13 * 如果不含有,就將子串一次遞減的方式,去放到長傳中去看是否包含,知道找到最大子串14 * 15 * 需要用到for循環16 */17 public static void main(String[] args) {18 String str1 = "abcefgkvcdejflsndlssdfdfa";19 String str2 = "mendkgkvcdejfieksel";20 String maxSubstr = FoundMaxSubstring(str1, str2);21 System.out.println("最大相同子串:" + maxSubstr);22 23 }24 25 public static String FoundMaxSubstring(String str1, String str2) { 26 //如何知道str1、str2哪一個是大的串,哪一個是小的串呢?需要判斷27 String max = null;28 String min = null;29 max = (str1.length()>str2.length())?str1:str2;30 min = (max.equals(str1))?str2:str1;31 System.out.println("max="+max);32 System.out.println("min="+min);33 //兩層for循環很值得好好研究34 for (int x = 0; x < str2.length(); x++) {35 for (int y = 0, z = str2.length() - x; z != str2.length() + 1; y++, z++) {36 String sub = str2.substring(y, z);37 if (str1.contains(sub))38 return sub;39 }40 }41 // 如果沒有,直接返回空42 return null;43 }44 45 }
實踐四
1 package com.itsuper.p3.String; 2 3 public class Practive4 { 4 5 /** 6 * 模擬trim功能一致的方法 7 * 實際是去除字符串兩端的空白 8 * @param args 9 */10 public static void main(String[] args) {11 String str = " abc dmef mdk ";12 str = myTrim(str);13 System.out.println("去除空格后的字符串:" + "--" + str + "---");14 }15 public static String myTrim(String str) {16 int startIndex = 0;17 int endIndex = str.length()-1;18 //判斷是否是字符,反過來就是判斷是否是空格,從頭開始判斷19 while(startIndex < endIndex && (str.charAt(startIndex)) == ' ' ){20 startIndex++;21 }22 while(startIndex < endIndex && (str.charAt(endIndex)) == ' '){23 endIndex--;24 }25 str = str.substring(startIndex, endIndex);26 return str;27 }28 29 }
新聞熱點
疑難解答