Java 字符串操作之contains 和 substring 方法最佳實(shí)踐與常見問題
一、contains 方法詳解
1. 方法定義與語法
public boolean contains(CharSequence s)
- 功能:檢查字符串是否包含指定的字符序列
- 參數(shù):
CharSequence類型(String 實(shí)現(xiàn)了該接口) - 返回值:boolean 類型(true 表示包含,false 表示不包含)
2. 底層實(shí)現(xiàn)原理
// String 類中的實(shí)際實(shí)現(xiàn)
public boolean contains(CharSequence s) {
return indexOf(s.toString()) >= 0;
}
- 實(shí)際調(diào)用
indexOf()方法 - 如果找到子串返回索引位置(≥0),否則返回 -1
- 時(shí)間復(fù)雜度:O(n*m),n 是原字符串長度,m 是子串長度
3. 使用示例
String text = "Java programming is fun";
System.out.println(text.contains("pro")); // true
System.out.println(text.contains("Python")); // false
4. 注意事項(xiàng)
- 大小寫敏感:
"Hello".contains("hello")返回 false - 空字符串:
"abc".contains("")總是返回 true - null 參數(shù):會(huì)拋出 NullPointerException
二、substring 方法詳解
1. 方法重載
public String substring(int beginIndex) public String substring(int beginIndex, int endIndex)
2. 參數(shù)說明
| 參數(shù) | 說明 | 注意事項(xiàng) |
|---|---|---|
beginIndex | 起始索引(包含) | 必須 ≥0 且 ≤ 字符串長度 |
endIndex | 結(jié)束索引(不包含) | 必須 ≥ beginIndex 且 ≤ 字符串長度 |
3. 使用示例
String str = "HelloWorld"; // 從索引5開始到結(jié)尾 System.out.println(str.substring(5)); // "World" // 從索引0開始到5(不包含5) System.out.println(str.substring(0, 5)); // "Hello"
4. 常見錯(cuò)誤
// 索引越界 str.substring(10); // StringIndexOutOfBoundsException // 參數(shù)順序錯(cuò)誤 str.substring(5, 0); // StringIndexOutOfBoundsException
三、contains 和 substring 結(jié)合使用
1. 原代碼分析
public static String findSubstringWithContext(String text, String subString) {
if (text.contains(subString)) {
int startIndex = text.indexOf(subString);
int endIndex = startIndex + subString.length();
return text.substring(0, endIndex);
}
return "子串未找到";
}2. 問題診斷
- 功能不完整:只返回了子串前面的內(nèi)容,沒有返回后面的內(nèi)容
- 描述不符:方法名暗示返回"完整前后內(nèi)容",但實(shí)際只返回了前半部分
- 輸出格式:沒有明確區(qū)分前后文和子串本身
3. 改進(jìn)實(shí)現(xiàn)
public static String getSubstringContext(String text, String sub) {
if (!text.contains(sub)) {
return "未找到子串";
}
int start = text.indexOf(sub);
int end = start + sub.length();
String before = (start > 0) ? text.substring(0, start) : "";
String after = (end < text.length()) ? text.substring(end) : "";
return "前文: \"" + before + "\", 子串: \"" + sub + "\", 后文: \"" + after + "\"";
}4. 測試用例
String text = "這是一個(gè)測試字符串,用于測試子串出現(xiàn)的完整前后內(nèi)容。"; String subString = "測試"; System.out.println(getSubstringContext(text, subString)); // 輸出: 前文: "這是一個(gè)", 子串: "測試", 后文: "字符串,用于測試子串出現(xiàn)的完整前后內(nèi)容。"
四、其他重要字符串方法詳解
1. split 方法
String csv = "張三,20,男";
String[] parts = csv.split(","); // ["張三", "20", "男"]
- 正則表達(dá)式支持:
split("\\.")按點(diǎn)分割 - 限制分割次數(shù):
split(",", 2)只分割成兩部分
2. replace/replaceAll
String input = "a1b2c3";
String replaced = input.replaceAll("\\d", ""); // "abc"
replace:替換字符或字符序列replaceAll:使用正則表達(dá)式替換
3. trim 和 isEmpty
String userInput = " Hello World "; String trimmed = userInput.trim(); // "Hello World" boolean empty = trimmed.isEmpty(); // false
trim():移除首尾空白字符isEmpty():檢查長度是否為0
4. startsWith/endsWith
String filename = "document.txt";
boolean isTextFile = filename.endsWith(".txt"); // true
五、最佳實(shí)踐與常見問題
1. 字符串操作最佳實(shí)踐
- 空值檢查:始終檢查可能為 null 的字符串
- 索引邊界:使用 substring 前驗(yàn)證索引范圍
- 不可變性:字符串不可變,操作返回新對(duì)象
- 性能考慮:避免在循環(huán)中拼接字符串(使用 StringBuilder)
2. 常見問題解決方案
問題:contains 大小寫敏感
// 解決方案:統(tǒng)一轉(zhuǎn)換為小寫
if (text.toLowerCase().contains(sub.toLowerCase())) { ... }
問題:substring 索引計(jì)算錯(cuò)誤
// 正確計(jì)算結(jié)束索引 int endIndex = startIndex + subString.length();
問題:處理多字節(jié)字符(中文)
String chinese = "你好世界"; // substring 正確處理多字節(jié)字符 System.out.println(chinese.substring(0, 2)); // "你好"
3. 性能優(yōu)化技巧
// 當(dāng)需要多次檢查包含關(guān)系時(shí)
int index = text.indexOf(sub);
if (index != -1) {
// 直接使用index,避免二次查找
String before = text.substring(0, index);
// ...
}
六、完整示例代碼
public class StringOperations {
public static void main(String[] args) {
String text = "Java編程很有趣,Java是最好的編程語言之一";
String sub = "Java";
String context = getSubstringContext(text, sub);
System.out.println(context);
}
public static String getSubstringContext(String text, String sub) {
if (text == null || sub == null) {
return "輸入不能為null";
}
if (!text.contains(sub)) {
return "未找到子串: \"" + sub + "\"";
}
int start = text.indexOf(sub);
int end = start + sub.length();
String before = (start > 0) ? text.substring(0, start) : "[開頭]";
String after = (end < text.length()) ? text.substring(end) : "[結(jié)尾]";
return String.format("前文: \"%s\", 子串: \"%s\", 后文: \"%s\"", before, sub, after);
}
}輸出結(jié)果:
前文: "", 子串: "Java", 后文: "編程很有趣,Java是最好的編程語言之一"
總結(jié)
- contains 方法:
- 用于檢查字符串是否包含子串
- 底層基于 indexOf 實(shí)現(xiàn)
- 大小寫敏感,需注意匹配規(guī)則
- substring 方法:
- 用于截取字符串的指定部分
- 有兩種重載形式
- 必須正確處理索引邊界
- 結(jié)合使用:
- 先用 contains 檢查存在性
- 再用 indexOf 獲取位置
- 最后用 substring 提取前后文
- 注意處理邊界情況(開頭、結(jié)尾)
- 最佳實(shí)踐:
- 添加空值檢查
- 明確區(qū)分前后文
- 使用格式化輸出提高可讀性
- 考慮多字節(jié)字符支持
通過深入理解 contains 和 substring 方法的工作原理及結(jié)合使用技巧,您可以更有效地處理字符串操作任務(wù),編寫出健壯、高效的代碼。
到此這篇關(guān)于Java 字符串操作之contains 和 substring 方法最佳實(shí)踐與常見問題的文章就介紹到這了,更多相關(guān)java contains 和 substring使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中containsKey?、contains方法的使用及注意事項(xiàng)詳解
- Java中List的contains()方法的使用小結(jié)
- Java中的ArrayList和contains函數(shù)和擴(kuò)容機(jī)制(源碼詳解)
- Java中l(wèi)ist.contains()的用法及拓展
- Java中List.contains(Object?object)方法使用
- Java?String之contains方法的使用詳解
- Java contains用法示例
- Java中的substring()方法使用舉例詳解
- Java使用substring()截取(提取)子字符串
- JAVA中截取字符串substring用法詳解
相關(guān)文章
java如何將實(shí)體類轉(zhuǎn)換成json并在控制臺(tái)輸出
這篇文章主要介紹了java如何將實(shí)體類轉(zhuǎn)換成json并在控制臺(tái)輸出問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
spring boot openfeign從此和httpClient說再見詳析
這篇文章主要給大家介紹了關(guān)于spring boot openfeign從此和httpClient說再見的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-06-06
基于SpringBoot實(shí)現(xiàn)離線應(yīng)用的4種實(shí)現(xiàn)方式
在當(dāng)今高度依賴網(wǎng)絡(luò)的環(huán)境中,離線應(yīng)用的價(jià)值日益凸顯,而且具備離線工作能力已成為許多應(yīng)用的必備特性,本文將介紹基于SpringBoot實(shí)現(xiàn)離線應(yīng)用的4種不同方式2025-06-06
springboot調(diào)用C#封裝的DLL文件中函數(shù)的實(shí)現(xiàn)那
本文主要介紹了在Spring Boot中集成C# DLL,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Redis實(shí)現(xiàn)延遲隊(duì)列的全流程詳解
Redisson是Redis服務(wù)器上的分布式可伸縮Java數(shù)據(jù)結(jié)構(gòu),這篇文中主要為大家介紹了Redisson實(shí)現(xiàn)的優(yōu)雅的延遲隊(duì)列的方法,需要的可以參考一下2023-03-03
Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸)
這篇文章主要介紹了Java編程用棧來求解漢諾塔問題的代碼實(shí)例(非遞歸),具有一定參考價(jià)值,這里給大家分享下,供朋友們參考。2017-10-10

