Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf94310a

Browse files
authored
String、StringBuffer、StringBuilder补充
部分读者说这里没说明白 “String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?” ,我重新讲了一遍1
1 parent38690a8 commitf94310a

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

‎面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,38 @@
55

66
**可变性**
77

8-
String类中使用字符数组:`private final char value[]`保存字符串,所以String对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[]value,这两种对象都是可变的。
9-
  
8+
9+
简单的来说:String 类中使用 final 关键字字符数组保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
10+
11+
StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 AbstractStringBuilder 实现的,大家可以自行查阅源码。
12+
13+
AbstractStringBuilder.java
14+
15+
```java
16+
abstractclassAbstractStringBuilderimplementsAppendable,CharSequence {
17+
char[] value;
18+
int count;
19+
AbstractStringBuilder() {
20+
}
21+
AbstractStringBuilder(intcapacity) {
22+
value=newchar[capacity];
23+
}
24+
```
25+
1026

1127
**线程安全性**
1228

13-
String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
29+
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilderStringBuilderStringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
1430

1531

1632
**性能**
1733

18-
每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
34+
每次对String类型进行改变的时候,都会生成一个新的String 对象,然后将指针指向新的String对象。StringBuffer 每次都会对StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
1935

2036
**对于三者使用的总结:**
21-
22-
- 如果要操作少量的数据用 = String
23-
- 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
24-
- 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
37+
1. 操作少量的数据=String
38+
2. 单线程操作字符串缓冲区下操作大量数据=StringBuilder
39+
3. 多线程操作字符串缓冲区下操作大量数据=StringBuffer
2540

2641
####String为什么是不可变的吗?
2742
简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以:

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp