Java String、StringBuilder、StringBuffer区别和联系

1、三者之间的继承实现接口关系

Java String、StringBuilder、StringBuffer区别和联系_第1张图片

一、String:查看JDK API文档可知:

1、首先String被final修饰是不能被继承的,字符串是常量,在内存中可以共享 。

		String s1 = "abc";
		String s2 = "abc";
		System.out.println(s1 == s2);

结果为:true 

每次创建后不能更改。也就是说每次对String字符串进行改变操作实际上是创建一个新的String对象。

查看String的subString、concat等方法可知,实际上是返回一个新的String对象

    public String substring(int beginIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        int subLen = value.length - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
    }




    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }

2 、因为每次添加字符串创建新对象的方式不仅效率低,而且浪费内存,所以当String通过+添加字符串时,实际上是调用StringBuilder或StringBuffer中的append方法来添加字符的,并通过toString方法返回结果

 

 二、StringBuilder

   是一个可变字符序列,有一个初始容量capacity,可以手动设置,JDK1.8中默认初始容量为16,当字符串的大小大于原容量时,容量等于字符串长度+16

    public StringBuilder(String str) {
        super(str.length() + 16);
        append(str);
    }

   此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 

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

   通常,如果 sb 引用 StringBuilder 的实例,则 sb.append(x)sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区。如果内部缓冲区溢出,则此容量自动增大。 

 

三、StringBuffer

 支持和StringBuilder所有相同的操作,不同的是StringBuffer是线程安全的,在声明的方法中使用synchronized关键字进行修饰,因此单线程中一般要比StringBuilder效率低

你可能感兴趣的:(Java)