java字符串操作_Java的字符串操作
Java的字符串操作
小型送分題:Java有字符串(String),StringBuffer(字符串緩存),StringBuilder(字符串建造者?)各種實現,究其原因還是歷史上的各種坑。
一、不同字符串操作的對比
字符串操作
定義
內存分配
可變性
線程安全性
性能
C/C++ 中的char* 操作
char *是一個指針,可以指向一個字符串數組
由系統處理
可變
不可知
高效,都是直接對內存空間進行操作
C/C++中的char數組
是一個字符數組
手動釋放
不可變
不可知
高效,都是直接對內存空間進行操作
C/C++中的String封裝類
string可以被看成是以字符為元素的一種容器。
手動釋放
可變
并發的讀操作是線程答安全的。
較char指針和char數組低效
Java中的String
String 類中使用 final 關鍵字修飾字符數組來保存字符串
系統處理
不可變
線程安全
每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象。
Java中的StringBuilder
字符串變量
系統處理
可變
線程不安全
StringBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升
Java中的StringBuffer
字符串變量
系統處理
可變
線程安全
StringBuilder > StringBuffer > String
1.1 C++中const修飾指針
以*為界,左物右指
const在星號的左邊,是被指向的常量不可變
const在星號的右邊,是指針的指向不可變
說明
左
右
定義
指向const常量值的指針
const常量指針
解釋
當const在*的左邊時,實際物體值不變
指針本身成為一個const指針,必須把const標明的部分放在*的右邊
示例
const int * x;
int const * x;//兩者是一致的
int * const p = 地址 // 因為P 所指向的地址是不能被修改的,所以必須被初始化
\2. 小型送分題:請自己設計一整套測試程序,測試演示說明以上各種字符串類型的效率差別(條件不足的可以省略C/C++部分)。
二、 Java字符串操作類的性能比較
2.1 具體代碼
package stringTest;
/**
* @Description 測試字符串操作類的效率
* @Author 林澤鴻
* @Date 2020/4/24 20:55
*/
class StringEntities {
private static final int COUNTS = 10*10000;
/***
* 測試String拼接字符串添加操作時間
*/
public static void testString(){
System.out.print("Start to test String -> ");
long startTime = System.currentTimeMillis();
String strResult = "";
for(int i = 0; i< COUNTS; i++){
strResult += i;
}
long endTime = System.currentTimeMillis();
// 統計循環整個過程時間
System.out.println("Total time of String operation i: "+ (endTime - startTime));
}
/**
* 測試StringBuffer拼接字符串添加操作時間
*/
public static void testStringBuffer(){
System.out.print("Start to test StringBuffer -> ");
long startTime = System.currentTimeMillis();
StringBuffer strResult = new StringBuffer();
for(int i = 0; i< COUNTS; i++){
strResult.append(i);
}
long endTime = System.currentTimeMillis();
// 統計循環整個過程時間
System.out.println("Total time of StringBuffer operation is: "+ (endTime - startTime));
}
/**
* 測試StringBuilder拼接字符串添加操作時間
*/
public static void testStringBuilder(){
System.out.print("Start to test StringBuilder -> ");
long startTime = System.currentTimeMillis();
StringBuilder strResult = new StringBuilder();
for(int i = 0; i< COUNTS; i++){
strResult.append(i);
}
long endTime = System.currentTimeMillis();
// 統計循環整個過程時間
System.out.println("Total time of StringBuilder operation is:: "+ (endTime - startTime));
}
}
public class test {
public static void main(String[] args) {
StringEntities.testString();
StringEntities.testStringBuffer();
StringEntities.testStringBuilder();
}
}
2.2 測試結果
2.3 小結
可見,String類操作字符串十分消耗性能,StringBuilder比StringBuffer的效率略高。
\3. 小型送分題:請完成如下功能,使用正則表達式測試從字符串中識別
三、正則表達式的匹配
a) 郵編號碼
b) 區號-座機號碼
c) 手機號碼
3.1 具體代碼
package stringTest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Description 正則表達式的測試
* @Author 林澤鴻
* @Date 2020/4/24 22:28
*/
public class RegularExpression {
public static void main(String[] args) {
// 要驗證的字符串
//郵政編碼
String zipCodeStr = "515160";
//區號-座機號碼
String areaCodeStr = "020-12345678";
//手機號碼
String phoneStr = "13633224466";
//郵政編碼
String zipCodeRegEx = "^[1-9]\\d{5}$";
//區號-座機號碼
String areaCodeRegEx = "\\d{3}-\\d{8}|\\d{4}-\\d{7}";
//手機號碼
String phoneRegEx = "^(?:13\\d|15\\d|18\\d)\\d{5}(\\d{3}|\\*{3})$";
System.out.println("下面進行驗證的三個字符串分別均是正確的郵政編碼,區號-座機號碼和手機號碼");
System.out.println("驗證是否是郵政編碼");
System.out.println(isMatch( zipCodeStr,zipCodeRegEx));
System.out.println(isMatch( areaCodeStr,zipCodeRegEx));
System.out.println(isMatch( phoneStr,zipCodeRegEx));
System.out.println("驗證是否是區號-座機號碼");
System.out.println(isMatch( zipCodeStr,areaCodeRegEx));
System.out.println(isMatch( areaCodeStr,areaCodeRegEx));
System.out.println(isMatch( phoneStr,areaCodeRegEx));
System.out.println("驗證是否是手機號");
System.out.println(isMatch( zipCodeStr,phoneRegEx));
System.out.println(isMatch( areaCodeStr,phoneRegEx));
System.out.println(isMatch( phoneStr,phoneRegEx));
}
static boolean isMatch(String str ,String regEx ){
// 編譯正則表達式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小寫的寫法
Matcher matcher = pattern.matcher(str);
// 字符串是否與正則表達式相匹配
boolean isMatch = matcher.matches();
return isMatch;
}
}
3.2 測試結果
參考資料
總結
以上是生活随笔為你收集整理的java字符串操作_Java的字符串操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java access group by
- 下一篇: java float 转double_将