## 一、概述
一般程序需要处理大量文本数据,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课 主流框架