参考文献:https://blog.csdn.net/weixin_34405557/article/details/89630362
参考文献:https://blog.csdn.net/Zen99T/article/details/51255418
Java中String的各种变更是非常常见的现象,那么它们的效率都是怎样的呢?
1. StringBuilder
StringBuilder是速度最快的字符串拼接方式,但是缺点是 线程不安全,所以在非多线程环境下,可以使用这种方式完成字符串拼接。
StringBuilder花费的时间:9
private void stringBuilder() {
long time = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 500000; i++) {
stringBuilder.append("0");
}
String stringBuilderString = stringBuilder.toString();
System.out.println("StringBuilder花费的时间:" + (System.currentTimeMillis() - time));
}
2. StringBuffer
StringBuffer和StringBuilder的用法是类似的,其效率比StringBuilder慢一些,但是现成安全。
StringBuffer花费的时间:13
private void stringBuffer() {
long time = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 500000; i++) {
stringBuffer.append("0");
}
String stringstringBufferString = stringBuffer.toString();
System.out.println("StringBuffer花费的时间:" + (System.currentTimeMillis() - time));
}
3. String直接拼接
String直接拼接 string1 + string2 这种方式,编译时会有两种解决方案:
- 如果是String a ="123" + "456"静态的写法,编译之后会直接认为成 String a ="123456",这种写法效率最高
- 但如果是 string b = "123"; String a = b + "456"; 那么会变成 StringBuffer.append("456").toString 模式。也就是说,如果只执行一次,那么直接加和使用StringBuffer的时间成本是一样的,但是如果循环增加,每一次循环,都会执行一次toString,这样效率就会特别低了
String拼接花费的时间:27499
private void string() {
long time = System.currentTimeMillis();
String string = "";
for (int i = 0; i < 500000; i++) {
string += "0";
}
System.out.println("String拼接花费的时间:" + (System.currentTimeMillis() - time));
}
4. 最快速的初始化一个全是指定字符的String
前文说的很清楚,那么如何快速初始化一个长度为50000,全为0的字符串呢?
StringBuilder的速度也赶不上直接初始化一个String的速度,可以初始化一个长度为50000的char数组,之后将数组初始化成String的速度是最快的。
StringDirectly直接初始化花费的时间:1
private void stringDirectly() {
long time = System.currentTimeMillis();
char[] chars = new char[50000];
String string = new String(chars).replace('\0', '0');
System.out.println("StringDirectly直接初始化花费的时间:" + (System.currentTimeMillis() - time));
}
5. 几个简单的问题,判断其地址是否相同
String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // true
System.out.println(s1 == s4); // false
System.out.println(s4 == s5); // false
System.out.println(s1 == s6); // true
System.out.println(s1 == s9); // false