天天看點

黑馬程式員--字元串以及字元串緩沖區

字元串以及字元串緩沖區

String字元串:★★★

java中用String類進行描述。對字元串進行了對象的封裝。這樣的好處是可以對字元串這種常見資料進行友善的操作。對象封裝後,可以定義N多屬性和行為。

如何定義字元串對象呢?String s = "abc";隻要是雙引号引起的資料都是字元串對象。

特點:字元串一旦被初始化,就不可以被改變,存放在方法區中的常量池中。

------------------------------------------------------

String s1 = "abc"; // s1指向的記憶體中隻有一個對象abc。

String s2 = new String("abc"); // s2指向的内容中有兩個對象abc、new 。

System.out.println(s1==s2);//false

System.out.println(s1.equals(s2));//true ,字元串中equals比較的是字元串内容是否相同。

-------------------------------------------------------

字元串的方法:

1:構造方法:将位元組數組或者字元數組轉成字元串。

String s1 = new String();//建立了一個空内容的字元串。 

String s2 = null;//s2沒有任何對象指向,是一個null常量值。

String s3 = "";//s3指向一個具體的字元串對象,隻不過這個字元串中沒有内容。

//一般在定義字元串時,不用new。

String s4 = new String("abc");

String s5 = "abc"; 一般用此寫法

new String(char[]);//将字元數組轉成字元串。

new String(char[],offset,count);//将字元數組中的一部分轉成字元串。

2:一般方法:

按照面向對象的思想:

2.1 擷取:

2.1.1:擷取字元串的長度。length();

2.1.2:指定位置的字元。char charAt(int index);

2.1.3:擷取指定字元的位置。如果不存在傳回-1,是以可以通過傳回值-1來判斷某一個字元不存在的情況。

int indexOf(int ch);//傳回第一次找到的字元角标

int indexOf(int ch,int fromIndex); //傳回從指定位置開始第一次找到的角标

int indexOf(String str); //傳回第一次找到的字元串角标

int indexOf(String str,int fromIndex);

int lastIndexOf(int ch);

int lastIndexOf(int ch,int fromIndex);

int lastIndexOf(String str);

int lastIndexOf(String str,int fromIndex);

2.1.4:擷取子串。

String substring(int start);//從start位開始,到length()-1為止.

String substring(int start,int end);//從start開始到end為止。//包含start位,不包含end位。

substring(0,str.length());//擷取整串

2.2 判斷:

2.2.1:字元串中包含指定的字元串嗎?

boolean contains(String substring);

2.2.2:字元串是否以指定字元串開頭啊?

boolean startsWith(string);

2.2.3:字元串是否以指定字元串結尾啊?

boolean endsWith(string);

2.2.4:判斷字元串是否相同

boolean equals(string);//覆寫了Object中的方法,判斷字元串内容是否相同。

2.2.5:判斷字元串内容是否相同,忽略大小寫。

boolean equalsIgnoreCase(string) ;

2.3 轉換:

2.3.1:通過構造函數可以将字元數組或者位元組數組轉成字元串。

2.3.2:可以通過字元串中的靜态方法,将字元數組轉成字元串。

static String copyValueOf(char[] );

static String copyValueOf(char[],int offset,int count);

static String valueOf(char[]);

static String valueOf(char[],int offset,int count);

2.3.3:将基本資料類型或者對象轉成字元串。

static String valueOf(char);

static String valueOf(boolean);

static String valueOf(double);

static String valueOf(float);

static String valueOf(int);

static String valueOf(long);

static String valueOf(Object);

2.3.4:将字元串轉成大小寫。

String toLowerCase();

String toUpperCase();

2.3.5:将字元串轉成數組。

char[] toCharArray();//轉成字元數組。

byte[] getBytes();//可以加入編碼表。轉成位元組數組。

2.3.6:将字元串轉成字元串數組。切割方法。

String[] split(分割的規則-字元串);

2.3.7:将字元串進行内容替換。注意:修改後變成新字元串,并不是将原字元串直接修改。

String replace(oldChar,newChar);

String replace(oldstring,newstring);

2.3.8: String concat(string); //對字元串進行追加。

String trim();//去除字元串兩端的空格

int compareTo();//如果參數字元串等于此字元串,則傳回值 0;如果此字元串按字典順序小于字元串參數,則傳回一個小于 0 的值;如果此字元串按字典順序大于字元串參數,則傳回一個大于 0 的值。

例子:

[java]  view plain copy print ?

  1. package pack;  
  2. // String類時用于描述字元串事物。  
  3. // 那麼他就提供了多個方法對字元串進行操作。  
  4. // 常見的操作有哪些?“abcd”  
  5. // 1,擷取。  
  6. //  1.1:字元串中包含的字元數,也就是字元串的長度。  
  7. //      int length:擷取長度。  
  8. //  1.2:根據位置擷取位置上的某個字元。  
  9. //      char charAt(int index);擷取某一位置上的字元。  
  10. //  1.3:根據字元擷取該字元在字元串中的位置。  
  11. //      int indexOf(int ch);傳回的是ch在字元串中第一次出現的位置。  
  12. //      int indesOf(int ch,int fromIndex);從fromIndex指定位置開始,擷取ch在字元串中出現的位置。  
  13. //      int indexOf(String str);傳回的是str在字元串中第一次出現的位置。  
  14. //      int indesOf(String str,int fromIndex);從fromIndex指定位置開始,擷取str在字元串中出現的位置。   
  15. //        
  16. //      int lastIndexOf(int ch);反向索引。  
  17. // 2,判斷。  
  18. //  2.1:字元串中是否包含某一個子串。  
  19. //      boolean contains(str);判斷字元串是否存在,判斷字元串是否包含。  
  20. //      特殊之處:indexOf(str);可以索引str第一次出現的位置,如果傳回-1,表示該str不再字元串中存在。  
  21. //      是以,也可以使用對指定判斷是否包含。  
  22. //      if(str.indexOf("aa"!=-1));而且該方法既可以判斷,又可以擷取出現的位置。  
  23. //  2.2:字元串中是否有内容。  
  24. //      boolean isEmpty();原理就是判斷長度是否為0。  
  25. //  2.3:字元串是否是以指定内容開頭。  
  26. //      boolean startsWith(str);  
  27. //  2.4:字元串是否是以指定内容結尾。  
  28. //      boolean endsWith(str);  
  29. //  2.5:判斷字元串内容是否相同。複寫了Object類中的equals方法。  
  30. //      booleam equals(str);  
  31. //  2.6:判斷内容是否相同,并忽略大小寫。  
  32. //      boolean equalsIgnoreCase();  
  33. // 3,轉換。  
  34. //  3.1:将字元數組轉成字元串。  
  35. //      構造函數:String(char[])  
  36. //                String(char[],offset,count):将字元數組中的一部分轉成字元串。  
  37. //      靜态方法:  
  38. //              static String copyValueOf(char[]);  
  39. //              static String copyValueOf(char[] data,int offset,int count);  
  40. //              static String valueOf(char[]);  
  41. //  3.2:将字元串轉成字元數組。**  
  42. //      char[] toCharArray();  
  43. //  3.3:将位元組數組轉成字元串。  
  44. //      String(byte[]);  
  45. //      String(byte[],offset,count);将位元組數組中的一部分轉成字元串。  
  46. //  3.4:将字元串轉成位元組數組。  
  47. //      byte[] getBytes();  
  48. //  3.5:将基本資料類型轉換成字元串。  
  49. //      static String valueOf(int);  
  50. //      static String valueOf(double);  
  51. //      3+"";//String.valueOf(3);  
  52. //  特殊:字元串和位元組數組在轉換過程中,是可以指定編碼表的。  
  53. // 4,替換。  
  54. //  String replace(dchar,newchar);  
  55. // 5,切割。  
  56. //  String[] split(regex);  
  57. // 6,字串。擷取字元串中的一部分。  
  58. //  String substring(begin);  
  59. //  String substring(begin,end);  
  60. // 7,轉換,去除空格,比較。  
  61. //  7.1:将字元串轉成大寫或者小寫。  
  62. //      String toUpperCase();  
  63. //      String toLowerCase();  
  64. //  7.2:将字元串兩端的多個空格去除。  
  65. //      String trim();  
  66. //  7.3:對兩個字元串進行自然順序的比較。  
  67. //      int compareTo(string);  
  68. class StringMethodDemo{  
  69.     public static void sop(Object obj){  
  70.         System.out.println(obj);  
  71.     }  
  72.     public static void main(String[] args){  
  73.     }  
  74.     public static void method_get(){  
  75.         String s="abcdefg";  
  76.         sop(s.length());// 列印長度  
  77.         sop(s.charAt(2));// 根據索引擷取字元。  
  78.         // 當通路到字元串中不存在的角标時,  
  79.         // 會發生StringIndexOutOfBoundsException:字元串角标越界異常。  
  80.         sop(s.indexOf("a"));//根據字元擷取索引。如果沒有找到,傳回-1.  
  81.         sop(s.lastIndexOf("a"));// 反向索引一個字元出現的位置。角标不被反向。是以列印的還是0角标  
  82.     }  
  83.     public static void method_is(){  
  84.         String s="ArrayTool.java";  
  85.         sop(s.startsWith("Array"));// 判斷檔案名稱是否是Array單詞開頭。  
  86.         sop(s.contains("Tool"));// 判斷檔案名中是否包含Tool。  
  87.         sop(s.endsWith(".java"));// 判斷檔案名稱是否是.java的檔案。  
  88.     }  
  89.     public static void method_trans(){  
  90.         char[] arr={'a','b','c','d','e'};  
  91.         String s=new String(arr,1,3);// 将位元組數組中的一部分轉成字元串。  
  92.         sop("s="+s);  
  93.         String s1="abcdefg";  
  94.         char[] chs=s1.toCharArray();// 将字元串轉成位元組數組。  
  95.         for(int x=0; x<chs.length; x++){  
  96.             sop(chs[x]);  
  97.         }  
  98.     }  
  99.     public static void method_replace(){  
  100.         String s="Hello JAVA";  
  101.         String s1=s.replace("a","b");// 如果要替換的字元不存在,傳回的還是原字元串。  
  102.         sop(s);sop(s1);  
  103.     }  
  104.     public static void method_7(){  
  105.         String s="  Hello JAVA  ";  
  106.         sop(s.toUpperCase());// 将字元串轉成大寫。  
  107.         sop(s.toLowerCase());// 将字元串轉成小寫。  
  108.         sop(s.trim());// 去除字元串兩端的空格。  
  109.         String s1="aaa";  
  110.         String s2="abc";  
  111.         sop(s.compareTo(s2));// 對字元串進行比較排序。  
  112.     }  
  113. }  

練習1:

[java]  view plain copy print ?

  1. package pack;  
  2. // 1,模拟一個trim方法,去除字元串兩端的空格。  
  3. //  思路:  
  4. //  1,判斷字元串第一個位置是否是空格,如果是繼續向下判斷,直到不是空格為止。  
  5. //      結尾處判斷空格也是如此。  
  6. //  2,當開始和結尾都判斷到不是空格,就是要擷取的字元串。  
  7. // 2,将一個字元串進行反轉,将字元串中指定部分進行反轉,"abcdefg";abfedcg.  
  8. //  思路:  
  9. //  1,曾靜學習過對數組的元素進行反轉。  
  10. //  2,将字元串變成數組,對數組進行反轉。  
  11. //  3,将反轉後的數組變成字元串。  
  12. //  4,隻要将或反轉的部分的開始和結束為止作為參數傳遞即可。  
  13. class StringTest1{  
  14.     public static void main(String[] args){  
  15.     }  
  16.     // 練習一:去除字元串兩端空格。  
  17.     public static String myTrim(String s){  
  18.         int start=0,end=s.length()-1;  
  19.         while(start<=end&&s.charAt(start)==' ')  
  20.             start++;  
  21.         while(start<=end&&s.charAt(end)==' ')  
  22.             end--;  
  23.         return s.substring(start,end+1);  
  24.     }  
  25.     // 練習二:将字元串反轉。  
  26.     // 将字元串變成數組,對數組進行反轉,将數組變成字元串。  
  27.     public static String reverseString(String s,int start,int end){  
  28.         char[] chs=s.toCharArray();  
  29.         reverse(chs,start,end);  
  30.         return new String(chs);  
  31.     }  
  32.     public static String reverseString(String s){  
  33.         return reverseString(s,0,s.length()-1);  
  34.     }  
  35.     public static void reverse(char[] arr,int x,int y){  
  36.         for(int start=x,end=y; start<end; start++,end--){  
  37.             swap(arr,start,end);  
  38.         }  
  39.     }  
  40.     public static void swap(char[] arr,int x,int y){  
  41.         char temp=arr[x];  
  42.         arr[x]=arr[y];  
  43.         arr[y]=temp;  
  44.     }  
  45. }  

練習2:

[java]  view plain copy print ?

  1. package pack;  
  2. // 3,擷取一個字元串在另一個字元串中出現的次數。  
  3. //  “adkkkcdkkefkkskk”  
  4. //  思路:  
  5. //  1,定義一個計數器。  
  6. //  2,擷取kk第一次出現的位置。  
  7. //  3,從第一次出現的位置後剩餘的字元串中繼續擷取kk出現的位置。  
  8. //      每擷取一次就計數一次。  
  9. //  4,當擷取不到時,計數完成。  
  10. class StringTest2{  
  11.     public static void sop(Object obj){  
  12.         System.out.println(obj);  
  13.     }  
  14.     public static void main(String[] args){  
  15.     }  
  16.     // 方式一。  
  17.     public static int getSubCount(String s,String key){  
  18.         int count=0;  
  19.         int index=0;  
  20.         while((index=s.indexOf(key))!=-1){  
  21.             sop(s);  
  22.             s=s.substring(index+key.length());  
  23.             count++;  
  24.         }  
  25.         return count;  
  26.     }  
  27.     // 方式二。  
  28.     public static int getSubString(String s,String key){  
  29.         int count=0;  
  30.         int index=0;  
  31.         while((index=s.indexOf(key,index))!=-1){  
  32.             sop(index);  
  33.             index=index+key.length();  
  34.             count++;  
  35.         }  
  36.         return count;  
  37.     }  
  38. }  

練習2:

[java]  view plain copy print ?

  1. package pack;  
  2. // 4,擷取兩個字元串中最大相同子串,第一個動作:将斷的哪個串進行長度一次遞減的子串列印。  
  3. //  “abcwerthelloyuiodef”  
  4. //  “cvhellobnm”  
  5. //  思路:  
  6. //  1,将短的哪個子串按照長度遞減的方式擷取到。  
  7. //  2,将每擷取到的子串去長傳中判斷是否包含。  
  8. //      如果包含,已經找到。  
  9. class StringTest3{  
  10.     public static void main(String[] args){  
  11.         String s1="abcwerthelloyuiodef";  
  12.         String s2="cvhellobnm";  
  13.         System.out.println(getMaxSubString(s1,s2));  
  14.     }  
  15.     public static String getMaxSubString(String s1,String s2){  
  16.         String max="",min="";  
  17.         max=(s1.length()>s2.length())?s1:s2;  
  18.         min=(max==min)?s1:s2;  
  19.         System.out.println(max);  
  20.         System.out.println(min);  
  21.         for(int x=0; x<min.length(); x++){  
  22.             for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){  
  23.                 String temp=min.substring(y,z);  
  24.                 if(max.contains(temp))  
  25.                     return "相同子串: "+temp;  
  26.             }  
  27.         }  
  28.         return "";  
  29.     }  
  30. }  

------------------------------------

StringBuffer字元串緩沖區:★★★

構造一個其中不帶字元的字元串緩沖區,初始容量為 16 個字元。

特點:

1:可以對字元串内容進行修改。

2:是一個容器。

3:是可變長度的。

4:緩沖區中可以存儲任意類型的資料。

5:最終需要變成字元串。

容器通常具備一些固定的方法:

1,添加。

StringBuffer append(data):在緩沖區中追加資料。追加到尾部。

StringBuffer insert(index,data):在指定位置插入資料。

2,删除。

StringBuffer delete(start,end);删除從start至end-1範圍的元素

StringBuffer deleteCharAt(index);删除指定位置的元素

//sb.delete(0,sb.length());//清空緩沖區。

3,修改。

StringBuffer replace(start,end,string);将start至end-1替換成string

void setCharAt(index,char);替換指定位置的字元

void setLength(len);将原字元串置為指定長度的字元串

4,查找。(查不到傳回-1)

int indexOf(string); 傳回指定子字元串在此字元串中第一次出現處的索引。

int indexOf(string,int fromIndex);從指定位置開始查找字元串

int lastIndexOf(string); 傳回指定子字元串在此字元串中最右邊出現處的索引。

int lastIndexOf(string,int fromIndex); 從指定的索引開始反向搜尋

5,擷取子串。

string substring(start); 傳回start到結尾的子串

string substring(start,end); 傳回start至end-1的子串

6,反轉。

StringBuffer reverse();字元串反轉

StringBuilder字元串緩沖區:★★★

JDK1.5出現StringBuiler;構造一個其中不帶字元的字元串生成器,初始容量為 16 個字元。該類被設計用作 StringBuffer 的一個簡易替換,用在字元串緩沖區被單個線程使用的時候(這種情況很普遍)。

方法和StringBuffer一樣;

StringBuffer 和 StringBuilder 的差別:

StringBuffer線程安全。

StringBuilder線程不安全。

單線程操作,使用StringBuilder 效率高。

多線程操作,使用StringBuffer 安全。

//想要使用緩沖區,先要建立對象。

StringBuffer sb = new StringBuffer();

sb.append(12).append("haha");//方法調用鍊。

String s = "abc"+4+'q';

s = new StringBuffer().append("abc").append(4).append('q').toString();

t-size:10.5000pt; mso-font-kerning:1.0000pt; " >

單線程操作,使用StringBuilder 效率高。

多線程操作,使用StringBuffer 安全。

練習:

[java]  view plain copy print ?

  1. package pack;  
  2. // StringBuffer是字元串緩沖區,是一個容器。特點:  
  3. // 1,而且長度是可變化的。  
  4. // 2,可以直接操作多個資料類型。  
  5. // 3,最終會通過toString方法變成字元串  
  6. // c create U update Rread Ddelete  
  7. //  1,存儲。  
  8. //      StringBuffer append();将指定資料作為參數添加到已有資料的結尾處。  
  9. //      StringBuffer insert(index,資料);可以将資料插入到指定index位置。  
  10. //  2,删除。  
  11. //      StringBuffer delete(start,end);删除緩沖區中的資料,包含start,不包含end。  
  12. //      StringBuffer deleteCharAt(index);删除指定位置的字元。  
  13. //  3,擷取。  
  14. //      char charAt(int index);  
  15. //      int indexOf(String str);  
  16. //      int laseIndexOf(String str);  
  17. //      int length();  
  18. //      String substring(int start,int end);  
  19. //  4,修改。  
  20. //      StringBuffer replace(start,end,string);  
  21. //      void setCharAt(int index,char ch);  
  22. //  5,反轉。  
  23. //      StringBuffer reverse();  
  24. //  6,緩沖區中指定資料存在到指定數組中。  
  25. //      void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)  
  26. // 在JDK1.5版本之後出現了StringBuilder  
  27. // 不同在于:StringBuffer是線程同步。  
  28. //          StringBuilder是線程不同步。  
  29. //  以後開發,建議使用StringBuilder。  
  30. // 更新三個因素:1,提高效率。2,簡化書寫。3,提高安全性。  
  31. class StringBufferDemo{  
  32.     public static void sop(Object obj){  
  33.         System.out.println(obj);  
  34.     }  
  35.     public static void main(String[] args){  
  36.     }  
  37.     public static void method_add(){  
  38.         StringBuffer sb=new StringBuffer();  
  39.         sb.append("abc");sb.append(123);sb.append(true);  
  40.         StringBuffer sb1=sb.append(123);  
  41.         sop("sb: "+sb);sop("sb1: "+sb1);  
  42.         sb.insert(1,"qq");  
  43.         sop(sb.toString());  
  44.         sop(sb1.toString());  
  45.     }  
  46.     public static void method_delete(){  
  47.         StringBuffer sb=new StringBuffer("abcdefg");  
  48.         sb.delete(1,3);  
  49.         sb.delete(0,sb.length());  
  50.         sb.delete(2,3);sb.deleteCharAt(2);  
  51.         sop(sb.toString());  
  52.     }  
  53.     public static void method_udapter(){  
  54.         StringBuffer sb=new StringBuffer("abcdefg");  
  55.         sb.replace(1,3,"java");  
  56.         sb.setCharAt(2,'K');  
  57.         sop(sb.toString());  
  58.     }  
  59.     public static void getChars(){  
  60.         StringBuffer sb=new StringBuffer("abcdefg");  
  61.         char[] chs=new char[4];  
  62.         sb.getChars(1,4,chs,1);  
  63.         for(int x=0; x<chs.length; x++)  
  64.             sop("chs["+x+"]"+chs[x]+";");  
  65.     }  
  66. }