关于immutable和mutable类型的比较

我刚开始是用String来把几个String连接起来的,

结果如下 ‘Runtime: 123 ms’ 这是源代码

1
2
3
4
5
6
7
8
9
10
public class Solution557 {
public String reverseWords(String s) {
String[] word = s.split(" ");
s = "";
for(int i = 0 ; i < word.length; i++) {
s += new StringBuilder(word[i]).reverse().toString() + " ";
}
return s.trim();
}
}

后来看了一下leetcode上面据说是最简洁的写法,对方用了StringBuilder,结果快了十倍以上

‘Runtime: 9 ms’

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Solution557 {
public String reverseWords(String s) {
String[] word = s.split(" ");
s = "";
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < word.length; i++) {
s += new StringBuilder(word[i]).reverse().toString() + " ";
sb.append(new StringBuilder(word[i]).reverse().toString() + " ");
}
return s.trim();
return sb.toString().trim();
}
}

我在网上找了找为什么会有这么大的差距,原来最大的差异是String是immutable(不可变)(BigInteger和BigDecimal也是不可变),而StringBuilder是mutable(可变的)。

那么什么是immuatable呢,immuatable类型说明当数据类型被定义并生成instance(实例)以后就无法改变了。

因为每个String1都是不可变的,这就是意味着这种写法相当于你每次执行String1 += String2的时候,你就要需要一个新的内存来保存String1。

StringBuilder是mutable,因此sb.append实在原来的内存的基础上来进行修改的,省去了重新申请内存的时间和空间的消耗。

参考

Effective Java Item 15: Minimise mutability

Why StringBuilder is much faster than String