Java中String、StringBuffer、StringBuiler的区别和用法

文章目录

  • Java中 String、StringBuffer、StringBuilder的区别和用法
    • 可变类与不可变类
    • String、StringBuffer、StringBuilder的关系和用法区别
    • StringBuilder 部分API(StringBuffer与此相同)

Java中 String、StringBuffer、StringBuilder的区别和用法

Java中的字符串类有我们最熟悉的String类,也还有便于做字符串拼接操作的两个衍生类就是StringBufferStringBuilder,他们之间有一个最主要的区别就是String是不可变类,而后两者是可变类

可变类与不可变类

我们知道Java中的对象是存在内存中的堆里面的,当一个String类的对象被new操作符构造时,内存堆中就会有一段内存来存储这个String对象,比如

String greeting = new String("Welcom to my new blog!");

而当我们想要修改这个字符串的内容,用到"+"操作符把一个字符串添加到greeting末尾

String greeting = greeting + " Thank you.";

此时我们可能会认为内存中之前"Welcom to my new blog!“对象改变了,变成了"Welcom to my new blog! Thank you.”
然而实际上Java中的操作不是这样的,因为Java中所有的对象变量比如上面的greeting都是存储了一个具体内存堆中对象的引用,也可以叫做地址,that means 这个变量像一个指向此对象的"指针"(java中并没有指针的概念,但是对象变量的概念与此十分类似)。在这个操作中,greeting这个变量确实改变了,因为它现在指向的是一个新的字符串对象:完整的"Welcom to my new blog! Thank you."也就是说,现在在内存堆中存在两个不同的字符串变量,"Welcom to my new blog!""Welcom to my new blog! Thank you."

所以一旦一个String类对象被创建,那么这个对象内存中的内容就不会改变,除非没有变量再指向它时它会被Java的垃圾回收器回收,这就是不可变类名称的由来。

然而有些时候,我们经常需要一些较短的字符串构建字符串,采用字符串拼接的方式就会导致效率比较低。因为如上所说,每次拼接字符串都会产生一个新的String对象,这样既耗时,又浪费了内存空间。这时使用StringBuilder类就可以很好的解决这个问题,比如我们可以这样完成上面的拼接操作:

StringBuilder greeting = new StringBuilder();//构造一个空的StringBuilder对象
greeting.append("Welcom to my new blog!");//第一个欢迎字符串
greeting.append(" Thank you.");//拼接

这两次调用append()方法后的StringBuilder对象是同一个对象,但是内容发生了改变。
与String类的不可变类对比,StringBuilder类被称为可变类
我们可以调用StringBuilder类的toString()方法返回包含StringBuilder对象中字符串的String对象:

String completeString = greeting.toString();

String、StringBuffer、StringBuilder的关系和用法区别

前面介绍可变类与不可变类时已经引出了StringBuilder的用法,而StringBuffer与StringBuilder类完全类似,但是它有一个特性叫做线程安全的,也就是当多个线程执行添加、删除字符的操作时不会导致出错,原因是其中的方法都使用了Synchronized关键字修饰。但是这样会使使用它的效率变低。

根据上面的说法我们可以得到在使用效率上他们三者的关系
StringBuilder>StringBuffer>String
那就会有一个问题了,为什么我们写程序的时候很多情况下都是用的效率最低的String类呢?

因为我们自己写的程序中大部分用的字符串拼接操作规模都比较小不至于对整个程序的效率造成很大影响,而且不使用多线程编程时也不必考虑线程安全的问题,所以这种情况下使用String是比较方便的。
但是如果我们程序中需要使用很大规模的字符串修改操作,并且要考虑多线程的影响时,就必须使用StringBuffer来保证程序运行的正确性和效率,当然如果不必考虑多线程影响而需进一步对大规模字符串修改操作提高效率就可以使用StringBuilder。
综合来说,选用哪种字符串类我们需要根据具体使用的程序来考虑,结合上面的多线程和效率因素来做出更好选择

StringBuilder 部分API(StringBuffer与此相同)

StringBuilder()
//构造一个空的字符串构造器类(StringBuilder类)对象
int length()
//返回此字符串中代码单元数量
StringBuilder append(String str)
//将str拼接到字符串末尾并且返回this指针
StingBuilder append(char c)
//将一个字符c拼接到字符串末尾并且返回this指针
void setCharAt(int i, char c)
//将字符串中第i个字符修改为c
StringBuiler insert(int offset, String str)
//在offset位置插入一个字符串str并返回this
StringBuiler insert(int offset, char c)
//在offset位置插入一个字符c并返回this
StringBuiler insert(int startIndex, int endIndex)
//删除偏移量从startIndex到endIndex-1的字符并返回this
String toString()
//返回一个与构造器或者缓冲区(StringBuilder或者StringBuffer)内容相同的字符串

你可能感兴趣的:(Java基础知识,java,计算机,字符串)