## 一、概述
一般程序需要處理大量文本數據,Java 語言的文本數據被保存為字符或字符串類型。
* Java 提供了 String 類來創建和操作字符串。但是,String 類是不可變類,即一旦一個 String 對象被創建以后,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷毀。
* Java 同時提供了兩個可變字符串類 StringBuffer 和 StringBuilder,兩者功能基本相似,方法也差不多。不同的是,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現線程安全功能,所以性能略高。
因此在通常情況下,如果需要創建一個內容可變的字符串對象,則應該優先考慮使用 StringBuilder 類。
## 二、String 類
在 Java 中定義一個字符串最簡單的方法是用雙引號把它包圍起來。這種用雙引號括起來的一串字符實際上都是 String 對象,如字符串`Hello`在編譯后即成為 String 對象。
不論使用哪種形式創建字符串,字符串對象一旦被創建,其值是不能改變的,但可以使用其他變量重新賦值的方式進行更改。
### 2.1 直接定義字符串
直接定義字符串是指使用雙引號表示字符串中的內容,具體方法是用字符串常量直接初始化一個 String 對象,如下:
```
String str = "hello, world";
```
### 2.2 使用 String 類定義
* `String()`初始化一個新創建的 String 對象,表示一個空字符序列。
* `String(String original)`初始化一個新創建的 String 對象,使其表示一個與參數相同的字符序列。
* `String(char[] value)`分配一個新的字符串,將參數中的字符數組元素全部變為字符串。
### 2.3 String 常用方法
* `int length()`返回當前字符串的長度
* `int indexOf(int ch)`查找 ch 字符在該字符串中第一次出現的位置
* `int indexOf(String str)`查找 str 子字符串在該字符串中第一次出現的位置
* `int lastIndexOf(int ch)`查找 ch 字符在該字符串中最后一次出現的位置
* `int lastIndexOf(String str)`查找 str 子字符串在該字符串中最后出現的位置
* `char charAt (int index)`獲取字符串中指定位置的字符
* `boolean equals(Object obj)`將該字符串與指定對象比較,返回 true 或 false
* `boolean equalsIgnoreCase(String obj)`將該字符串與指定對象比較(忽略大小寫)返回 true 或 false
* `String ?substring(int beginIndex)`獲取從 beginIndex 位置開始到結束的子字符串
* `String substring(int beginIndex, int endIndex)`獲取從 beginIndex 位置開始到 endIndex - 1位置的子字符串
* `String toLowerCase()`返回一個新字符串,將原始字符串中的大寫字母改為小寫
* `String toUpperCase()`返回一個新字符串,將原始字符串中的小寫字母改成大寫
* `String trim()`返回一個新字符串,刪除了原始字符串頭部和尾部的空格
* `byte[] getBytes()`將該字符串轉換為 byte 數組
【閱讀】給出如下語句,以下結果是()
```
String str = "Hello, Dodoke";
str = str.substring(2, 5);
char ch = str.charAt(str.length());
System.out.println(ch);
```
【閱讀】給出如下語句:以下結果是()
```
String str = "abcdefg";
char ch = str.substring(3, 6).charAt(1);
System.out.println(ch);
```
【選擇】關于字符串的 equals() 和 compareTo() 方法,選項中描述錯誤的是()(選擇一項)
```
A 方法 equals() 比較兩個字符串內容是否相等
B 方法 compareTo() 比較兩個字符串大小
C 方法 equals() 返回值是 boolean 類型的值
D 方法 compareTo() 返回值是 String 類型的值
```
【編程】使用 String 類常用方法完成字符串處理。
```
public class StringDemo {
public static void main(String[] args) {
/**
* 已知字符串"abcdefg",使之經過處理得到字符串"CDE"
* 并進一步將"DE"替換為",得到結果:CMM
*/
}
}
```
【選擇】已知字符串的定義如下:以下哪個語句不能將字符串轉換成 byte 數組()(選擇一項)
```
String str = "Hello, Dodoke";
```
```
A byte[] arr = str.getBytes();
B byte[] arr = str.getBytes("GBK");
C byte[] arr = str.getBytes("UTF-8");
D byte[] arr; str.getBytes(arr, "GBK");
```
【選擇】給出如下語句:下面哪個選項返回值為 true()(選擇一項)
```
String s1 = new String("dodoke");
String s2 = new String("dodoke");
char c[] = {'d', 'o', 'd', 'o', 'k', 'e'};
```
```
A s1.equals(s2);
B s1.equals(c);
C s1.equals(new String());
D s1 == c;
```
【選擇】下列運行結果是 false 的是()(選擇一項)
```
String str1 = "dodoke";
String str2 = "dodoke";
String str3 = new String("dodoke");
```
```
A System.out.println(str1.equals(str2));
B System.out.println(str1.equals(str3));
C System.out.println(str1 == str2);
D System.out.println(str1 == str3);
```
### 2.4 字符串的不可變性
String 類是不可變類,即一旦一個 String 對象被創建以后,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷毀。
【選擇】已知如下代碼:以下哪個說法是正確的()(選擇兩項)
```
String str1 = new String("hello");
String str2 = "hello";
System.out.println(str1.concat(str2));
System.out.println(str1);
```
```
A str1.equals(str2) 的結果為 true
B 輸出結果為:hellohello hellohello
C str1 == str2 的結果為 true
D 輸出結果為:hellohello hello
```
## 三、StringBuilder 類
Java 提供了兩個可變字符串類 StringBuffer 和 StringBuilder。創建 StringBuilder 類的對象后可以隨意修改字符串的內容。每個 StringBuilder 類的對象都能夠存儲指定容量的字符串,如果字符串的長度超過了 StringBuilder 類對象的容量,則該對象的容量會自動擴大。
### 3.1 StringBuilder 構造方法
StringBuilder 類提供了 3 個構造方法來創建一個字符串,如下所示:
* `StringBuilder()`構造一個空的字符串緩沖區,并且初始化為 16 個字符的容量。
* `StringBuilder(int length)`創建一個空的字符串緩沖區,并且初始化為指定長度 length 的容量。
* `StringBuilder(String str)`創建一個字符串緩沖區,并將其內容初始化為指定的字符串內容 str,字符串緩沖區的初始容量為 16 加上字符串 str 的長度。
```
// 定義一個空的字符串緩沖區,含有16個字符的容量
StringBuilder str1 = new StringBuilder();
// 定義一個含有10個字符容量的字符串緩沖區
StringBuilder str2 = new StringBuilder(10);
// 定義一個含有(16+4)的字符串緩沖區,"青春無悔"為4個字符
StringBuilder str3 = new StringBuilder("青春無悔");
/**
* 輸出字符串的容量大小
* capacity()方法返回字符串的容量大小
*/
System.out.println(str1.capacity()); //輸出 16
System.out.println(str2.capacity()); //輸出 10
System.out.println(str3.capacity()); //輸出 20
```
### 3.2 StringBuilder 常用方法
* `append(String str)`:用于向原有 StringBuilder 對象中追加字符串
```
StringBuilder builder = new StringBuilder("hello,"); //創建一個 StringBuilder 對象
String str = "World!";
buffer.append(str); //向 StringBuilder 對象追加 str 字符串
System.out.println(buffer.substring(0)); //輸出:Hello,World!
```
* `setCharAt(int index, char ch)`:用于在字符串的指定索引位置替換一個字符
```
StringBuilder sb = new StringBuilder("hello");
sb.setCharAt(1,'E');
System.out.println(sb); //輸出:hEllo
sb.setCharAt(0,'H');
System.out.println(sb); //輸出:HEllo
sb.setCharAt(2,'p');
System.out.println(sb); //輸出:HEplo
```
* `reverse()`:用于將字符串序列用其反轉的形式取代
```
StringBuilder sb = new StringBuilder("java");
sb.reverse();
System.out.println(sb); //輸出:avaj
```
* `deleteCharAt(int index)`:用于移除序列中指定位置的字符
```
StringBuilder sb = new StringBuilder("She");
sb.deleteCharAt(2);
System.out.println(sb); //輸出:Se
```
* `delete(int start, int end)`:用于移除序列中子字符串的字符
```
StringBuilder sb = new StringBuilder("hello jack");
sb.delete(2,5);
System.out.println(sb); //輸出:he jack
sb.delete(2,5);
System.out.println(sb); //輸出:heck
```
【閱讀】給出如下語句,代碼的輸出結果是()
```
StringBuilder s = new StringBuilder("abcdefg");
s.delete(2, 4).insert(3, "CD");
System.out.println(s.toString());
```
【編程】給出如下語句:第三行填寫什么代碼,可以得到輸出結果`123abc 123abc`
```
StringBuilder sb1 = new StringBuilder("123");
String s1 = "123";
// ...
System.out.println(sb1 + "" + s1);
```
【編程】定義一個字符串,利用 StringBuilder 完成如下效果。
```
歡迎來到dodoke
刪除插入后:你好,dodoke
替換后:歡迎來到dodoke
```
```
public class StringTest {
public static void main(String[] args) {
// 定義一個字符串"歡迎來到"
// 在"歡迎來到"后面添加內容,將字符串變成"歡迎來到dodoke"
// 使用delete方法刪除"歡迎來到",然后插入“你好!”
// 將字符串變成“你好,dodoke”
// 使用replace方法替換
}
}
```
【編程】定義一個字符串,使用StringBuilder的常用方法對字符串進行操作。
```
public class StringTest {
public static void main(String[] args) {
// 定義字符串"abc"
// 經過處理得到字符串"fed---cba"
// 進一步變換得到字符串"fedcba"
}
}
```
【閱讀】給出如下語句,代碼的輸出結果是()
```
public class Test {
public static void main(String[] args) {
Integer x = 400;
Integer y = x;
x++;
StringBuilder sb1 = new StringBuilder("123");
StringBuilder sb2 = sb1;
sb1.append("5");
System.out.println((x == y) + " " + (sb1 == sb2))
}
}
```
- 階段一 Java 零基礎入門
- 步驟1:基礎語法
- 第01課 初識
- 第02課 常量與變量
- 第03課 運算符
- 第04課 選擇結構
- 第05課 循環結構
- 第06課 一維數組
- 第08課 方法
- 第09課 數組移位與統計
- 第10課 基礎語法測試
- 第09課 基礎語法測試(含答案)
- 步驟2:面向對象
- 第01課 類和對象
- 第02課 封裝
- 第03課 學生信息管理
- 第04課 繼承
- 第05課 單例模式
- 第06課 多態
- 第07課 抽象類
- 第08課 接口
- 第09課 內部類
- 第10課 面向對象測試
- 第10課 面向對象測試(含答案)
- 步驟3:常用工具類
- 第01課 異常
- 第02課 包裝類
- 第03課 字符串
- 第04課 集合
- 第05課 集合排序
- 第06課 泛型
- 第07課 多線程
- 第08課 輸入輸出流
- 第09課 案例:播放器
- 第10課 常用工具測試(一)
- 第10課 常用工具測試(一)(答案)
- 第10課 常用工具測試(二)
- 第10課 常用工具測試(二)(答案)
- 階段二 從網頁搭建入門 JavaWeb
- 步驟1:HTML 與 CSS
- 第01課 HTML 入門
- 第01課 HTML 入門(作業)
- 第02課 CSS 入門
- 第02課 CSS 入門(作業)
- 第03課 CSS 布局
- 第03課 CSS 布局(作業)
- 步驟2:JavaScript 與前端案例
- 第01課 JavaScript 入門
- 第01課 JavaScript 入門(作業)
- 第02課 仿計算器
- 第03課 前端油畫商城案例
- 第04課 輪播圖
- 第05課 網頁搭建測試
- 第05課 網頁搭建測試(含答案)
- 步驟3:JavaScript 教程
- 入門
- 概述
- 基本語法
- 數據類型
- 概述
- 數值
- 字符串
- undefined, null 和布爾值
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 位運算符
- 運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 標準庫
- String
- Date
- Math
- DOM
- 概述
- Document 節點
- 事件
- EventTarget 接口
- 事件模型
- 常見事件
- 階段三 數據庫開發與實戰
- 步驟1:初始數據庫操作
- 第01課 數據類型
- 第02課 表的管理
- 第03課 數據管理
- 第04課 常用函數
- 第05課 JDBC 入門
- 第06課 Java 反射
- 第07課 油畫商城
- 第08課 數據庫基礎測試
- 步驟2:MyBatis 從入門到進階
- 第01課 IntelliJ IDEA 開發工具入門
- 第02課 Maven 入門
- 第03課 工廠模式
- 第04課 MyBatis 入門
- 第05課 MyBatis 進階
- 第06課 商品信息管理
- 第07課 MyBatis 基礎測試
- 步驟3:Redis 數據庫與 Linux 下項目部署
- 第01課 Linux 基礎
- 第02課 Linux 下 JDK 環境搭建及項目部署
- 第03課 Redis 入門
- 階段四 SSM 到 Spring Boot 入門與綜合實戰
- 步驟1:Spring 從入門到進階
- 第01課 Spring 入門
- 第02課 Spring Bean 管理
- 第03課 Spring AOP
- 第04課 基于 AspectJ 的 AOP 開發
- 第05課 JDBC Template
- 第06課 Spring 事務管理
- 第07課 人員管理系統開發
- 第08課 Spring 從入門到進階測試
- 步驟2:Spring MVC 入門與 SSM 整合開發
- 第01課 Spring MVC 入門與數據綁定
- 第02課 Restful 風格的應用
- 第03課 SpringMVC 攔截器
- 第04課 辦公系統核心模塊
- 步驟3:Spring Boot 實戰
- 第01課 Spring Boot 入門
- 第02課 校園商鋪項目準備
- 第03課 校園商鋪店鋪管理
- 第04課 校園商鋪商品管理及前臺展示
- 第05課 校園商鋪框架大換血
- 步驟4:Java 面試
- 第01課 面試準備
- 第02課 基礎面試技巧
- 第03課 Web基礎與數據處理
- 第04課 主流框架