在最近的Java学习过程中,对String,StringBuilder,StringBuffer这三者的区别有疑问,自己上网查询资料后,在这里整理下,加深自己知识点的同时,便于大家查看,如有错误的地方,还请小伙伴们指正!
- **1.运行速度**
- **2.线程安全**
String,StringBuilder,StringBuffer三者的区别主要在两个方面: 1.运行速度
运行速度快慢为:StringBuilder > StringBuffer > String
String在三者中最慢的原因为:
String为字符串常量,而StringBuilder和StringBuffer都为字符串变量,String对象创建后该对象是不可更改的,但是后两者的对象是变量,是可以更改的。
以一段代码为例:
String str="abcd"; System.out.println(str); str=str+"efg"; System.out.println(str);
运行这段代码后,结果是先输出“abcd”,后输出“abcdefg”,那么String的对象str被更改了,这与上面在String对象创建后该对象是不可更改的有矛盾,其实不然,JVM对于这几行代码处理是,先创建一个String对象str,把“abcd”赋值给str,重点是在第三行中,JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“efg”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了这并不冲突。所以,Java中对String对象进行的 *** 作实际上是一个不断创建新的对象还将旧的对象回收的过程,执行速度会很慢。
StringBuilder和StringBuffer都为字符串变量,可以直接对变量对象进行更改,不用再创建新的对象和回收旧的对象了,速度自然比String快很多
2.线程安全在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer的对象在字符串缓冲区被多个线程使用时,StringBuffer中的很多方法带有synchronized关键字,用来保证其线程安全,但StringBuilder的方法则不存在该关键字,所以不能保证线程安全,可能会因为多线程问题出现一些错误的 *** 作,所以如果要进行多线程的 *** 作,那么就要使用StringBuffer,在单线程的情况下,建议采用StringBuilder,速度较快。
写在最后:
String:适用于少量的字符串 *** 作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量 *** 作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量 *** 作的情况
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)