Java字串String類操作方法整理
最近利用晚上的一些空閒時間學習了Java的字串部分,發現其與C語言、C++等面向過程語言在使用上出現的不同點,C語言僅僅提供了字串型別的一個構造,相當於只給了開發者基本材料,讓開發者自行去用材料造輪子;而Java給字串提供了許多的可用方法,呼叫這些方法可以在一定程度上加快程式的開發效率,這也就相當於Java已經給開發人員提供好了輪子,只要用輪子去造車子便可,所以這就是面向物件思想與面向過程思想的其中一個區別吧。所以我喜歡Java的原因大概是Java可以隨時隨地new一個物件吧。。。
但是也正因為這一特點,讓初學者頭禿的是在短時間內沒有辦法熟練掌握和應用這些方法,那我也覺得程式設計之路上沒有捷徑,所有的技術大神除了天賦與興趣,那每天的事情就是敲程式碼敲程式碼敲程式碼。所以在學完String類的簡單操作方法後,我打算在部落格上先將這些方法進行分類和整理,暫時需要做的是理清這些方法應用於哪些情況,又該如何去呼叫這些方法,之後就每天對著這些方法慢慢敲慢慢敲敲到熟練為止,至於那些運用在專案中的複雜的騷操作,那就留給時間和頭髮吧。
然後。。。就不給自己灌雞湯了,正事兒要緊!!
關於String類的基本操作,可分為以下幾類:1、基本操作方法 2、字串比較 3、字串與其他資料型別之間的轉換 4、字元與字串的查詢 5、字串的擷取與拆分 6、字串的替換與修改
我覺得在整理到下面的內容之前需要給自己提的醒是關於字串的操作方法我們是不需要像其他操作一樣手動導包的,其String和StringBuffer等類封裝在java.lang包中,我們直接呼叫字串方法即可!
一、String基本操作方法
首先說一下基本操作方法,字串的基本操作方法中包含以下幾種:(1)獲取字串長度length() (2)獲取字串中的第i個字元charAt(i) (3)獲取指定位置的字元方法getChars(4個引數)
1、 獲取字串長度方法length()
格式:int length = str.length();
2、獲取字串中的第i個字元方法charAt(i)
格式:char ch = str.charAt(i); //i為字串的索引號,可得到字串任意位置處的字元,儲存到字元變數中
3、獲取指定位置的字元方法getChars(4個引數)
格式:char array[] = new char[80]; //先要建立以一個容量足夠大的char型陣列,陣列名為array
str.getChars(indexBegin,indexEnd,array,arrayBegin);
解釋一下括號中四個引數的指向意義:1、indexBegin:需要複製的字串的開始索引
2、 indexEnd: 需要複製的字串的結束索引,indexEnd-1
3、array: 前面定義的char型陣列的陣列名
4、arrayBegin:陣列array開始儲存的位置索引號
這樣我們就可以將字串中想要的範圍內的字元都複製到字元陣列中,將字元陣列列印輸出即可。
與getChars()類似的方法有一個getBytes(),兩者使用上基本相同,只是getBytes()方法建立的是byte型別的陣列,而byte編碼是預設字符集編碼,它是用編碼表示的字元。
下面就上程式碼簡單演示一下三種方法的用法:
//String類基本操作方法
public class StringBasicOpeMethod {
public static void main(String args[]){
String str = "如何才能變得像棋哥一樣優秀?算了吧,憋吹牛逼!"; //定義一個字串
System.out.println(str); //輸出字串
/***1、length()方法***/
int length = str.length();//得到字串長度
System.out.println("字串的長度為:"+length);
/***2、charAt()方法***/
char ch = str.charAt(7); //得到索引為7的字元
System.out.println("字串中的第8個字元為:"+ch);
/***3、getChars()方法***/
char chardst[] = new char[80]; //定義容量為80的字元陣列,用於儲存從字串中提取出的一串字元
str.getChars(0,14,chardst,0);
//System.out.println("字元陣列中存放的內容為:"+chardst);//錯誤,輸出的是編碼
System.out.println(chardst); //**括號中不可帶其他字串
}
}
執行結果如下:
二、字串比較
我們知道,明確的數值之間可以很方便地進行比較,那麼字串該如何進行比較呢?字串的比較是將兩個字串從左到右逐個字元逐個字元進行比較,比較的依據是當前字元的Uncode編碼值,直到比較出兩個不同字元的大小。
字串比較也分為兩大類:一類是字串大小的比較,這樣的比較有三種結果,大於、等於以及小於;還有一類比較方法就是比較兩個字串是否相等,這樣產生的比較結果無非就兩種,ture和false。
1、首先看一下第一種比較大小這類需求中的方法:
(1)不忽略字符串大小寫情況下字串的大小比較方法compareTo(another str)
格式:int result = str1.compareTo(str2);
輸出三種比較結果:若該字串的Unicode值<引數字串的Unicode值,結果返回一負整數;若若該字串的Unicode值=引數字串的Unicode值,結果返回0;若該字串的Unicode值>引數字串的Unicode值,結果返回一正整數。
(2) 忽略字串大小寫情況下字串的大小比較方法compareTOIgnoreCase(another str)
格式:int result = str1.compareToIgnoreCase(str2);
在忽略字串大小寫情況下,返回三種比較結果:輸出三種比較結果:若該字串的Unicode值<引數字串的Unicode值,結果返回一負整數;若若該字串的Unicode值=引數字串的Unicode值,結果返回0;若該字串的Unicode值>引數字串的Unicode值,結果返回一正整數。
2、然後看一下第二種判別兩種字串是否相等(相等情況下必須保證二者長度相等)需求中的方法:
(1)不忽略字串大小寫情況下判別字串相等的方法eaquals(another str)
格式:boolean result = str1.equals(str2);
當且僅當str1和str2的長度相等,且對應位置字元的Unicode編碼完全相等,返回true,否則返回false
(2) 忽略字串大小寫情況下判別字串相等的方法equalsIgnoreCase(another str)
格式:boolean result = str1.equals(str2);
demo如下:
public class StringCompareMethod {
public static void main(String args[]){
String str1 = "elapant";
String str2 = "ELEPANT"; //定義兩個字串
String str3 = "Apple";
String str4 = "apple";
/***1、compareTo方法***/
//不忽略字串字元大小寫
if(str1.compareTo(str2)>0){
System.out.println(str1+">"+str2);
}else if(str1.compareTo(str2) == 0){
System.out.println(str1+"="+str2);
}else{
System.out.println(str1+"="+str2);
}
/***2、compareToIgnoreCase()方法***/
//忽略字串字元大小寫
if(str1.compareToIgnoreCase(str2)>0){
System.out.println(str1+">"+str2);
}else if(str1.compareToIgnoreCase(str2) == 0){
System.out.println(str1+"="+str2);
}else{
System.out.println(str1+"<"+str2);
}
/***3、equals()方法***/
//不忽略字串字元大小寫
if(str3.equals(str4)){
System.out.println(str3+"="+str4);
}else{
System.out.println(str3+"!="+str4);
}
/***4、equalsIgnoreCase()方法***/
//忽略字串字元大小寫
if(str3.equalsIgnoreCase(str4)){
System.out.println(str3+"="+str4);
}else{
System.out.println(str3+"!="+str4);
}
}
}
執行結果如下:
三、字串與其他資料型別的轉換
有時候我們需要在字串與其他資料型別之間做一個轉換,例如將字串資料變為整形資料,或者反過來將整形資料變為字串型別資料,"20"是字串,20就是整形數。我們都知道整形和浮點型之間可以利用強制型別轉換和自動型別轉換兩種機制實現兩者之間的轉換,那麼"20"和20這兩種屬於不同型別的資料就需要用到String類提供的資料型別轉換方法了。
由於資料型別較多,因而轉換使用的方法也比較多,在此我就用一個表格羅列一下:
資料型別 | 字串轉換為其他資料型別的方法 | 其它資料型別轉換為字串的方法1 | 其他資料型別轉換為字串的方法2 |
boolean | Boolean.getBoolean(str) | String.valueOf([boolean] b) | Boolean.toString([boolean] b) |
int | Integer.parseInt(str) | String.valueOf([int] i) | Int.toString([int] i) |
long | Long.parseLong(str) | String.valueOf([long] l) | Long.toString([long] l) |
float | Float.parseFloat(str) | String.valueOf([float] f) | Float.toString([float] f) |
double | double.parseFloat(str) | String.valueOf([double] d) | Double.toString([double] d) |
byte | Byte.parseByte(str) | String.valueOf([byte] bt) | Byte.toString([byte] bt) |
char | str.charAt(i) | String.valueOf([char] c) | Character.toString([char] c) |
簡單測試的小demo如下:
public class StringConvert {
public static void main(String args[]){
/***將字串型別轉換為其他資料型別***/
boolean bool = Boolean.getBoolean("false"); //字串型別轉換為布林型別
int integer = Integer.parseInt("20"); //字串型別轉換為整形
long LongInt = Long.parseLong("1024"); //字串型別轉換為長整形
float f = Float.parseFloat("1.521"); //字串型別轉換為單精度浮點型
double d = Double.parseDouble("1.52123");//字串型別轉換為雙精度浮點型
byte bt = Byte.parseByte("200"); //字串型別轉換為byte型
char ch = "棋哥".charAt(0);
/***將其他資料型別轉換為字串型別方法1***/
String strb1 = String.valueOf(bool); //將布林型別轉換為字串型別
String stri1 = String.valueOf(integer); //將整形轉換為字串型別
String strl1 = String.valueOf(LongInt); //將長整型轉換為字串型別
String strf1 = String.valueOf(f); //將單精度浮點型轉換為字串型別
String strd1 = String.valueOf(d); //將double型別轉換為字串型別
String strbt1 = String.valueOf(bt); //將byte轉換為字串型別
String strch1 = String.valueOf(ch); //將字元型轉換為字串型別
}
}
整理完三個方法我覺得需要來個中場休息,比如。。。放張圖片舒服一下。。。
程式設計師牛逼!!!
然後繼續整理後面的三個方法。。。
四、字串查詢
我們有時候需要在一段很長的字串中查詢我們需要的其中一部分字串或者某個字元,String類恰恰提供了相應的查詢方法,這些方法返回的都是目標查詢物件在字串中的索引值,所以都是整形值。具體分類情況如下:
字串查詢無非分為兩類:查詢字串和查詢單個字元,而查詢又可分為查詢物件在字串中第一次出現的位置和最後一次出現的位置,再擴充套件一步,我們可以縮小查詢範圍,在指定範圍之內查詢其第一次或最後一次出現的位置。
(1)查詢字元出現的位置
1、indexOf()方法
格式:1、str.indexOf(ch);
2、str.indexOf(ch,fromIndex); //包含fromIndex位置
格式1返回指定字元在字串中第一次出現位置的索引
格式2返回指定索引位置之後第一次出現該字元的索引號
2、lastIndexOf()方法
格式:1、str.lastIndexOf(ch);
2、str.lastIndexOf(ch,fromIndex);
格式1返回指定字元在字串中最後一次出現位置的索引
格式2返回指定索引位置之前最後一次出現該字元的索引號
(2) 查詢字串出現的位置
1、indexOf()方法
格式:1、str.indexOf(str);
2、str.indexOf(str,fromIndex);
格式1返回指定子字串在字串中第一次出現位置的索引
格式2返回指定索引位置之前第一次出現該子字串的索引號
2、lastIndexOf()方法
格式:1、str.lastIndexOf(str);
2、str.lastIndexOf(str,fromIndex);
格式1返回指定子字串在字串中最後一次出現位置的索引
格式2返回指定索引位置之前最後一次出現該子字串的索引號
看程式碼:
//字元與字串查詢
public class StringSearchChar {
public static void main(String args[]){
String str = "How qi bocome handsome like qi ge"; //定義一個長字串
System.out.println("該字串為:"+str);
/***1、indexOf()方法查詢字元首個出現位置格式1,2***/
int index1 = str.indexOf(" "); //找到第一個空格所在的索引
int index2 = str.indexOf(" ",4); //找到索引4以後的第一個空格所在索引
System.out.println("第一個空格所在索引為:"+index1);
System.out.println("索引4以後的第一個空格所在索引為:"+index2);
System.out.println("*****************");
/***2、lastIndexOf()方法查詢字元最後出現位置格式1,2***/
int index3 = str.lastIndexOf(" "); //找到最後一個空格所在的索引
int index4 = str.lastIndexOf(" ",10);//找到索引10以後的第一個空格所在索引
System.out.println("最後一個空格所在索引為:"+index3);
System.out.println("索引10以前最後一個空格所在索引為:"+index4);
System.out.println("*****************");
/***3、indexOf()方法查詢子字串第一次出現位置格式1,2***/
int index5 = str.indexOf("qi"); //找到"qi"子字串第一次出現位置的索引
int index6 = str.indexOf("qi",5);//找到索引5以後子字串"qi"第一個出現位置所在索引
System.out.println("子字串qi第一次出現位置的索引號為:"+index5);
System.out.println("索引5以後子字串qi第一次出現位置的索引號為:"+index6);
System.out.println("*****************");
/***4、lastIndexOf()方法查詢子字串最後一次出現位置格式1,2***/
int index7 = str.lastIndexOf("qi");
int index8 = str.lastIndexOf("qi",5);
System.out.println("子字串qi最後一次出現位置的索引號為:"+index7);
System.out.println("索引號5以後子字串qi最後一次出現位置的索引號為:"+index8);
}
}
結果截圖如下:
五、擷取與拆分
這類方法是截取出一個長字串中的一個子字串或將字串按照正則表示式的要求全部拆分儲存到一個字串陣列中。具體方法如下所示:
(1) 擷取方法
1、substring()方法
格式1:String result = str.substring(index);
格式2:String result = str.substring(beginIndex,EndIndex);//實際索引號[beginIndex,EndIndex-1]
結果:截取出範圍內的字串
(2)拆分方法
1、split()方法
格式1 :String strArray[] = str.split(正則表示式);// 拆分的結果儲存到字串陣列中
格式2:String strArray[] = str.split(正則表示式,limit);
程式碼示例如下:
//字串擷取與拆分
public class StringCutAndSplit {
public static void main(String args[]){
String str = "How to cut and split strings"; //定義字串
System.out.println("字串為:"+str);
int length = str.length(); //獲取字串長度,儲存到變數中
System.out.println("字串長度為:"+length);
/***1、substring()方法截取出第一個單詞和最後一個單詞***/
//首先配合indexOf()和lastIndexOf()方法找到第一個單詞和最後一個單詞前後空格的索引號
//第一個單詞的左範圍索引為0,最後一個單詞的右範圍索引為length-1
int firstIndex = str.indexOf(' '); //找到第一個空格所在位置
int lastIndex = str.lastIndexOf(' '); //找到最後一個空格所在位置
System.out.println("第一個空格的索引號為:"+firstIndex);
System.out.println("最後一個空格的索引號為:"+lastIndex);
//利用substring()方法根據第一個和最後一個單詞的索引範圍截取出第一個和最後一個單詞
String firstWord = str.substring(0,firstIndex); //截取出第一個單詞
String lastWord = str.substring(lastIndex+1,length);//截取出最後一個單詞
System.out.println("第一個單詞為:"+firstWord);
System.out.println("最後一個單詞為:"+lastWord);
/***1、split()方法拆分出所有單詞***/
String stringArray[] = str.split(" "); //根據空格要求拆分出所有單詞儲存到字串陣列中
System.out.println("拆分之後的各個詞彙為:"); //輸出提示資訊
for(int i = 0;i<stringArray.length;i++){
System.out.print(stringArray[i]+"\t");
}
}
}
程式碼執行結果如下:
六、替換或修改
終於到最後一類方法了,開心!!有時候我們需要對原字串中的某些子字串進行替換或修改,此時也需要String類提供的一些簡單快捷好用的方法啦
(1)concat()方法合併字串
格式:String result = str1.concat(str2); //將str1和str2合併
(2) toLowerCase()方法 將字元全部轉化為小寫
格式: String result = str.toLowerCase();
(3) toUpperCase()方法 將字元全部轉化為大寫
格式:String result = str.toUpperCase();
(4)replaceAll()、replaceFirst()方法:需要匹配正則表示式
程式碼如下:
//字串替換與修改
public class StringFindandReplace {
public static void main(String args[]){
String str1 = "vbasic";
String str2 = "Vbasic";
System.out.println("str1 = "+str1);
System.out.println("str2 = "+str2);
/***1、concat()方法將兩字串合併***/
String str3 = str1.concat(str2);
System.out.println("str1和str2合併後的字串為:"+str3);
/***2、toLowerCase()方法將str1字元全部轉換為小寫***/
String str4 = str1.toLowerCase();
System.out.println("str1的字元全部轉換為小寫:"+str4);
/***3、toUpperCase()方法將str2字元全部轉換為大寫***/
String str5 = str2.toUpperCase();
System.out.println("str2的字元全部轉換為大寫:"+str5);
/***4、實現字串的替換,原字串內容不變***/
String str6 = str1.replaceFirst("(?i)VBASIC","C++");
String str7 = str2.replaceFirst("(?-i)VBASIC","C++");
System.out.println("替換後的str1:"+str6);
System.out.println("替換後的str2:"+str7);
}
}
程式碼執行結果截圖:
結束語
肝了兩個晚上總算是把String類中的一些基本操作方法給整理完了,我覺得做一件事從一開始的激情到後來慢慢的潦草再到最後的堅持幹完,努力追求進步的過程其實真的挺寂寞的,但是有什麼辦法呢?選擇好的道路總會有開心與苦澀,堅持走下去吧,大不了用Java new()一個物件陪你一起走下去嘛,明天終於可以偷偷溜回家過五一啦,嘿嘿!!