String,StringBuilder ,StringBuffer 三者之间的区别

String

String字符串常量
java.lang.String类,不属于8种基本数据类型,String是一个对象,表示字符串常量。
因为对象的默认值是null,所以String的默认值也是null,但它又是一种特殊的对象,有其他对象没有的特性。
new String()和new String("")都是声明一个新的空字符串,是空串不是null。区别:空串是经过new运算符分配了内存,即实际存在了(定义了)。而null则没有(只声明),调用null的字符串的方法会抛出空指针异常。
String类是final的,不可被继承。public final class String。
String类的本质是字符数组char[],并且其值不可改变。private final char value[];
String类对象有个特殊的创建方式,如String x="abc"; "abc"就表示一个字符串对象,而x是"abc"对象的地址,叫做"abc"引用。
创建字符串的方式归纳起来有三种:
使用new关键字创建字符串,String s = new String("abc");
直接指定,String s = "abc";
使用串联生成新的字符串,String s = "ab" + "c";

StringBuffer

StringBuffer字符串变量(线程安全)
StringBuffer是一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
append代码如下:

        String str = "a"+ "b" + 1;
        StringBuffer buffer = new StringBuffer(str);
        buffer.append("c");
        System.out.println(buffer);
        输出结果
        ab1c

insert代码如下:

 String str = "a"+ "b" + 1;
 StringBuffer buffer = new StringBuffer(str);
buffer.insert(2,"java");
System.out.println(buffer);
输出结果
abjava1c

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

StringBuilder

StringBuilder字符串变量(非线程安全)
StringBuilder比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。
StringBuilder此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快

String和StringBuffer的区别

String 是不可变的对象,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,每次生成对象都会对系统性能产生影响。
而 StringBuffer 类,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

StringBuffer和StringBuilder的区别

StringBuffer线程安全(多线程操作字符串缓冲区 下操作大量数据)
StringBuilder非线程安全(单线程操作字符串缓冲区 下操作大量数据)
StringBuilder要比StringBuffer执行速度快。

你可能感兴趣的:(String,StringBuilder ,StringBuffer 三者之间的区别)