字符串(String)
字符串是由字符組成的有限序列,在計算機中通常以字符數組形式存儲,支持拼接、查找、替換等操作。
簡介
字符串是計算機科學中最常用的數據類型之一,由一系列字符組成的有限序列。在大多數編程語言中,字符串被作為基本數據類型或者對象提供,用于表示文本。從本質上講,字符串可以看作是一個數組,但與普通數組不同,字符串有特殊的屬性和操作方法,更適合處理文本數據。在 Java 等現代編程語言中,字符串是不可變的對象,一旦創建,其內容不可被修改。
核心特性
- 不可變性:在 Java 中,字符串一旦創建,其值不可被修改
- 字符序列:由多個字符按順序排列組成
- 索引訪問:可以通過索引訪問單個字符,索引從0開始
- 字符串池:Java 中常量字符串會被存儲在字符串中以節省內存
- Unicode支持:可以包含任何 Unicode 字符,支持多語言文本
基本操作
// 創建字符串
String greeting = "你好,世界!";
String name = new String("Java編程");// 字符串長度
int length = greeting.length(); // 6// 連接字符串
String message = greeting + " 歡迎學習" + name;
String sameMassage = greeting.concat(" 歡迎學習").concat(name);// 訪問字符
char firstChar = greeting.charAt(0); // '你'// 獲取子字符串
String subStr = greeting.substring(0, 2); // "你好"// 字符串比較
boolean isEqual = greeting.equals("你好,世界!"); // true
boolean ignoreCase = "Java".equalsIgnoreCase("java"); // true// 查找
int index = message.indexOf("歡迎"); // 返回"歡迎"在字符串中首次出現的索引
boolean contains = message.contains("Java"); // true// 替換
String newStr = greeting.replace('你', '我'); // "我好,世界!"// 分割
String[] parts = "蘋果,香蕉,橙子".split(","); // ["蘋果", "香蕉", "橙子"]// 轉換大小寫(僅適用于拉丁字母)
String upper = "hello".toUpperCase(); // "HELLO"
String lower = "HELLO".toLowerCase(); // "hello"// 去除首尾空白
String trimmed = " hello ".trim(); // "hello"
優缺點
優點
- 易用性:提供了豐富的 API 和操作方法,處理文本更方便
- 國際化支持:支持 Unicode 字符集,可以處理各種語言的文本
- 內存優化:字符串池機制減少內存使用
應用場景
- 文本處理:處理用戶輸入,配置文件、日志等
- 數據解析:解析 JSON、XML、CSV等格式的數據
- 自然語言處理:文本分析、情感分析、機器翻譯等
- 網絡通信:http 請求參數、URL處理、網絡協議等
- 用戶界面:文本顯示、多語言支持等
擴展
StringBuilder、StringBuffer、String- String:不可變,適合作為常量使用
- StringBuilder:可變,非線程安全,適合單線程下頻繁修改字符串
- StringBuffer:可變,線程安全,適合在多線程環境使用,但性能略低于 StringBuilder
熱門題目
- 14. 最長公共前綴
- 20. 有效的括號
- 415. 字符串相加
20. 有效的括號
給定一個只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
每個右括號都有一個對應的相同類型的左括號。
示例:
輸入:s = “()”
輸出:true
題解:
棧,后進先出(LIFO)
- 初始化一個空棧 stack
- 定義一個字典 mapping,用于記錄右括號與左括號的對應關系
- 遍歷字符串中的每一個字符:
- 如果是左括號,壓入棧
- 如果是右括號:
- 如果棧為空,說明沒有對應的左括號,返回 False
- 否則,彈出棧頂元素,比較是否是對應的左括號,不是則返回 False
- 遍歷結束后,檢查棧是否為空。如果棧為空,說明括號完全匹配,返回 True;反之說明有未匹配的左括號,返回 False
class Solution {public boolean isValid(String s) {// 使用 Deque 接口實現棧結構,效率優于 Stack 類Deque<Character> stack = new ArrayDeque<>();// 定義一個哈希表,用于存儲右括號到左括號的映射Map<Character, Character> mapping = new HashMap<>();mapping.put(')', '(');mapping.put('}', '{');mapping.put(']', '[');// 遍歷字符串中的每一個字符for (char c : s.toCharArray()) {// 如果當前字符是右括號if (mapping.containsKey(c)) {// 如果棧為空,說明沒有對應的左括號,直接返回 falseif (stack.isEmpty()) {return false;}// 彈出棧頂元素,并與當前右括號對應的左括號比較char top = stack.pop();if (mapping.get(c) != top) {return false;}} else {// 如果是左括號,直接壓入棧中stack.push(c);}}// 遍歷結束,如果棧為空,說明所有括號都正確匹配return stack.isEmpty();}
}
參考資料
[1] Hello 算法
[2] 算法導航