- 三者在执行速度方面的比较:StringBuilder > StringBuffer > String
当然这个是相对的,不一定在所有情况下都是这样。
比如String str=”hello”+”world”的效率就比 StringBuilder st=new StringBuilder().append(“hello”).append(“world”)要高 关于String:
- String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。
- String类其实是通过char数组来保存字符串的
- String是“字符创常量”,也就是不可改变的对象,因此String类的方法实现都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变。
在这里要永远记住一点:
“对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”
- 一个小例子:
String str1 = “hello world”;
String str2 = new String(“hello world”);
String str3 = “hello world”;
String str4 = new String(“hello world”);
在这里(str1==str3) but (str2!=str4)
这是因为通过new关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过new来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。
关于StringBuffer与StringBuilder
- StringBuilder类是在JDK5.0中引入的,这个类的前身是Stringbuffer,StingBuffer其效率稍有些低,但允许采用多线程的方式执行
- StringBuilder:线程非安全的
StringBuffer:线程安全的,可以查看源码发现每个方法都用synchronized
关键字声明了
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
添加或删除字符的操作。
- 对于三者使用的总结:
- 如果要操作少量的数据用 String
- 单线程操作字符串缓冲区 下操作大量数据 用StringBuilder
- 多线程操作字符串缓冲区 下操作大量数据 用StringBuffer
文章标题:String,StringBuilder,StringBuffer
最新推荐文章于 2023-02-25 12:27:45 发布