“+=”和append的区别
“+=”和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
根据结果我们可以看到:
- 虚拟机开始是定义了一个字符串”a“将其入栈;
- 然后new了一个StringBuilder对象,将”a“封装到Sb对象中;
- 之后用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_3
和55: 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_3
和47: goto 30
构成的循环体内没有new操作,而是放到了循环外部
20: new #6 // class java/lang/StringBuilder
由此得出,在循环时使用+=会创建多个StringBuilder对象,而使用append(),只会创建一个。
所以我们在平时写代码的时候一定注意,不要再循环中使用+=操作,效率很低的。
“+=”和append的区别相关推荐
- 【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, ...
- prepend与append的区别
prepend与append的区别 jquery中appendTo和prependTo函数都可以将元素添加到另一个元素,但是两个函数还是有一定却别的appendTo(content): 是将所有匹配的 ...
- python 列表元素操作 push()和append()的区别
在阅读pyhton (for in if)用法的时候,看见有一个操作: lix = []; for x in range(1, 101):lix.push(x ** 2) 执行结果:lix = [1, ...
- Android中TextView中的.setText和.append的区别
setText() 把以前的内容冲掉了,append()在以前的内容后面添加.这个区别应该很好理解.如果原来字域的内容为空,则这两个方法的作用一样.
- Python列表操作中extend和append的区别
1.用法 append()用于在列表末尾添加新的对象,输入参数为对象: extend()用于在列表末尾追加另一个序列中的多个值,输入对象为元素队列: 2.相同点 两个都是对列表即list进行的操作 具 ...
- extend 与 append 的区别
>>> A = ['q', 'w', 'e', 'r'] >>> A.extend(['t', 'y']) >>> A ['q', 'w', 'e ...
- Java中字符串连接符(+)和append的区别
参考链接:https://www.jianshu.com/p/849f1d443b3a 文章结构: 第一部分:对+的原理进行分析 第二部分:+ 和 append 循环对比(贴出代码,以及分别循环后的反 ...
- concat() “+“ 和 append() 的区别
由下面的例子可看出,"+" 和 append() 方法都可以对任意类型数据进行拼接,而 concat() 方法则需要将其他类型的数据则要转化为字符串后才能拼接 package 练习 ...
- python观察日志(part20)--列表中加号,extend,append之间的区别
学习笔记,仅供参考,有错必纠 列表中"+"加号,extend,append之间的区别 extend extend函数用于在列表末尾一次性追加另一个序列中的多个值. append a ...
最新文章
- 掌握这6大知识点 做光伏会容易很多
- CPU指令集是什么东西
- 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
- MongoDB常用操作总结
- linux在指定目录多个文件中搜索关键字
- OpenCV辅助对象(help objects)(5)_DataType
- centos选择php7 作为默认版本_树莓派下安装Nginx+Php7.3 搭建Web服务器
- 《企业IT架构转型之道》读书笔记
- 【倒计时】用JS写出京东倒计时效果
- 三维激光雷达点云处理分类及目标检测综述
- pythonppt生成替换_python生成ppt的方法
- java栅格化,UI设计要不要用栅格化布局?
- RGB颜色空间、色调、饱和度、亮度、HSV颜色空间详解
- 使用Java写文件不覆盖原有内容
- android edittext 手机号码,Android Edittext 手机号码格式输入设置
- 设计模式二:创建型-工厂模式
- BootStrap4工具类之阴影效果
- react+antd的后台管理项目模板
- 关于干货集中营的一个开源App
- 美国芝加哥大学计算机排名,2020年芝加哥大学排名TFE Times美国最佳计算机科学硕士专业排名第32...