网上的JAVA面试题经常有两个String 字符串相加没有 StringBuffer.append();速度高
但是很少有说明原因的。
所以自己做了个小测试
源代码1
public class TestMain {
public static void main(String[] args) {
String test1="测试测试1";
String test2="测试测试2";
String test3=test1+test2;
System.out.println(test3);
}
}
结果编译后的class 然后再反编译 发现 代码已经被默认优化成
import java.io.PrintStream;
public class TestMain
{
public static void main(String args[])
{
String test1 = "测试测试1";
String test2 = "测试测试2";
String test3 = (new StringBuilder(String.valueOf(test1))).append(test2).toString();
System.out.println(test3);
}
}
源代码2
public static void main(String[] args) {
String test1="测试测试1";
String test2="测试测试2";
StringBuffer test3=new StringBuffer();
test3.append(test1);
test3.append(test2);
System.out.println(test3);
}
先编译再反编译
的结果跟以前一样
结果:
很明显 连个字符串 相加 最后都优化成了 StringBuilder的.append();
查了一下源代码
StringBuilder 类 和 StringBuffer 类都 继承于 AbstractStringBuilder
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
}
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
public StringBuilder append(String str) {
super.append(str);
return this;
}
}
而且都是调用AbstractStringBuilder
的
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
if (len == 0) return this;
int newCount = count + len;
if (newCount > value.length)
expandCapacity(newCount);
str.getChars(0, len, value, count);
count = newCount;
return this;
}
方法
经过以上得到以下结论:
所以 如果用加号相加两个字符串 比用StringBuffer.append() 方法 多创建对象而且没有append线程安全。
分享到:
相关推荐
sb.append("Hello").append(" ").append("World"); String str = sb.toString(); ``` ### 异常处理 1. **catch**:在try-catch语句块中用来捕获异常的关键词。当try块中的代码抛出异常时,控制权转移到与该异常...
或者使用`StringBuilder`或`StringBuffer`类: ```java int num = 123; StringBuilder sb = new StringBuilder(); sb.append(num); String strNum = sb.toString(); ``` 3. **JavaScript**: JavaScript中...
在JavaScript(JS)编程中,拼接大量字符串时,直接使用加号 (+) 运算符可能会导致性能问题,因为每次运算都会创建新的字符串对象。为了解决这个问题,我们可以借鉴Java中的`StringBuffer`概念,利用JavaScript的...
StringBuffer.prototype.append = function (str) { this.__strings__.push(str); return this; // 便于链式操作 } StringBuffer.prototype.toString = function () { return this.__strings__.join(""); } ```...
9. 字符串连接:在Java中,可以使用加号操作符 `+`、`concat()` 方法或 `StringBuffer` 的 `append()` 方法连接字符串,答案是A. `s2 + s1`、B. `s1.concat(s2)` 和D. `StringBuffer buf = new StringBuffer(s1); ...
使用 `StringBuffer` 或 `StringBuilder` 类来替代加号 (`+`) 进行字符串拼接,可以显著减少对象的生成次数。例如,上述代码可以优化为: ```java StringBuffer name = new StringBuffer("HuangWeiFeng"); System....
当需要频繁修改字符串时(如在循环中拼接字符串),使用StringBuilder相比于使用String的concat方法或者加号操作符,可以减少创建新的String对象,从而降低内存消耗,提高程序运行效率。 知识点概述: 1. ...
直接使用加号(`+`)进行字符串连接会在每次操作时创建新的字符串对象,这在循环中尤其低效。为了提高效率,可以使用`StringBuilder`或`StringBuffer`。`StringBuilder`在多线程环境中不安全,而`StringBuffer`提供...
5. **使用 `StringBuilder` 或 `StringBuffer`**:这些类提供了创建和修改字符串的更高效的方法。 ```java StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(", World!"); String str =...
- 因为 `StringBuffer` 是可变的,而 `String` 是不可变的,所以在执行 `append` 操作时会将 `sb` 的内容修改为 `"HelloMYFRIEND"`,然后转换成小写输出为 `"hellomyfriend"`。 ### 5. 变量类型和引用 - **基本...
StringBuilder 和 StringBuffer 都提供了append方法用于添加字符串,它们在内存管理上更高效,尤其在处理大量字符串连接时。StringBuffer 是线程安全的,适合多线程环境,而StringBuilder则没有线程安全的额外开销,...
反之,将整数转换为字符串,可以使用String.valueOf()、Integer.toString()或直接加号操作("" + i)。 **int与Integer的区别** int是Java的原始数据类型,而Integer是int的封装类。原始类型占用的内存少,访问...
相比于直接使用加号(+)拼接字符串,使用`StringBuffer`或`StringBuilder`在处理大量字符串操作时性能更优,特别是在循环中。 综上所述,JavaBootCamp的第一周课程涵盖了数组的创建、遍历和操作,循环结构的使用...
`StringBuffer`类包含一个字符串数组,并提供了`append`方法用于添加字符串,以及`toString`方法用于将所有字符串合并为一个单一的字符串。这个类的主要目的是避免频繁的字符串连接操作,尤其是在循环中。 在Fire...
它们提供了线程安全(`StringBuffer`)和非线程安全(`StringBuilder`)的字符串操作方法,如`append()`、`insert()`、`delete()`等。这些方法允许我们在已有字符串基础上进行拼接和修改,而无需每次都创建新的字符...