当前位置: 移动技术网 > IT编程>开发语言>Java > 荐 (全文4653字)String、StringBuffer和StringBuilder的六大区别

荐 (全文4653字)String、StringBuffer和StringBuilder的六大区别

2020年08月10日  | 移动技术网IT编程  | 我要评论
String:适用于少量的字符串操作。StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。区别一:String是final类不能被继承且为字符串常量,而StringBuilder和StringBuffer均为字符串变量。在Java中字符串使用String类进行表示,但是String类表示字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是改变的是其内存地址的指向。”所以String类不

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());
    }
}

额额
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);
    }
}

在这里插入图片描述
区别三:类的定义不同
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);

    }
}

在这里插入图片描述

根据输出结果可以得出,将字符串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);
    }
}

在这里插入图片描述
区别五: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 方法则在指定的点添加字符。

本文地址:https://blog.csdn.net/zkzbhh/article/details/107891163

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网