【Java学习笔记】Day 4-1 String、StringBuilder和StringBuffer后续

mac2022-07-05  9

感觉昨天测试的结果总有哪里不对,又去网上查了查,结果发现 有的地方说JVM在解析形如

String a="Hello"+" Java"+"!!";

这样的地方的时候,会直接解析为:

String a="Hello Java !!";

而相反的,用StringBuilder和StringBuffer的时候,还是会按照原来的拼接方式。

那人没有提供测试代码,就直接说String的效率更高,为了验证一下,我在JDK1.7的情况下测试了一下。

因为代码太长了,我用的是

String a="Hello"+"Hello"+.....+"Hello"; 一共加了24760次。

并用昨天的for循环测试APPEND效率,感觉整体效果差不多。可见。说的也是有点道理。想必平时在持久化层处理SQL语句的时候,理论上应该没有拼接这么长次数的。

测试结果是

2分37秒1092分37秒109String测试结束2分37秒1092分37秒109StringBuilder测试结束2分37秒1092分37秒109StringBuffer测试结束

感觉。差不多的样子。

并且,测试了多次,发现有时候String用时要长,有时是其他两个。也许测试用例选的不好吧。但是从正常应用的角度来说。差别应该不大,可能从千万级数据用户来说,这点应该需要注意吧。

 

这只是个开头,今天想更深入的了解一下StringBuilder和StringBuffer。

Copy来的概念。

StringBuffer是线程安全的可变字符序列一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

当发生与源序列有关的操作(如源序列中的追加或插入操作)时,该类只在执行此操作的字符串缓冲区上而不是在源上实现同步

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

 

意思仿佛是说,StringBuffer在进行数据处理的时候。首先会有一个源,即其默认值或初始值。当有一个进程来调用该对象,并对对象处理的时候,会创建一个副本缓冲区,实际是读该副本进行处理,并不对源操作,并且在必要时对不同线程间的数据进行同步,但仍只是线程缓冲区间的数据同步,而不是源上。

相反,由于StringBuilder是单线程的,没有存在同步这一说,那么他的效率会高?

 

只看别人的内容,不如自己动手试试。(以后补上吧,线程的知识有点差现在,主要不太清楚怎么使用。尴尬一个,但是从概念上大概齐是了解了。)

 

 

转载于:https://www.cnblogs.com/Xuhaiyang/archive/2012/04/19/2457079.html

最新回复(0)