0
点赞
收藏
分享

微信扫一扫

String,StringBuffer 与 StringBuilder 的比较

我是芄兰 2022-02-22 阅读 177

**前言:**String是我们在编写程序的时候最常使用的包装类,他的功能十分多,使用起来也很方便,所以我们对她要有深入的了解,而StringBuffer与StringBuilder是 对String的增强,它们又有哪些特性,接下来我们进行深入讲解。

String

String的结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QoRhsjKF-1645468409990)(7bcc79862ecf105706db951a089de95f.png)]

1.实现的接口

Serializable 说明String的对象可以序列化,可以在网络传输

Conparable 说明String的对象可以进行比较大小

2.String类有多种构造器,常用的:

String s1 = new String();

String s2 = new String(String original);

3.String的源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    }

可以看出String用final修饰,不能被继承,

属性private final char value[] 用于存放字符串内容 (很重要),可以看出,String类的本质是一个字符数组,而且用final修饰,赋值以后就不可修改(这里指的是引用地址不可修改,就是不能在指向新的地址,但是内部的字符可以修改),存放在常量池。

**4.创建String对象的方式:**这两种创建方式,内存分布不同

方式1:String s1 = “aaaa”; 红色线

先看常量池是否有”aaaa“的数据空间,如果有,直接指向;如果没有,则创建并指向;s1最终指向常量池的空间地址

方式2:String s2 = new String(“aaaa”) 绿色线

先在堆中创建空间,里面维护了value属性,指向常量池的”aaaa“的空间地址。如果常量池有”aaaa“。直接通过value指向;如果没有,重新创建,再通过value指向。s2最终指向堆中的空间地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eV4hjQuK-1645468409991)(9149104b3034db79927488ccc3f24964.png)]

5.String的特性 : 常量相加,看的是池;变量相加,是在堆中

String有许多的方法,在这里就不讲述了,主要说一下他的特性

看如下例子

String a = "hello";
String b = "world";

String c = "hello" + "world";
String d = a + b;
请问:c == d   ?      答案:fales

这就涉及到了我们提到的String的特性,c是两个常量相加得到的,d是两个变量相加得到的,这和String的底层设计有关。

StringBuffer(StringBuilder相似)

StringBuf’ffer的结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58LllTb3-1645468409992)(617139f3095ace6c8e82dbf40b2b4eee.png)]

1.实现的接口:**

Serializable 说明StringBuf’ffer的对象可以序列化,可以在网络传输

2.StringBuffe的源码:

 public final class StringBuffer extends AbstractStringBuilder  implements java.io.Serializable, CharSequence{
    private transient char[] toStringCache;
}

其直接父类AbstractStringBuilder的源码
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;
}

可以看出StringBuffe用final修饰,不能被继承

其父类有属性char[] value,不是用final修饰(这是与String最大的不同之处),value数组存放字符串内容,放在堆中,

3.StringBuffer的构造器

//1.创建了一个大小为16 的char[],存放字符内容
StringBuffer stringBuffer = new StringBuffer();
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer() {
        super(16);
    }
//2.通过构造器指定char[]的大小
StringBuffer stringBuffer = new StringBuffer(100);
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer(int capacity) {
        super(capacity);
    }
//通过给定一个String创建
StringBuffer stringBuffer = new StringBuffer("hello");
进入源码,可以看到它是通过这个构造器来创建的
public StringBuffer(String str) { 
        super(str.length() + 16);
        append(str);
    }

4.String 与 StringBuffer 之间的转换

String ——> StringBuffer

String str = “hello”;

StringBuffer b = new StringBuffer(str);


StringBuffer ——> String

StringBuffer b = new StringBuffer(“world”);

String a = b.toString();

总结

  1. StringBuilder 与 StringBuffer 非常相似,都是可变字符序列,而且方法也一样
  2. String是不可变字符序列,效率低,但复用率高
  3. StringBuffer 效率较高(增删),线程安全
  4. StringBuilder 效率最高,线程不安全
  5. 如果字符串存在大量的修改操作,一般使用StringBuilder 与 StringBuffer;如果字符串修改比较少,别多个对象引用,一般用String,比如配置信息
举报

相关推荐

0 条评论