Java中String与StringBuilder的比较及自定义不可变类型设计
立即解锁
发布时间: 2025-08-19 00:08:07 阅读量: 2 订阅数: 8 


Java编程实战:从基础到项目开发
### Java中String与StringBuilder的比较及自定义不可变类型设计
#### 1. String类常用方法
在Java中,String类提供了许多实用的方法,下面是一些常见方法的介绍:
| 方法名 | 描述 |
| --- | --- |
| `substring(int beginIndex, int endIndex)` | 返回字符串的子串,子串从指定的`beginIndex`开始,到`endIndex - 1`处的字符结束。索引从0开始。例如,`"Sean Kennedy".substring(3, 8)`返回`"n Ken"`。 |
| `toLowerCase()` | 将字符串转换为小写。 |
| `toUpperCase()` | 将字符串转换为大写。 |
| `trim()` | 去除字符串两端的空白字符。例如,`" lots of spaces here ".trim()`返回`"lots of spaces here"`。 |
#### 2. StringBuilder类介绍
`StringBuilder`类位于`java.lang`包中,它表示一个可变的字符序列。其API与`StringBuffer`类相同,但`StringBuilder`适用于单线程环境,而`StringBuffer`适用于多线程环境。`StringBuilder`实现了`Comparable`接口,其排序的自然顺序也是按字母顺序排列的。
`StringBuilder`是可变类型,并且是一个`final`类,这意味着不能对其进行子类化。Java设计者这样设计是为了确保`StringBuilder`对象的行为可预测。
下面是一个`StringBuilder`的示例代码:
```java
// 假设这是图12.10的代码
// 第49行
StringBuilder sb = new StringBuilder("The ");
// 第50行
sb.append("quick ");
// 第51行
System.out.println(sb); // 输出 "The quick "
// 第52行
sb.append("brown fox");
// 第53行
System.out.println(sb); // 输出 "The quick brown fox"
```
从这个示例可以看出,每次调用`append()`方法时,同一个`StringBuilder`对象都会被修改。
下面是`StringBuilder`类常用方法的表格:
| 方法名 | 描述 |
| --- | --- |
| `append(String str)` | 将指定的字符串追加到`StringBuilder`中。有重载版本(详见API)。 |
| `charAt(int index)` | 返回指定索引处的字符。索引从0开始。 |
| `indexOf(String str)` | 返回指定子字符串第一次出现的索引。 |
| `insert(int offset, String str)` | 在指定的偏移位置插入给定的字符串,将该位置以上的字符向上移动。 |
| `substring(int beginIndex)` | 返回一个新字符串,从指定的`beginIndex`开始,直到`StringBuilder`的末尾。索引从0开始。 |
| `substring(int beginIndex, int endIndex)` | 返回一个新字符串,从指定的`beginIndex`开始,到`endIndex - 1`处的字符结束。索引从0开始。 |
| `toString()` | 返回字符序列的字符串表示形式。 |
#### 3. String与StringBuilder的比较示例
为了更清晰地展示`String`和`StringBuilder`的区别,下面是一个示例代码:
```java
// 假设这是图12.12的代码
class Main {
public static void main(String[] args) {
// 第11行
String s = "Hi";
StringBuilder sb = new StringBuilder("Hi");
// 第13行
whatHappens(s, sb);
// 第14行
System.out.println("String s: " + s);
System.out.println("StringBuilder sb: " + sb);
}
public static void whatHappens(String s, StringBuilder sb) {
// 第5行
s = s + " there!";
// 第7行
System.out.println("Inside method, new s: " + s);
// 第6行
sb.append(" there!");
// 第8行
System.out.println("Inside method, sb: " + sb);
}
}
```
在这个示例中,`String`对象是不可变的,当对其进行拼接操作时,JVM会创建一个新的对象;而`StringBuilder`对象是可变的,对其进行`append()`操作时,原对象会被直接修改。
下面是这个示例的内存表示流程图:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B(声明s和sb):::process
B --> C(调用whatHappens方法):::process
C --> D{操作类型}:::process
D -->|String拼接| E(创建新的String对象):::process
D -->|StringBuilder追加| F(修改原StringBuilder对象):::process
E --> G(输出新的String):::process
F --> H(输出修改后的StringBuilder):::process
G --> I(返回main方法):::process
H --> I
I --> J(输出s和sb):::process
J --> K([结束]):::startend
```
#### 4. 自定义不可变类型设计
在Java中,有可变类型(如`StringBuilder`和`ArrayList`)和不可变类型(如`String`和`Integer`)。当一个对象是“不可变”的,意味着它不能被改变。可以使用`final`关键字使基本类型的值不可变,但当`final`应用于引用时,是引用本身不可变,而不是对象不可变。
如果想创建自己的不可变类型(类),需要考虑以下几点:
1. **不提供“setter”方法**:避免外部代码修改对象的状态。
2. **将所有字段设为私有和`final`**:确保字段不能被外部直接访问和修改,并且一
0
0
复制全文
相关推荐










