Java中String、StringBuffer、StringBuilder的使用

1.String的缺点

小编在前几天的学习中遇到了一道简单的java题目,也就是前面提到的大小写的转换。其中是字符串的大小写转换。其中涉及到了字符串的定义,关于字符串的操作,我们有以下几个类,我们来说说他们各自的特点

String类:java中的字符串是属于对象,java中使用String对字符串进行操作,需要注意的是,String操作的字符串的值是不可以进行改变的,即,固定值,所以每次对String的操作都会生成新的String对象,这样会是的效率遍地,并且很占存储空间。

以下图操作为例

Java中String、StringBuffer、StringBuilder的使用

注:这个是我自己画的草图,还是俺上学时候的草稿信纸呢,上学时候买了太多竟然用到了现在。

我们能够看到初始化String的值为“hello”。然后后面加上新的字符串“world”,这个过程是需要重新在堆内存中创建空间的,最后“hello world”字符串也需要在堆内创建空间。就是我们平时所打印一盒hello world就需要进行三次内存空间的创建

 

正因为 String对字符串的操作存在不可更改的特性,因此引入了StringBuffer和StringBuilder类,这俩种方法可以对堆上存储的对象进行操作以及更改。

2.StringBuffer和StringBuilder方法

1)和String类不同的是:StringBuffer类和 StringBuilder类定义的对象能够被多次修改,并且不产生新的未使用对象。

2)StringBuffer类和 StringBuilder类的区别是什么呢?

区别主要是:StringBuffer类的方法是线程安全的,可以同步访问,速度慢;StringBuilder类的方法不是线程安全的,不能同步访问,速度快

3)那么为神马StringBuffer类的方法是线程安全的呢?

一个StringBuffer对象在字符串缓冲区内部被多个线程使用,StringBuffer中方法带有synchronized关键字,因此能够保证线程是安全的。但StringBuilder的类,被定义的对象中的方法使用时则没有synchronized关键字,因此不能保证线程安全,会出现一些错误的情况。

如果要进行的操作是多线程的,那么请使用StringBuffer;如果是单线程的情况,建议使用速度比较快的StringBuilder。

4)那么String、StringBuffer、StringBuilder的运行速度是什么样的呢?

StringBuilder > StringBuffer > String

String最慢原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量。String对象一旦创建之后该对象是不可更改的,但StringBuilder和StringBuffer均为字符串变量,是可以更改的。

对于StringBuilder和StringBuffer来说,他们的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。