# String,StringBuilder,StringBuffer的比较

564 阅读2分钟

在完成Java字符串的学习后,我们知道String,StringBuilder,StringBuffer都是可以对字符串进行处理的类。

那么它们的区别在哪里呢? 分析它们的区别,我们从两个角度考虑:运行速度、运行时的线程安全问题

1. 运行速度:

  • 从运行速度方面:StringBuilder>StringBuffer>String

我们先了解String类型的不可变性

• String的不可变性

• String对象一旦被创建,则不能改变,是不可变的

• 所谓的改变其实是创建了新的对象,原来对象所指向的内存空间不变。
package com.imooc;

public class StringDemo6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//String的不可变性
		//String对象一旦被创建,则不能改变,是不可变的
		//所谓的改变其实是创建了新的对象,所指向的内存空间不变
		String s1="imooc";
		String s1="hello,"+s1;
		
		//s1不再指向imooc所在的内存空间,而是指向了“hello,imooc”,实际上是在常量池中产生一个新的s1,原来的字符串被废弃
		System.out.println("s1="+s1);
		
	}

}

输出结果:

s2=hello,imooc

子串hello

s3=hello,imooc

因此,String为字符串常量,而StringBuilder和StringBuffer为字符串变量。即String对象一旦被创建后不可更改,但是后两者的对象是变量,均可以更改。

Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

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

故String类型运行速度最慢。

2. 线性安全

咱们再来看看具体原因:

  • 在处理多线程问题是,StringBuffer中的很多方法都可以带有synchronized关键字实现数据的同步,因此可以保证线程是安全的

  • StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。

  • 所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

=========================================================================

以上就是String,StringBuilder,StringBuffer的区别。

StringBuilder和StringBuffer使用基础方法相差不大,下面演示一下StringBuilder的使用方法:

package com.imooc;

public class StringBuilderDemo1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义一个字符串“你好”
		StringBuilder str=new StringBuilder("你好");
		//在你好后面添加内容,将字符串变成“你好,imooc”
		str.append(',');
		str.append("imooc");
		System.out.println(str);
		
		//将字符串变成“你好,iMOOC!”;
		
		System.out.println("替换后:"+str.delete(4, 8).insert(4, "MOOC"));
		
		
		
		//在字符串“你好,iMOOC!”中取出“你好”
		System.out.println(str.substring(0, 2));
	}

}

运行结果:

你好,imooc!

替换后:你好,iMOOC!

你好