11-java.lang.String類的使用
阿新 • • 發佈:2021-06-10
1.概述 String:字串,使用一對""引起來表示。 1.String宣告為final的,不可被繼承 2.String實現了Serializable介面:表示字串是支援序列化的。 實現了Comparable介面:表示String可以比較大小 3.String內部定義了final char[] value用於儲存字串資料 4.通過字面量的方式(區別於new給一個字串賦值,此時的字串值宣告在字串常量池中)。 5.字串常量池中是不會儲存相同內容(使用String類的equals()比較,返回true)的字串的。 2.String的不可變性 2.1 說明 1.當對字串重新賦值時,需要重寫指定記憶體區域賦值,不能使用原有的value進行賦值。
1 String s1 = "abc";//字面量的定義方式
2 String s2 = "abc";
3 s1 = "hello";
4
5 System.out.println(s1 == s2);//比較s1和s2的地址值
6
7 System.out.println(s1);//hello
8 System.out.println(s2);// abc
9
10 System.out.println("*****************");
11
12 String s3 = "abc";
13 s3 += "def";
14 System.out.println(s3);//abcdef
15 System.out.println(s2);
16
17 System.out.println("*****************");
18
19 String s4 = "abc";
20 String s5 = s4.replace('a', 'm');
21 System.out.println(s4);//abc
22 System.out.println(s5);// mbc
2.3 圖示
3.String例項化的不同方式 3.1 方式說明 方式一:通過字面量定義的方式 方式二:通過new + 構造器的方式 3.2 程式碼舉例 //通過字面量定義的方式:此時的s1和s2的資料javaEE宣告在方法區中的字串常量池中。 String s1 = "javaEE"; String s2 = "javaEE"; //通過new + 構造器的方式:此時的s3和s4儲存的地址值,是資料在堆空間中開闢空間以後對應的地址值。 String s3 = new String("javaEE"); String s4 = new String("javaEE"); System.out.println(s1 == s2);//true System.out.println(s1 == s3);//false System.out.println(s1 == s4);//false System.out.println(s3 == s4);//false 3.3 面試題 String s = new String("abc");方式建立物件,在記憶體中建立了幾個物件? 兩個:一個是堆空間中new結構,另一個是char[]對應的常量池中的資料:"abc" 3.4 圖示 4. 字串拼接方式賦值的對比 4.1 說明 1.常量與常量的拼接結果在常量池。且常量池中不會存在相同內容的常量。 2.只要其中一個是變數,結果就在堆中。 3.如果拼接的結果呼叫intern()方法,返回值就在常量池中 4.2 程式碼舉例
1 String s1 = "javaEE";
2 String s2 = "hadoop";
3
4 String s3 = "javaEEhadoop";
5 String s4 = "javaEE" + "hadoop";
6 String s5 = s1 + "hadoop";
7 String s6 = "javaEE" + s2;
8 String s7 = s1 + s2;
9
10 System.out.println(s3 == s4);//true
11 System.out.println(s3 == s5);//false
12 System.out.println(s3 == s6);//false
13 System.out.println(s3 == s7);//false
14 System.out.println(s5 == s6);//false
15 System.out.println(s5 == s7);//false
16 System.out.println(s6 == s7);//false
17
18 String s8 = s6.intern();//返回值得到的s8使用的常量值中已經存在的“javaEEhadoop”
19 System.out.println(s3 == s8);//true
20 ****************************
21 String s1 = "javaEEhadoop";
22 String s2 = "javaEE";
23 String s3 = s2 + "hadoop";
24 System.out.println(s1 == s3);//false
25
26 final String s4 = "javaEE";//s4:常量
27 String s5 = s4 + "hadoop";
28 System.out.println(s1 == s5);//true
5.常用方法: int length():返回字串的長度: return value.length char charAt(int index): 返回某索引處的字元return value[index] boolean isEmpty():判斷是否是空字串:return value.length == 0 String toLowerCase():使用預設語言環境,將 String 中的所字元轉換為小寫 String toUpperCase():使用預設語言環境,將 String 中的所字元轉換為大寫 String trim():返回字串的副本,忽略前導空白和尾部空白 boolean equals(Object obj):比較字串的內容是否相同 boolean equalsIgnoreCase(String anotherString):與equals方法類似,忽略大小寫 String concat(String str):將指定字串連線到此字串的結尾。 等價於用“+” int compareTo(String anotherString):比較兩個字串的大小 String substring(int beginIndex):返回一個新的字串,它是此字串的從beginIndex開始擷取到最後的一個子字串。 String substring(int beginIndex, int endIndex) :返回一個新字串,它是此字串從beginIndex開始擷取到endIndex(不包含)的一個子字串。 boolean endsWith(String suffix):測試此字串是否以指定的字尾結束 boolean startsWith(String prefix):測試此字串是否以指定的字首開始 boolean startsWith(String prefix, int toffset):測試此字串從指定索引開始的子字串是否以指定字首開始 boolean contains(CharSequence s):當且僅當此字串包含指定的 char 值序列時,返回 true int indexOf(String str):返回指定子字串在此字串中第一次出現處的索引 int indexOf(String str, int fromIndex):返回指定子字串在此字串中第一次出現處的索引,從指定的索引開始 int lastIndexOf(String str):返回指定子字串在此字串中最右邊出現處的索引 int lastIndexOf(String str, int fromIndex):返回指定子字串在此字串中最後一次出現處的索引,從指定的索引開始反向搜尋 注:indexOf和lastIndexOf方法如果未找到都是返回-1 替換: String replace(char oldChar, char newChar):返回一個新的字串,它是通過用 newChar 替換此字串中出現的所 oldChar 得到的。 String replace(CharSequence target, CharSequence replacement):使用指定的字面值替換序列替換此字串所匹配字面值目標序列的子字串。 String replaceAll(String regex, String replacement):使用給定的 replacement 替換此字串所匹配給定的正則表示式的子字串。 String replaceFirst(String regex, String replacement):使用給定的 replacement 替換此字串匹配給定的正則表示式的第一個子字串。 匹配: boolean matches(String regex):告知此字串是否匹配給定的正則表示式。 切片: String[] split(String regex):根據給定正則表示式的匹配拆分此字串。 String[] split(String regex, int limit):根據匹配給定的正則表示式來拆分此字串,最多不超過limit個,如果超過了,剩下的全部都放到最後一個元素中。 6. String與其它結構的轉換 6.1 與基本資料型別、包裝類之間的轉換 String --> 基本資料型別、包裝類:呼叫包裝類的靜態方法:parseXxx(str) 基本資料型別、包裝類 --> String:呼叫String過載的valueOf(xxx)
1 @Test
2 public void test1(){
3 String str1 = "123";
4 // int num = (int)str1;//錯誤的
5 int num = Integer.parseInt(str1);
6
7 String str2 = String.valueOf(num);//"123"
8 String str3 = num + "";
9
10 System.out.println(str1 == str3);
11 }
6.2 與字元陣列之間的轉換 String --> char[]:呼叫String的toCharArray() char[] --> String:呼叫String的構造器
1 @Test
2 public void test2(){
3 String str1 = "abc123"; //題目: a21cb3
4
5 char[] charArray = str1.toCharArray();
6 for (int i = 0; i < charArray.length; i++) {
7 System.out.println(charArray[i]);
8 }
9
10 char[] arr = new char[]{'h','e','l','l','o'};
11 String str2 = new String(arr);
12 System.out.println(str2);
13 }
6.3 與位元組陣列之間的轉換 編碼:String --> byte[]:呼叫String的getBytes() 解碼:byte[] --> String:呼叫String的構造器 編碼:字串 -->位元組 (看得懂 --->看不懂的二進位制資料) 解碼:編碼的逆過程,位元組 --> 字串 (看不懂的二進位制資料 ---> 看得懂 說明:解碼時,要求解碼使用的字符集必須與編碼時使用的字符集一致,否則會出現亂碼。
1 @Test
2 public void test3() throws UnsupportedEncodingException {
3 String str1 = "abc123中國";
4 byte[] bytes = str1.getBytes();//使用預設的字符集,進行編碼。
5 System.out.println(Arrays.toString(bytes));
6
7 byte[] gbks = str1.getBytes("gbk");//使用gbk字符集進行編碼。
8 System.out.println(Arrays.toString(gbks));
9
10 System.out.println("******************");
11
12 String str2 = new String(bytes);//使用預設的字符集,進行解碼。
13 System.out.println(str2);
14
15 String str3 = new String(gbks);
16 System.out.println(str3);//出現亂碼。原因:編碼集和解碼集不一致!
17
18
19 String str4 = new String(gbks, "gbk");
20 System.out.println(str4);//沒出現亂碼。原因:編碼集和解碼集一致!
21
22
23 }
6.4 與StringBuffer、StringBuilder之間的轉換 String -->StringBuffer、StringBuilder:呼叫StringBuffer、StringBuilder構造器 StringBuffer、StringBuilder -->String:①呼叫String構造器;②StringBuffer、StringBuilder的toString() 7. JVM中字串常量池存放位置說明: jdk 1.6 (jdk 6.0 ,java 6.0):字串常量池儲存在方法區(永久區) jdk 1.7:字串常量池儲存在堆空間 jdk 1.8:字串常量池儲存在方法區(元空間)