java string加_Java的String相关的加号+和append比较

上例子:

package com.smile.core;

public class StringAppend {

public static void main(String[] args) {

// 字符串常量用+连成串,实际上等于一个字符串,效率最高

long start = System.currentTimeMillis();

String str = null;

for (int i = 0; i < 100000; i++) {

str = "this" + " is" + " only" + " a" + " test.";

}

System.out.println("123: " + (start - System.currentTimeMillis()));

// 通过+=来把常量字符或者变量连成串,其过程相当于String str = new StringBuilder().append("a").append(s).toString();

// 效率最慢

start = System.currentTimeMillis();

String str1 = null;

String aStr = " a";

for (int i = 0; i < 100000; i++) {

str1 = "this is";

str1 += " only";

str1 += aStr;

str1 += " test.";

}

System.out.println("234: " + (start - System.currentTimeMillis()));

// 和上一种方法相比,少了String.valueOf()、new StringBuilder()、StringBuilder.toString()的过程

// 效率其次

start = System.currentTimeMillis();

StringBuffer sb = null;

for (int i = 0; i < 100000; i++) {

sb = new StringBuffer().append("this ").append("is ").append("only ").append("a ").append("test.");

}

System.out.println("345: " + (start - System.currentTimeMillis()));

/* result

* 123: 0

234: -78

345: -47

*/

}

}

生成的class文件(标出关键的地方):

4 aconst_null

5 astore_3 [str]

6 iconst_0

7 istore 4 [i]

9 goto 18

12 ldc [22]

14 astore_3 [str]

15 iinc 4 1 [i]

18 iload 4 [i]

20 ldc [24]

22 if_icmplt 12

55 aconst_null

56 astore 4 [str1]

58 ldc [49]

60 astore 5 [aStr]

62 iconst_0

63 istore 6 [i]

65 goto 141

68 ldc [51]

70 astore 4 [str1]

72 new java.lang.StringBuilder [29]

75 dup

76 aload 4 [str1]

78 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [53]

81 invokespecial java.lang.StringBuilder(java.lang.String) [33]

84 ldc [59]

86 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [61]

89 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [40]

92 astore 4 [str1]

94 new java.lang.StringBuilder [29]

97 dup

98 aload 4 [str1]

100 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [53]

103 invokespecial java.lang.StringBuilder(java.lang.String) [33]

106 aload 5 [aStr]

108 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [61]

111 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [40]

114 astore 4 [str1]

116 new java.lang.StringBuilder [29]

119 dup

120 aload 4 [str1]

122 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [53]

125 invokespecial java.lang.StringBuilder(java.lang.String) [33]

128 ldc [64]

130 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [61]

133 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [40]

136 astore 4 [str1]

178 aconst_null

179 astore 6 [sb]

181 iconst_0

182 istore 7 [i]

184 goto 224

187 new java.lang.StringBuffer [68]

190 dup

191 invokespecial java.lang.StringBuffer() [70]

194 ldc [71]

196 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [73]

199 ldc [76]

201 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [73]

204 ldc [78]

206 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [73]

209 ldc [80]

211 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [73]

214 ldc [82]

216 invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [73]

219 astore 6 [sb]

}

这样看的很清楚吧,每种方法执行时的步骤明明白白的写在class文件中。

附上class指令说明(摘自http://blog.csdn.net/hudashi/article/details/7062675):

一、const系列

该系列命令主要负责把简单的数值类型送到栈顶。

指令码 助记符 说明

0x02 iconst_m1 将int型(-1)推送至栈顶

0x0a lconst_1 将long型(1)推送至栈顶

0x0d fconst_2 将float型(2)推送至栈顶

0x0e dconst_0 将double型(0)推送至栈顶

二、push系列

该系列命令负责把一个×××数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。

注意该系列命令只能操作一定范围内的×××数值,超出该范围的使用将使用ldc命令系列。

指令码 助记符 说明

0x10 bipush 将单字节的常量值(-128~127)推送至栈顶

0x11 sipush 将一个短整型常量值(-32768~32767)推送至栈顶

三、ldc系列

该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面需要给一个表示常量在常量池中位置(编号)的参数,

哪些常量是放在常量池呢?比如:final static int id=32768;final static float double=6.5。

对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中.

另外,所有不是通过new创建的String都是放在常量池中的。

指令码 助记符 说明

0x12 ldc 将int, float或String型常量值从常量池中推送至栈顶

0x13 ldc_w 将int, float或String型常量值从常量池中推送至栈顶(宽索引)

0x14 ldc2_w 将long或double型常量值从常量池中推送至栈顶(宽索引)

四、load系列

该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型(iload、lload、fload、dload),还可以是引用类型(aload),还可以是数组的某项(aaload)。

五、store系列

该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类型,还可以是引用类型、还可以把栈顶项的值存到数组里。

六、pop系列

弹出栈顶的值

七、其他操作

swap 互换

add 相加

sub 相减

mul 相乘

div 相除

rem 取模

neg 取负

shl 左移位

shr 右移位

and 按位与

or 按位或

xor 按位异或

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值