简述String、StringBuilder和StringBuffer的区别

三个都是java平台提供的字符串,都是可以用于存储和操作字符串。以下是他们的区别:

1、String是只读字符串,底层是被final修饰了,意味着String引用的字符串内容是不能被改变的;

String str = “abc”;
str = “bcd”;

实际上,这时候的str并不说是之前的str,由于第二步操作是直接创建新的对象然后进行赋值的,此时两个str所指向的地址是不同的;

2、StringBuffer和StringBuilder表示的字符串对象是可以直接修改的

3、StringBuilder在单线程环境下使用的,因为它的所有的方法都没有被synchronized,因此效率理论上比StringBuffer要高。

在线程是否安全考虑:

String由于被final修饰了,对象不可变,线程安全,适用于少量的字符串操作

StringBuffer,由于对调用的方法加入同步锁,所以属于线程安全,但是执行效率较慢,适用于多线程下的操作字符串缓冲区大量数据。

StringBuilder,线程不安全,适用于单线程下操作字符串缓冲区大量数据

StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。

StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append。

只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer

注:java拼接字符,String用“+”,而StringBuilder和StringBuffer使用的是append方法连接字符串

实际上,通过研究代码可以发现,使用+,在编译时仍然转换成StringBuilder后使用append方法,所以在java中无论使用何种方法进行字符串连接,实际上都是使用StringBuilder。但是从运行结果看,+和StringBuilder是完全等效的,但是如果从运行效率和资源消耗上看,StringBuilder的方法会更加高效。

因为每次是用+,都是在编译的时候先转为StringBuilder后使用append,也就是说,创建了StringBuilder对象,java虽然有垃圾回收机制,但是这个机制工作时间是不定的,不断产生这样的垃圾,就会占用大量的资源,解决这个问题的方法就是在程序中直接使用 StringBuilder 来连接字符串。

下面是例子:

public class TestComplexPlus{
 public static void main(String[] args)
 {
   String s = "";
   Random rand = new Random();
   for (int i = 0; i < 10; i++)
   {
    s = s + rand.nextInt(1000) + " ";
}
System.out.println(s);
}}

编译后的java Byte Code如下:

解决方法:

public class TestComplexPlus{
 public static void main(String[] args)
 {
   String s = "";
   Random rand = new Random();
   StringBuilder result = new StringBuilder();
   for (int i = 0; i < 10; i++)
   {
    result.append(rand.nextInt(1000));
    result.append(" ");
}
System.out.println(result.toString());
}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值