荐 (全文4653字)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());
}
}
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
上一篇: 【JVM】类的加载过程
下一篇: Java抽象类
推荐阅读
-
String、StringBuffer和StringBuilder类的区别
-
String、StringBuilder和StringBuffer的区别
-
String、StringBuffer和StringBuilder的区别
-
荐 (全文4653字)String、StringBuffer和StringBuilder的六大区别
-
java String、StringBuilder和StringBuffer的区别详解
-
Interview ➣ ➣String StringBuffer 和 StringBuilder 的区别
-
String、StringBuffer和StringBuilder类的区别
-
Java:String、StringBuffer和StringBuilder的区别
-
String、StringBuilder和StringBuffer的区别
-
JAVA中String、Stringbuffer和StringBuilder的区别