string对象,StringBuffer、StringBuilder的区别

三者在速度方面的比较:StringBuilder > StringBuffer > String  .

String:

          创建: 1.String str1 = "abc";直接赋值的时候,会先到字符串常量池去寻找,有就直接返回,没有就创建并返回。创建的值不能被修改,但是,指向可以修改。

                      2.String str2 = new String("abc");new出来的String会创建堆内存,然后就和直接赋值一样,指向字符串常量池,有就返回,没有就创建并返回。


操作:

        String是一个常量,一旦创建将不可改变,当你创建了一个Stirng ,又要改变他的值,即

                Stirng str = "abc";

                str = "aaaa";

        JVM是这样解析这段代码的:首先创建对象str,赋予一个abc,然后再创建一个新的对象用来执行第二行代码,将str指向新创建的对象,也就是说我们之前对象str并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。

       而StringBuffer与StringBuilder就不一样了,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,当然速度就快了。

        StringBuffer:线程安全的可变字符序列。

        StringBuilder:线程不安全的可变字符序列。

        其实StringBuffer和StringBuilder都继承了AbstractStringBuilder,他们的方法都是一样的,只是StringBuffer在方法上加了synchronized关键字,这就是StringBuffer比StringBuilder速度慢的原因,也是他线程安全的原因。

        对于三者使用的总结: 1.如果要操作少量的数据用 = String

                                           2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

                                           3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer


个人学习笔记,如有错误,欢迎纠正,万分感谢!



猜你喜欢

转载自blog.csdn.net/Here_sjc/article/details/80266883