欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-10 18:27:16
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());
    }
}

荐
                                                        (全文4653字)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);
    }
}

荐
                                                        (全文4653字)String、StringBuffer和StringBuilder的六大区别
区别三:类的定义不同
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);

    }
}

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

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

荐
                                                        (全文4653字)String、StringBuffer和StringBuilder的六大区别
区别五: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