Java
String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String、StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景。
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。
String最慢的原因:
String为字符串 常量 ,而StringBuilder和StringBuffer均为字符串 变量 ,既String对象一旦创建后该对象是不可以更改的,但是后两者StringBuilder和StringBuffer的对象是变量,是可以更改的。下面举个栗子:
String str = "aquan"; System.out.println(str); str = str + "Meow"; System.out.println(str);
运行这段代码的运行结果如下:
aquan aquanMeow
这样看起来好像是 str
这个对象被更改了,其实,这只是一个假象,JVM对于这几行代码是这样处理的:
所以,str实际上是并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffe的对象是变量,对变量进行的操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
另外,有时候我们会这样队字符串进行赋值
String str = "aquan" + "Meow"; StringBuilder stringBuilder = new StringBuilder().append("aquan").append("Meow"); System.out.println(str); System.out.println(stringBuilder.toString());
这段代码的运行结果如下:
aquanMeow aquanMeow
这里结果都是一样,但是String的速度却要比StringBuilder的反应速度要快很多,这是因为第一行中的操作和 String str = "aquanMeow";
是完全一样的,所以会很快,而如果写成下面这种形式
String str1 = "aquan"; String str2 = "Meow"; String str = str1 + str2;
那么JVM就会像上面说的那样,不断的创建,回收对象来进行这个操作,这样速度就会很慢了。
StringBuilder是线程不安全的,而String和StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区中被多个线程使用时,StringBuffer中很多方法可以带有 synchronized
关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的话,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较过的StringBuilder。
String:适用于少量的字符串操作的情况下
StringBuilder:适用于 单线程 下字符缓冲区中进行大量操作的情况下
StringBuffer:适用于 多线程 下的字符缓冲区中镜像大量操作的情况下
可以关注微信公众号:爱敲代码的猫
本文由Aquan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 三月 23,2019