次日學習過Java中的常量:java
常量的分類:面試
數值型常量:整數,小數(浮點數)數組
字符型常量:使用單引號引用的數據安全
字符串常量:使用雙引號引用的數據學習
布爾型常量:true或false測試
null常量:nullui
上述的大部分的常量均可以使用Java中提供的8種基本類型進行開闢空間,存儲這些常量。線程
字符串常量不屬於8種基本類型中的數據。而它屬於Java中的引用類型數據(類類型數據)。設計
字符串數據在Java中使用String類進行描述。code
字符串數據它屬於Java中一類數據,咱們也能夠把其看做一類事物。既然是一類事物,就必定可使用Java中的某個類對其進行封裝和描述。
後期咱們學習的目標和重點:
再也不是如何去描述一個類(不是去定義類)。而是要學習怎麼去使用別人(JDK)中提供好的類。須要知道這些類是幹什麼的,以及它中有哪些經常使用的方法,這些方法可以解決什麼問題。
後期學習新的類的時候,學習方式:
重點是使用本身的代碼去測試這些類中的方法,並獲得本身的結論。
String
類表明字符串。Java 程序中的全部字符串字面值(如 "abc"
)都做爲此類的實例實現。
在Java中只要使用雙引號引用起來的任何數據它們都是String 的一個對象。
字符串是常量;它們的值在建立以後不能更改。由於 String 對象是不可變的,因此能夠共享。
雖然使用雙引號引用起來的數據都是字符串,也是String的一個實例對象,可是這個對象中的字符數據必定寫完,就已是一個固定的數據,不能再進行修改,而且它存儲在方法區的字符串常量池中。
String類中提供了大量的構造方法,均可以將不一樣形式的數據轉成字符串對象。
1 /* 2 * 演示String類的構造方法 3 */ 4 public class StringConstructorDemo { 5 public static void main(String[] args) { 6 7 method5(); 8 } 9 /* 10 * 面試題 11 */ 12 public static void method5() { 13 14 String s = "abc"; 15 String s2 = new String("abc"); 16 /* 17 * s 和 s2 的區別? 18 * s它指向的方法區中的常量池中的 abc字符串 19 * s2它指向的是堆中的本身new的那個對象,而在堆中這個對象中維護的地址 20 * 指向的常量池中的abc字符串 21 * 22 * String s = "abc"; 在內存中只有一個對象 23 * String s2 = new String("abc"); 在內存中有2個對象 24 */ 25 System.out.println(s); 26 System.out.println(s2); 27 System.out.println(s == s2); 28 } 29 /* 30 * 演示將int類型的數組轉成字符串 31 */ 32 public static void method4() { 33 34 int[] arr = {23456,23457,23458}; 35 String s = new String(arr , 0 , 3); 36 System.out.println(s); 37 } 38 /* 39 * String(byte[] bytes, int offset, int length) 40 * byte[] bytes : 指定須要被轉成字符串的那個字節數組 41 * int offset : 從字節數組的那個下標開始轉數據 42 * int length : 須要將從offset開始日後共計轉多少數據 43 */ 44 public static void method3() { 45 46 byte[] b = {97,98,99,100,65,49}; 47 48 String s = new String( b , 4 ,4 ); 49 System.out.println(s); 50 } 51 /* 52 * 演示String類中的有參數的構造方法 53 */ 54 public static void method2() { 55 56 //建立字節數組 57 byte[] b = {97,98,99,100,65,49}; 58 59 //將字節數組中的全部數據轉成字符串 60 String s = new String( b ); 61 62 System.out.println(s); 63 } 64 /* 65 * 演示空參數的構造方法 66 * String() 67 */ 68 public static void method1() { 69 70 /* 71 * 使用String類的構造方法獲得String對象 72 * 使用空參數的構造方法建立出的String對象,這個對象在堆中 73 * 而這個字符串對象中沒有任何字符數據 74 */ 75 String s = new String(); 76 77 } 78 }
猜想到某個功能以後,繼續猜想它的方法參數以及返回值類型
參數:有,至少2個。實際值須要一個參數
返回值類型:String , 拼接後的新的字符串
1 /* 2 * 演示String類中的截取方法 3 */ 4 public class StringMethodDemo2 { 5 public static void main(String[] args) { 6 7 String s = "好好學習,每天向上"; 8 /* 9 * substring(int beginIndex) 10 * 從指定的字符串中的beginIndex位置開始截取子串,一直到結束 11 * substring( int beginIndex , int endIndex ) 12 * 從指定的字符串中的beginIndex位置開始到endIndex結束(不包含endIndex位置上的字符) 13 */ 14 String ss = s.substring(2); 15 System.out.println(ss); 16 String ss2 = s.substring(0, 5); 17 System.out.println(ss2); 18 } 19 }
1 //字符串轉成字節數組 2 public static void method2() { 3 String s = "abdefg"; 4 //轉字節數組 5 byte[] bs = s.getBytes(); 6 7 for (int i = 0; i < bs.length; i++) { 8 System.out.println(bs[i]); 9 } 10 } 11 //字符串轉字符數組 12 public static void method1() { 13 String s = "abcefg"; 14 //轉字符數組 15 char[] cs = s.toCharArray(); 16 for (int i = 0; i < cs.length; i++) { 17 System.out.println(cs[i]); 18 } 19 }
判斷指定的字符串是否在調用contains方法的那個字符串中。
String s =」abcdefg」;
String s2 = 「abc」;
boolean b = s.contains(s2);
判斷s2 這個字符串在s字符串中是否存在。
判斷字符串是否以指定的字符串結尾。
String s = 「abc.java」;
boolean b = s.endsWith(「.java」);
將字符串中的全部字母轉成小寫
將字符串中的全部字母轉成大寫
valueOf方法是將其餘類型的數據轉成字符串。
1 /* 2 * 需求:對字符串中的數據進行排序 3 * 4 * 分析: 5 * 須要一個字符串,將字符串轉成字符數組。 6 * 對數組遍歷選擇排序 7 * 將數組轉成字符串 8 */ 9 public class StringTest2 { 10 public static void main(String[] args) { 11 String s ="aAZzBcDfPO"; 12 String sortedStr = stringSort(s); 13 System.out.println(sortedStr); 14 } 15 //對指定的字符串進行排序 16 public static String stringSort(String s) { 17 18 //將字符串轉成數組 19 char[] cs = s.toCharArray(); 20 //使用選擇排序 21 for( int i = 0 ; i < cs.length - 1 ; i++ ){ 22 //外循環是提供數組中須要和後面比較的那個元素的下標 23 for( int j = i + 1 ; j < cs.length ; j++ ){ 24 //內循環是提供當前外環線下標後面剩餘全部空間的下標 25 //判斷 26 if( cs[i] > cs[j] ){ 27 char temp = cs[i]; 28 cs[i] = cs[j]; 29 cs[j] = temp; 30 } 31 } 32 } 33 //將數組轉成字符串 34 String ss = new String(cs); 35 return ss; 36 } 37 }
1 /* 2 * 需求:統計指定字符在字符串中出現的次數 3 * 分析: 4 * 須要取出字符串中的每一個字符,和須要統計次數的那個字符進行比較, 5 * 若是相同,就讓計數器+1,若是不相同,繼續取出下一個字符,以此類推。 6 * 將字符串中的所有字符遍歷完成,指定的字符個數就統一在計數器中。 7 */ 8 public class StringTest { 9 public static void main(String[] args) { 10 11 String s = "asjdklafjklew4uiowrafn,dsfaksda"; 12 char ch = 'z'; 13 //須要計數器 14 int count = 0; 15 //使用循環遍歷字符串 16 for( int i = 0 ; i < s.length() ; i++ ){ 17 //取出每一個字符數據和須要統計的字符判斷 18 char c = s.charAt(i); 19 if( c == ch ){ 20 count++; 21 } 22 } 23 System.out.println(ch+"的次數是:"+count); 24 } 25 }
1 /* 2 * 需求:對字符串按照指定的內容切割,而後排序 3 * 4 * 分析: 5 * 必須有一個字符串。"abs Adsfj sldjk fljs dlkf" 6 * 使用空格對字符串進行切割: 7 * "abs" "Adsfj" "sldjk" "fljs" "dlkf" 8 * 切割以後,會獲得多個字符串數據,須要對這些字符串進行排序。 9 * 在Java中對字符串進行比較,有本身特定的規則: 10 * 11 * 選擇2個字符串,使用它們相同下標位置上的字符對應的數字進行比較, 12 * 誰的數字大,這個字符串就大。 13 * 14 * 在String類中提供的compareTo的方法,能夠對2個字符串進行大小的比較 15 */ 16 public class StringTest3 { 17 public static void main(String[] args) { 18 19 String s = "abs Adsfj sldjk fljs alkf"; 20 21 //切割 22 String[] strs = s.split(" "); 23 24 //排序 25 //Arrays.sort(strs); 26 for( int i = 0 ; i < strs.length - 1 ; i++ ){ 27 for( int j = i + 1 ; j < strs.length ; j++ ){ 28 if( strs[i].compareTo(strs[j]) > 0 ){ 29 String temp = strs[i]; 30 strs[i] = strs[j]; 31 strs[j] = temp; 32 } 33 } 34 } 35 //將String數組轉成字符串 36 //String ss = Arrays.toString(strs); 37 String ss = ""; 38 for (int i = 0; i < strs.length; i++) { 39 ss = ss + strs[i] + " "; 40 } 41 System.out.println(ss); 42 } 43 }
舉例:超市的購物車。在購買商品的過程當中,將須要夠買的商品先臨時存儲在購物車中。這時的購物車就至關於一個容器,給其中添加須要購買的物品。
這裏說的這個容器在Java中被稱爲緩衝區。
Java中也有緩衝區存在。主要是臨時存儲一些須要處理的數據,在處理完以後獲得一個惟一的結果。
字符串緩衝區:能夠存儲字符數據的容器,能夠對這個容器中的字符數據進行各類的操做,在操做完成以後,會獲得一個惟一的字符串常量,最後把這個字符串常量保存到方法區的常量池中。
若是在操做的過程當中,沒有操做完成,那麼不會在常量池中保存任何數據。
緩衝區自己就是一個容器:
它們都具有 增 刪 改 查操做。
增:給容器中添加數據
刪:從容器中刪除數據
改:修改容器中的數據
查:查看容器中的數據
增刪改查:CRUD。
Create Read Update Delete
Java中針對字符串這類數據提供兩個緩衝區對象:
StringBuffer
StringBuilder
線程安全的可變字符序列。一個相似於 String
的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但經過某些方法調用能夠改變該序列的長度和內容。
StringBuffer :它是字符串緩衝區,支持對其中保存的數據進行增刪改查操做。
StringBuffer中定義的方法是爲增刪改查設計的。
1 //刪除方法 2 public static void method3() { 3 //建立字符串 緩衝區對象 4 StringBuffer sb = new StringBuffer("abcdefg"); 5 6 /* 7 * 刪除方法 8 * delete(int start , int end) 9 * start是起始位置 10 * end 結束位置 11 * 要求start必定要小於等於end 12 */ 13 sb.delete(3, 3); 14 15 //刪除指定位置上的字符 16 sb.deleteCharAt(3); 17 18 //將容器中的數據轉成字符串 19 String s = sb.toString(); 20 21 System.out.println(s); 22 }
1 //修改方法 2 public static void method4() { 3 //建立字符串 緩衝區對象 4 StringBuffer sb = new StringBuffer("abcdefg"); 5 6 //修改方法 7 sb.setCharAt(3, 'A'); 8 9 //將容器中的數據轉成字符串 10 String s = sb.toString(); 11 12 System.out.println(s); 13 }
capacity()
獲取字符串緩衝區的容量 例如:水杯500ML
length()
獲取到的是字符串中的字符個數 例如:水杯中實際裝的水的容量
charAt(int index)
獲取字符串緩衝區容器中指定位置上的字符數據
indexOf(
String str)
indexOf(
String str, int fromIndex)
lastIndexOf(
String str)
lastIndexOf(
String str, int fromIndex)
reverse()
反轉字符串緩衝區中的字符
若是程序中須要對字符串中的字符數據進行 CRUD 的時候,建議先將這個字符串存儲到緩衝區中,而後對其進行操做,操做完成以後再從新轉成字符串數據。
StringBuilder類它是JDK5新增的。它的功能和StringBuffer一致。
區別:
StringBuffer 它在操做容器的時候,增 刪 改 查 的過程當中,不會發生不安全的問題。
StringBuilder 它也提供的對容器的增刪改查操做,可是不保證安全。
在使用StringBuilder的時候,運行多個操做同時對容器進行。因爲它不保證安全,所以它在操做的時候效率比StringBuffer高。
面試題:StringBuffer和StringBuilder的區別:
StringBuffer 安全的。StringBuilder 不安全。