在Java使用过程中,最常用的类型之一大概就是字符串了,而在Java中,字符串有三种,分别是String, StringBuffer, StringBuilder,很多初级程序猿可能会在使用过程中还分不清这几个类的区别,以致于一股脑的全部使用String,但是实际上,这会对系统的性能造成一定的影响,小编建议大家不要这么做。
因此,今天小编特意查阅相关资料,从各个方面对这几个类进行了对比,方便大家记忆。
线程安全性
String是一个字符串常量,无论是类,还是里面的方法,成员,都是被final修饰,这意味着字符串的内容,长度,一旦创建,是无法进行修改的,因此我们不考虑它
而另外两个中,StringBuilder是线程不安全的,StringBuffer是线程安全的。
这意味着,在多线程场景下,由于StringBuffer的很多方法是添加了synchronized关键字,是可以保证线程安全的,所以在多线程场景下,我们一般使用StringBuffer。
执行速度
StringBuilder > StringBuffer > String
也恰恰是因为StringBuffer的很多方法添加了synchronized关键字,是可以同步访问的,这是以牺牲性能换取的,所以说StringBuilder的速度比StringBuffer快。
那么,为什么说String的速度最慢呢?
正如上文中所说,因为String是字符串常量(被final修饰),而另外两个都是字符串变量。
常量对象一旦创建不可修改,而变量创建之后还可以进行修改。
由于不能更改,我们对String的所有操作实际上都包含了以下三个步骤:
1. 创建新对象,名字和原有的String对象一样
2. 在新对象上做出改变。
3. 原对象被垃圾回收掉。
而对StringBuffer和StringBuilder的操作可以直接在原对象上进行修改,省去了创建新对象和回收老对象的过程,因此速度上提高了不少。
适用场景
String: 字符串进行了少量更改,或不进行更改的场景
StringBuffer: 字符串被多个线程进行了大量修改操作的场景
StringBuilder: 字符串被单个线程进行了大量修改操作的场景
小结
String在Java中是一个很重要而且特殊的类,这里描述了它和StringBuffer以及StringBuilder的区别和适用场景,之后还会专门写一章,讲述String类的相关详细内容,欢迎大家持续关注~
领取专属 10元无门槛券
私享最新 技术干货