标签:java performance stringbuilder concatenation
我有一个遗留Java文件,它使用字符串连接来构建巨大的String对象.这是一个严重的性能问题.是否存在这样的方法,它执行以下操作
String test="I am a very bad programmer"
+"to use concatenation"
+"Instead of StringBuilder"
+" or StringBuffer";
至
StringBuilder strBuilder= new StringBuilder();
strBuilder.append("I am a bad programmer");
strBuilder.append("to use concatenation");
strBuilder.append("Instead of StringBuilder");
strBuilder.append(" or StringBuffer");
String str= strBuilder.toString();
基本上我需要一个java中的存根只是为了给一个String实例化作为输入并转换成StringBuilder.Anybody过去试过这个?
解决方法:
像示例中的固定文字比使用StringBuilder更有效.
固定文字将由编译器检测,并将内联为单个值,因此两行
String s = "one" + "two" + "three";
和
String s = "onetwothree";
将生成完全相同的字节码.
如果连接不是使用文字而是使用函数调用,则图片是不同的.
当你需要动态追加字符串时,首选StringBuilder而不是StringBuffer,因为它不会同步,因为它稍快一些.
这是示例字节码:
public class Test { private String s = "one" + "two" + "three"; } public class Test2 { private String s2 = "onetwothree"; }
这些类的生成字节码是:
c:\Temp>javap -c Test Compiled from "Test.java" public class Test extends java.lang.Object{ public Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: aload_0 5: ldc #2; //String onetwothree 7: putfield #3; //Field s:Ljava/lang/String; 10: return } c:\Temp>javap -c Test2 Compiled from "Test2.java" public class Test2 extends java.lang.Object{ public Test2(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: aload_0 5: ldc #2; //String onetwothree 7: putfield #3; //Field s:Ljava/lang/String; 10: return }
正如您所看到的,两个变量的处理方式相同.
我不认为这属于语言规范,因为这只是“编译器优化”.
一个不同的编译器(我使用的是Sun编译器)可能会做一些完全不同的事情 – 只要行为没有改变就可以了.
标签:java,performance,stringbuilder,concatenation 来源: https://codeday.me/bug/20191006/1859285.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。