Javajdk对字符串相加的优化
Java jdk对字符串相加的优化。
背景
关于Java对于字符串相加(使⽤加号+连接) 的优化。本⽂讨论⼏个点
1. 这种优化是从jdk⼏开始做了的?
2. 优化做了些什么?
3. 没有优化前是怎么做的?
4. 优化后就可以为所欲为在任何场景下都使⽤加号+对字串进⾏相加吗?
5. 我为啥总记得对String的相加的优化,即优化成StringBuilder是从jdk8之后才有的,认为jdk8之前是效率很低的(曼德拉效应)
总结
jdk怎么使用1. 从jdk5开始就做了的,之后jdk6/7/8都没有改变过,即没有继续进⼀步优化。jdk9有没有进⼀步优化就不清楚了,不在本次讨论议题
内
2. 字符串相加优化成StringBuilder的append
String s1 = "a";
String s2 = s1 + "b";
====优化后====>
String s2 = new StringBuilder().append(s1).append("b").toString();
---------- 上述是等价的代码,需要知道更多细节可以 javap -v -p 或者 javap -c 或者是通过jclasslib-IDEA插件等⼯具或⽅式查看JVM指令,从指令可以窥探到细节 ----------
3. 没有优化前,即<jdk5之前是怎么做的? 不太清楚,由于jdk4太古⽼了,本⽂也不做知识点展开
4. 不是的,详细见本⽂后续的章节
5. 这个可能是我早期不知道哪⾥看的资讯,在脑⾥形成了固定的印象,认为 “jdk8对String相加做了StringBuilder优化,所以任何场
景可以随便⽤加号相连”。这也是曼德拉现象吧,即使是错误的信息在脑⾥不断重复就会深信不疑
哪些场景不能⽤加号连接
我们,⾄少是我,之前总有印象,以为jdk8对字符串的加号连接做了优化,可以为所欲为随便⽤加号连接字串。其实是不对的,这⾥有两个信息错误
⾸先,对字符串的优化从>=jdk5就开始做了,并不是jdk8才做的,jdk8跟jdk5⽐,没做优化的提升
为什么我总是有个印象,是从jdk8之后才优化成StringBuilder?这是不是传说中的 "曼德拉效应"?
其次,在for循环⾥,不能对字串进⾏相加,效率很低,每次循环都会产⽣⼀个StringBuilder对象,最好是⾃⼰在循环外写⼀个StringBuilder,⽤这⼀个就⾏。
下⾯的代码,在运⾏了多次后取了⼤概的平均值,⼤概差距是400多倍
method1 耗时:453
method2 耗时:1
public static void main(String[] args){
int times =1_0000;
long startTime = System.currentTimeMillis();
method1(times);
System.out.println("method1 耗时:"+(System.currentTimeMillis()- startTime));
startTime = System.currentTimeMillis();
method2(times);
System.out.println("method2 耗时:"+(System.currentTimeMillis()- startTime));
}
public static void method1(int times){
String s ="";
for(int i =0; i < times; i++){
s += i;
}
}
public static void method2(int times){
StringBuilder sb =new StringBuilder();
for(int i =0; i < times; i++){
sb.append(i);
}
String s = sb.toString();
}
实践
有了上⾯的知识,我们需要这样⼦正确使⽤字符串拼接
如果是⾮循环内进⾏字符串拼接,直接⽤加号即可。
如果是循环内进⾏累计的拼接,在循环外申明⼀个StringBuilder会好点
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论