按正則表達式分割字符串,返回字符串數組。實戰範例:費用單據驗證中提取費用 ID 列表。
private boolean isSameSelCode(Fbillconfirm fbillconfirm, HashMap outputParam) {
String strExpenseID = new String();
Fbillconfirmdetail[] fbillconfirmdetail = fbillconfirm.getFbillconfirmdetail();
if (fbillconfirmdetail != null && fbillconfirmdetail.length > 0) {
for (int i = 0; i < fbillconfirmdetail.length; i++) {
// 非 Delete 狀態需校驗費用
if (!Constants.DELETED.equals(fbillconfirmdetail[i].getRowstate())) {
strExpenseID += fbillconfirmdetail[i].getFbcd_expense_id() + ";";
}
}
}
// 分割字符串為數組傳參
String[] strExpenseIDs = strExpenseID.split(";");
if (strExpenseIDs.length > 0) {
return EpenseSigned.checkSelCode(strExpenseIDs);
} else {
return true;
}
}
比較字符串內容而非引用。注意:調用者不能為 null,否則拋 NullPointerException。建議用 "constant".equals(variable) 模式避免空指針。
提取指定範圍子串,左閉右開 [begin, end)。常用於解析固定格式字符串(如日期、編碼)。
public static void splitString() {
String strUser = "Zhangshan,Lisi,Wangma";
String[] strsUser = strUser.split(",");
for (int i = 0; i < strsUser.length; i++) {
System.out.println(strsUser[i]);
}
}
// 輸出:
// Zhangshan
// Lisi
// Wangma
String str = "";:字面量方式,指向字符串常量池中的對象(棧中引用,入池)。String str = new String();:new 方式,在堆中創建新對象(不入池)。== 比較引用地址,equals() 比較內容。字面量相同內容指向同一池對象,new 每次創建新對象。String[] str 數組必須預定義長度,否則無法直接賦值 str[i] = "123"(報 NullPointerException)。String[] str = new String[5]; 或 String[] str = {"a","b"}; 直接指向已存在數組。| 操作 | 含義 | 風險 |
|---|---|---|
strA.equals(strB) | 比較內容 | strA 不能為 null,否則 NPE |
strA == strB | 比較引用地址(指針值) | 字面量可能相等,new 對象必不相等 |
strA.equals(strB)(文中筆誤重複) | 應為 strA == strB 比較對象值? | 實際上 == 比引用,equals 比內容 |
正確認知:== 比引用,equals() 比內容。字符串常量池機制導致字面量 == 可能為 true,但永遠不要用 == 比較字符串內容。
split("\\.") 分割點號,split("\\|") 分割管道符。split(",", 2) 最多分割成 2 段。"a,b,".split(",") 返回 ["a","b"](Java 8+ 默認丟棄尾部空串),split(",", -1) 保留空串 ["a","b",""]。"" 創建字符串,利用常量池節省內存。StringBuilder/StringBuffer,避免大量臨時對象。equals(),且把常量放前面:"YES".equals(input)。