**前言:**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();
总结
- StringBuilder 与 StringBuffer 非常相似,都是可变字符序列,而且方法也一样
- String是不可变字符序列,效率低,但复用率高
- StringBuffer 效率较高(增删),线程安全
- StringBuilder 效率最高,线程不安全
- 如果字符串存在大量的修改操作,一般使用StringBuilder 与 StringBuffer;如果字符串修改比较少,别多个对象引用,一般用String,比如配置信息