每種語言都會有字元串的操作,因為字元串是我們平常開發使用頻率最高的一種類型。今天我們來聊一下Java的字元串操作及在某些具體方法中與C#的不同,對於需要熟悉多種語言的人來說,作為一種參考。進行誡勉 首先,什麼是字元串? 字元串是字元的序列,是作為一種對象而存在。說的直白點,字元串就是一些字元的組合, ...
每種語言都會有字元串的操作,因為字元串是我們平常開發使用頻率最高的一種類型。今天我們來聊一下Java的字元串操作及在某些具體方法中與C#的不同,對於需要熟悉多種語言的人來說,作為一種參考。進行誡勉
首先,什麼是字元串?
字元串是字元的序列,是作為一種對象而存在。說的直白點,字元串就是一些字元的組合,從而構成字元串,例如“abc”就是字元串,"郭志奇"也是一種賜福穿。
我們知道,Java是一種面向對象的高級程式語言。所有事物均為對象,字元串也不例外,也是一種對象,其對應類型為String。
下麵,我們分幾種情況來進行說明字元串:
- 字元串的創建
- 字元串操作
- 字元串連接
- 字元串長度
- 字元串查找
- 獲取指定索引的字元
- 去重空格
- 判斷相等
- 大小寫轉換
- 字元串分隔
- 字元串比較
字元串創建
字元串必須先聲明併進行初始化,才能使用,否則編譯器會報出 變數未初始化錯誤。
請註意:Java中字元串定義的類型為String(第一個字母大寫),對於C#程式員來說,看著不太舒服,因為c#中字元串定義為string (第一個字母小寫),但C#中也是有String類的
創建字元串也分幾種方式,可以根據需求靈活組織:
String(char a[])--Java代碼
1 char a[] = { 'a', 'b', 'c' }; 2 String source = new String(a); 3 System.out.println(source);//輸出結果為abc
String(char a[],int offset,int length)--Java代碼
1 char a[] = { 'a', 'b', 'c' }; 2 String source = new String(a, 1, 2); 3 System.out.println(source);//輸出為bc
字元串常量:
String source=“郭志奇”;
1 String source = "郭志奇"; 2 String source1 = "郭志奇"; 3 System.out.println(source == source1);// 輸出true 4 System.out.println(source.equals(source1));// 輸出true
此處簡單提一下,Java中雙等號== 表示的是引用是否相同,equals比較的是實際的字元串值。
對應的C#代碼
1 string source = "郭志奇"; 2 string source1 = "郭志奇"; 3 Console.WriteLine(source==source1);//輸出True 4 Console.WriteLine(source.Equals(source1));//輸出True 5 Console.WriteLine(string.ReferenceEquals(source,source1));//輸出True 6 Console.Read();
在C#中雙等號以及equals比較的是實際的值,而refreshEquals比較的是引用是否相同。和Java略有不同。
字元串操作
- 字元串連接
通過加號+可以將兩個字元串進行連接。請註意,字元串與其他類型連接,會自動調用其toString方法轉換成字元串,然後進行拼接。
Java代碼:
1 String source = "郭志奇"; 2 String source2 = "郭語晨"; 3 String source3 = source + source2; 4 System.out.println(source3);// 輸出郭志奇郭語晨 5 String source4 = source + 521;// 字元串與數字拼接 6 System.out.println(source4);//輸出郭志奇521
concat:字元串拼接1 String source = "郭志奇"; 2 String source2 = "郭語晨"; 3 String source5 = source.concat(source2); 4 System.out.println(source5);// 輸出郭志奇郭語晨
- 字元串長度
通過length()方法獲取字元串長度。請註意:包含字元串中空格的長度。
Java代碼:
1 String source = " 郭志奇 ";//首碼包含一個空格及一個tab 尾碼包含一個空格 2 System.out.println(source.length());// 輸出6
C#代碼:
找茬:從C#輸出的長度可以看到,Tab在Java中長度為1,而在C#長度為2. 英文tab1 string source = " 郭志奇 "; 2 Console.WriteLine(source.Length);//輸出7
- 字元串查找
兩種字元串查找方法:
indexOf():從字元串開始位置進行查找
1 String source = "郭志奇"; 2 System.out.println(source.indexOf("郭"));// 輸出0 3 System.out.println(source.indexOf(""));// 輸出0
lastIndexOf()方法:從字元串結束位置開始查找
1 String source = "郭志奇"; 2 System.out.println(source.lastIndexOf("郭"));// 輸出0 3 System.out.println(source.lastIndexOf(""));// 輸出3
找茬:indexOf查找空字元串,返回值是0。lastIndexOf方法查找空格,返回值是3.等於字元串的長度。
查看lastIndexOf對應的C#代碼實現:1 string source = "郭志奇"; 2 Console.WriteLine(source.Length);//輸出3 3 Console.WriteLine(source.LastIndexOf(""));//輸出2 4 Console.Read();
通過對比lastIndexOf查找空字元串,可以發現C#和Java的不同,Java返回的是字元串的長度,而C#返回的是字元串長度-1。個人認為C#的處理更符合目的。
- 獲取指定索引的字元
通過charAt方法獲取指定索引的字元
1 String source = "郭志奇"; 2 System.out.println(source.charAt(0));//輸出郭 3 System.out.println(source.charAt(source.length() - 1));//輸出奇
為了學習,我們就要思考,假如我輸入了負數或大於字元串長度的索引會出現什麼呢?代碼驗證
1 String source = "郭志奇"; 2 System.out.println(source.charAt(-1)); 3 System.out.println(source.charAt(source.length() + 11));
沒錯,代碼執行出錯了,拋出異常:java.lang.StringIndexOutOfBoundsException
- 去重空格
通過trim方法移除字元串前後空格(包含tab)
1 String source = " 郭志奇 ";// 前後都有空格 2 String source1 = " 郭志奇 "; 3 System.out.println(source.length()); 4 System.out.println(source.trim().length()); 5 System.out.println(source1.length()); 6 System.out.println(source1.trim().length());
令人遺憾的是,Java沒有提供只清空首碼空格或尾碼空格的方法。而C#卻有。
- 判斷相等
兩種判斷字元串相等的方法,雙等號及equals、equalsIgnoreCase
通過代碼來進行說明:
1 String source = new String("郭志奇A"); 2 String source1 = new String("郭語晨"); 3 String source2 = "郭志奇A"; 4 String source3 = "郭語晨"; 5 6 String source4 = "郭志奇a"; 7 8 System.out.println(source == source2);// false 9 System.out.println(source.equals(source2));// true 10 System.out.println(source1 == source3);// false 11 System.out.println(source1.equals(source3));// true 12 13 System.out.println(source == source4);// false 14 System.out.println(source.equals(source4));// false 15 System.out.println(source.equalsIgnoreCase(source4));// true
雙等號代表的是字元串引用是否相同,對於不同對象的字元串,雙等號比較是不同的。
equals比較的是字元串的值,但區分大小寫
equalsIgnoreCase:比較的是字元串的值,不區分大小寫
進行字元串比較,儘量避免使用雙等號。 - 大小寫轉換
toUpperCase轉換成大寫形式,toLowerCase轉換成小寫形式。但對於數字、空格則會忽略,不進行轉換。比較簡單 - 字元串分隔
通過split方法進行字元串分隔,split參數是分隔符,返回值是分割後的字元串數組。較簡單。 - 字元串比較
通過compareTo方法進行字元串比較,
1 String source = "ab"; 2 String source1 = "ba"; 3 String source2 = "ab"; 4 System.out.println(source.compareTo(source1));//返回值-1 5 System.out.println(source.compareTo(source2));//返回值0 6 System.out.println(source1.compareTo(source2));//返回值1 7 8 System.out.println(source.compareToIgnoreCase(source1));//返回值-1 9 System.out.println(source.compareToIgnoreCase(source2));//返回值0 10 System.out.println(source1.compareToIgnoreCase(source2));//返回值1
compareTo方法會逐個字元進行比較,如果源字元串比目標字元串大,那麼返回正整數;如果源字元串與目標字元串相同,那麼返回0;如果源字元串比目標字元串小,那麼返回負數。
請註意:
1、返回值為0,那麼字元串通過equals比較會相同
2、返回值正整數、負數,是源字元串不同的字元相減所得。
字元串使我們日常開發使用頻率最高的類型,因此要數量掌握字元串的各種操作,以及一些坑點,才能在編碼中輕鬆、愉快的避免各種bug的出現。
本次說明只介紹了字元串的冰山一角,對於更重要的字元串格式化,本次沒有涉及,因為蛋蛋字元串格式化,就可以單獨寫一篇更長的博文才能說明。下次再聊。