String、StringBuffer和StringBuilder的六大区别

String:适用于少量的字符串操作。

StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。

StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。


区别一:String是final类不能被继承且为字符串常量,而StringBuilder和StringBuffer均为字符串变量。

在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不适合于频繁修改的字符串操作上,所以在这种情况下,往往可以使用StringBuffer类,即StringBuffer类方便用户进行内容修改。

详情看代码:

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String str="xxx";
        System.out.print("String字符串常量str:"+str+"的初始地址是:");
        System.out.println(str.hashCode());
        str=str+"yyy";
        System.out.print("String字符串常量str:"+str+"赋值后的地址是:");
        System.out.println(str.hashCode());
        StringBuffer sb=new StringBuffer().append("xxx");
        System.out.print("StringBuffer字符串变量sb:"+sb+"的初始地址是:");
        System.out.println(sb.hashCode());
        sb.append("yyy");
        System.out.print("StringBuffer字符串变量sb:"+sb+"赋值后地址是:");
        System.out.println(sb.hashCode());
        StringBuilder sbd=new StringBuilder().append("xxx");
        System.out.print("StringBuilder字符串变量sbd:"+sbd+"的初始地址是:");
        System.out.println(sbd.hashCode());
        sbd.append("yyy");
        System.out.print("StringBuilder字符串变量sbd:"+sbd+"赋值后地址是:");
        System.out.println(sbd.hashCode());
    }
}

2701a938118590df57282fb551e61a86.png

String/StringBuffer/StringBuilder对象的地址

String类型是字符串常量,当进行字符串操作时,地址即发生改变。

StringBuffer和StringBuilder类型是字符串变量,当使用apend()等操作时,内存地址不发生变化(如上图所示)

区别二:在String类中使用“+”作为数据的连接操作,而在StringBuffer类中使用append()方法(方法定义:public StringBuffer append(数据类型 变量))进行数据连接。

详情看代码:

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        System.out.println("下列三个字符串是String类型的字符串常量:");
        String a=sc.nextLine();
        String b=sc.nextLine();
        String c=sc.nextLine();
        //String使用"+"进行操作
        a=a+"xxx";
        //StringBuffer和StringBuilder使用append进行操作
        StringBuffer x=new StringBuffer().append(b).append("xxx");
        StringBuilder y=new StringBuilder().append(c).append("xxx");
        System.out.print("这是String类型的字符串常量:");
        System.out.println(a);
        System.out.print("这是StringBuffer类型的字符串变量:");
        System.out.println(x);
        System.out.print("这是StringBuilder类型的字符串变量:");
        System.out.println(y);
    }
}

e9e6cea4ca46a0c8d53e94a4d7496167.png

区别三:类的定义不同
String类:

public final class String extends Object implements Serializable, Comparable<String>, CharSequence

StringBuffer类:

public final class StringBuffer extends Object implements Serializable,CharSequence

StringBuilder类:

public final class StringBuilder extends Object implements Serializable,CharSequence

通过三个定义结构可以发现,String、StringBuffer和StringBuilder类都是CharSequence接口的子类,也就证明String、StringBuffer和StringBuilder类的对象都可以利用自动向上转型的操作为CharSequence接口实例化。

区别四:String类和StringBuilder、StringBuffer类的转换。
1.String类通过apend()方法转换成StringBuilder和StringBuffer类。

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String str="xxx";
        StringBuffer sb=new StringBuffer(str);
        StringBuilder sbd=new StringBuilder(str);
        //输出Str的类型
        System.out.print(str.getClass()+":");
        System.out.println(str);
        //输出sb的类型
        System.out.print(sb.getClass()+":");
        System.out.println(sb);
        //输出sbd的类型
        System.out.print(sbd.getClass()+":");
        System.out.println(sbd);
    }
}

be6b38bf7d317fb596e88530cff3edd1.png

根据输出结果可以得出,将字符串str,通过append()方法转换成StringBuffer类和StringBuilder类。

2.StringBuffer类和StringBuilder类通过to.String()方法转换成String类型

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        StringBuffer sb=new StringBuffer("xxx");
        StringBuilder sbd=new StringBuilder("yyy");
        //StringBuffer类转String
        String str1=sb.toString();
        //StringBuilder类转String
        String str2=sbd.toString();
        System.out.print(str1.getClass()+":");
        System.out.println(str1);
        System.out.print(str2.getClass()+":");
        System.out.println(str2);
    }
}

862b90931c0e9758e08ccee345f2169e.png

区别五:String类、StringBuffer和StringBuilder类中定义的常用方法,三类的大部分方法(下例)可以互补。

public StringBuffer append()
public StringBuffer reverse()
public StringBuffer insert()
......

区别六:线程安全性方面

1.StringBuilder(非线程安全)

该类提供一个与StringBuffer兼容的 API,但不能保证同步,所以在性能上较高。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

2.StringBuffer(线程安全的)

StringBuffer上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

  • 17
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值