“+=”和append的区别是面试中出现频率较高的一个题目了,下面我们就来分析一下这两者的区别吧。
首先看一下这段代码的结果:

String s1 = "a";
String s2 = s1 + "b";
System.out.println(s2 == "ab"); // false

输出结果是false;

javap将其反编译之后的结果如下:

  public static void main(java.lang.String[]);Code:0: ldc           #2                  // String a2: astore_13: new           #3                  // class java/lang/StringBuilder6: dup7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V10: aload_111: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;14: ldc           #6                  // String b16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;22: astore_223: getstatic     #8                  // Field java/lang/System.out:Ljava/io/PrintStream;26: aload_227: ldc           #9                  // String ab29: if_acmpne     3632: iconst_133: goto          3736: iconst_037: invokevirtual #10                 // Method java/io/PrintStream.println:(Z)V40: return

根据结果我们可以看到:

  1. 虚拟机开始是定义了一个字符串”a“将其入栈;
  2. 然后new了一个StringBuilder对象,将”a“封装到Sb对象中;
  3. 之后用StringBuilder的append()方法来完成"a"和"b"的拼接;

所以这里的"ab"字符串本质上是一个StringBuilder对象,所以再去跟常量"ab"去比较的话会是false;
这样看来用"+"和append效率似乎是一样的,并没有像网上说的那样”+“操作比append()更消耗性能。

那下面我们来看一下这两者在循环中是什么结果:
首先是”+=“操作:

public static void main(String[] args) {String[] arr = new String[]{"a","b","c"};String result = "";for (int i = 0 ; i < arr.length; i ++) {result += arr[i];}System.out.println(result);
}

反编译结果如下:

  public static void main(java.lang.String[]);Code:0: iconst_31: anewarray     #2                  // class java/lang/String4: dup5: iconst_06: ldc           #3                  // String a8: aastore9: dup10: iconst_111: ldc           #4                  // String b13: aastore14: dup15: iconst_216: ldc           #5                  // String c18: aastore19: astore_120: ldc           #6                  // String22: astore_223: iconst_024: istore_325: iload_326: aload_127: arraylength28: if_icmpge     5843,1          34%31: new           #7                  // class java/lang/StringBuilder34: dup35: invokespecial #8                  // Method java/lang/StringBuilder."<init>":()V38: aload_239: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;42: aload_143: iload_344: aaload45: invokevirtual #9                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;48: invokevirtual #10                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;51: astore_252: iinc          3, 155: goto          2558: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;61: aload_262: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V65: return

可以看到从25: iload_355: goto 25两句构成了一个循环,而31: new #7 // class java/lang/StringBuilder创建StringBuilder对象语句在循环内,所以会创建多个
SB对象;

下面我们把代码改为append()实现:

    public static void main(String[] args) {String[] arr = new String[]{"a","b","c"};StringBuilder result = new StringBuilder();for (int i = 0 ; i < arr.length; i ++) {result.append(arr[i]);}System.out.println(result);}

反编译后:

  public static void main(java.lang.String[]);Code:0: iconst_31: anewarray     #2                  // class java/lang/String4: dup5: iconst_085,7          68%6: ldc           #3                  // String a8: aastore9: dup10: iconst_111: ldc           #4                  // String b13: aastore14: dup15: iconst_216: ldc           #5                  // String c18: aastore19: astore_120: new           #6                  // class java/lang/StringBuilder23: dup24: invokespecial #7                  // Method java/lang/StringBuilder."<init>":()V27: astore_228: iconst_029: istore_330: iload_331: aload_132: arraylength33: if_icmpge     5036: aload_237: aload_138: iload_339: aaload40: invokevirtual #8                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;43: pop44: iinc          3, 147: goto          3050: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;53: aload_254: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V57: return

可以发现在由30: iload_347: goto 30构成的循环体内没有new操作,而是放到了循环外部
20: new #6 // class java/lang/StringBuilder

由此得出,在循环时使用+=会创建多个StringBuilder对象,而使用append(),只会创建一个。
所以我们在平时写代码的时候一定注意,不要再循环中使用+=操作,效率很低的。

“+=”和append的区别相关推荐

  1. 【Python】list 之 extend 和 append 的区别

    示例 a = [1, 2, '3', '1'] a.extend([1, 2]) print(a) a.append([1, 2]) print(a) 输出结果 [1, 2, '3', '1', 1, ...

  2. prepend与append的区别

    prepend与append的区别 jquery中appendTo和prependTo函数都可以将元素添加到另一个元素,但是两个函数还是有一定却别的appendTo(content): 是将所有匹配的 ...

  3. python 列表元素操作 push()和append()的区别

    在阅读pyhton (for in if)用法的时候,看见有一个操作: lix = []; for x in range(1, 101):lix.push(x ** 2) 执行结果:lix = [1, ...

  4. Android中TextView中的.setText和.append的区别

    setText() 把以前的内容冲掉了,append()在以前的内容后面添加.这个区别应该很好理解.如果原来字域的内容为空,则这两个方法的作用一样.

  5. Python列表操作中extend和append的区别

    1.用法 append()用于在列表末尾添加新的对象,输入参数为对象: extend()用于在列表末尾追加另一个序列中的多个值,输入对象为元素队列: 2.相同点 两个都是对列表即list进行的操作 具 ...

  6. extend 与 append 的区别

    >>> A = ['q', 'w', 'e', 'r'] >>> A.extend(['t', 'y']) >>> A ['q', 'w', 'e ...

  7. Java中字符串连接符(+)和append的区别

    参考链接:https://www.jianshu.com/p/849f1d443b3a 文章结构: 第一部分:对+的原理进行分析 第二部分:+ 和 append 循环对比(贴出代码,以及分别循环后的反 ...

  8. concat() “+“ 和 append() 的区别

    由下面的例子可看出,"+" 和 append() 方法都可以对任意类型数据进行拼接,而 concat() 方法则需要将其他类型的数据则要转化为字符串后才能拼接 package 练习 ...

  9. python观察日志(part20)--列表中加号,extend,append之间的区别

    学习笔记,仅供参考,有错必纠 列表中"+"加号,extend,append之间的区别 extend extend函数用于在列表末尾一次性追加另一个序列中的多个值. append a ...

最新文章

  1. 掌握这6大知识点 做光伏会容易很多
  2. CPU指令集是什么东西
  3. 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
  4. MongoDB常用操作总结
  5. linux在指定目录多个文件中搜索关键字
  6. OpenCV辅助对象(help objects)(5)_DataType
  7. centos选择php7 作为默认版本_树莓派下安装Nginx+Php7.3 搭建Web服务器
  8. 《企业IT架构转型之道》读书笔记
  9. 【倒计时】用JS写出京东倒计时效果
  10. 三维激光雷达点云处理分类及目标检测综述
  11. pythonppt生成替换_python生成ppt的方法
  12. java栅格化,UI设计要不要用栅格化布局?
  13. RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解
  14. 使用Java写文件不覆盖原有内容
  15. android edittext 手机号码,Android Edittext 手机号码格式输入设置
  16. 设计模式二:创建型-工厂模式
  17. BootStrap4工具类之阴影效果
  18. react+antd的后台管理项目模板
  19. 关于干货集中营的一个开源App
  20. 美国芝加哥大学计算机排名,2020年芝加哥大学排名TFE Times美国最佳计算机科学硕士专业排名第32...

热门文章

  1. Spring的事务机制
  2. 妈蛋:kinMaxShow旋转木马异常,WebUploader图片上传坑爹,图像被压缩
  3. NSArray 所有基础点示例
  4. 6 自定义控件之屏蔽控件的设计时属性
  5. 转:Google的系统工程师(SA)如何工作
  6. 实现textbox输入时模糊查询
  7. golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术
  8. selenium 隐藏窗口_anaconda下安装selenium包
  9. 软件测试工作都干些什么?
  10. 编程语言那么多,学哪个能拿高薪?