String,StringBuffer,StringBuillder的底层架构转载

原创
小哥 3年前 (2022-10-28) 阅读数 5 #大杂烩

一:StringBuffer的底层

(1)线程安全的字符串操作类。

(2)通过synchronized一种多线程环境下保证数据安全的关键字声明同步方法

public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
(3)底层存储数据。Char[]数组,则数组的长度为。16。如果构造函数有新的传入字符传输str,则16基础上加str.length.
public StringBuffer() {
super(16);
}
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
(4)添加字符串的过程。

-->先检查一下里面。char[]阵列是否需要扩展

-->如果需要展开,请先展开,然后展开原始元数据。copy添加到新阵列中。

-->然后将新添加的元数据添加到新的char[]数组中

public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
//检查char[]阵列是否需要扩展,扩容,并将原来的数据copy输入新扩展的阵列
ensureCapacityInternal(count + len);
//将新添加的数据添加到StringBuilder中的char[]数组,实现字符串的相加。
str.getChars(0, len, value, count);
count += len;
return this;
}

/*
元数组char[]扩容过程
/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length
2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}

/*
扩容实现
*/
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
二:StringBuillder的底层

(1)线程非安全字符串操作类。

(2)字符串的添加不同步处理,涉及数组的扩展,容易产生脏数据,破坏数据的正确性。

(3)基础结构和StringBuffer实现基本相同,但没有同步。

--->StringBuffer和StringBuillder两者都继承抽象类AbstractStringBuilder抽象类该字符串已实现。操作的方法。

--->StringBuffer和StringBuillder模板方法的实现,采用了模板方法的设计模式,核心数据操作在父类方法中,子类实现各自独特的功能函数,涉及核心操作,调用父类方法。

三:String的底层

String类不提供修改字符串的方法。String类对象是不变的字符串,如字符串。string=”HELLO“始终仅包含HELLO这些信件不能修改它们中的任何一个。当然,您可以修改字符串变量。string对另一个字符串的引用。
不可变字符串有一个优点:编译器允许共享字符串。实际上只使用字符串常量。 “声明,存储在字符串常数池中)是共享的,subStrng,+此类行动的结果不能共享。
在比较字符串值是否相等时使用。equals()方法,则不能使用==,==比较的是字符串的地址是否相同。如果字符串位于常量池中,则可以使用它。==比较,因为所有都指向相同的字符串。

直接使用 ” ” 声明的String对象直接存储在常量池中(可以共享)
1.String str1=”first”;
jvm在运行时,在常量池中查找该字符串,如果是,则直接返回对该字符串的引用。first(该字符串已实现。 的共享) ;否则,首先在常量中
在池中创建该字符串,并返回一个引用。
这仅在常量池中创建。String对象不是在堆中创建的。
2.String str2=new String(“second”);
该代码生成两个String物体。因为使用了“”,所以常量池现在将查找second对象,如果不是,则创建
否则,不会创建它;new,jvm将在堆中创建相同的内容。String对象,并将引用
返回给str2.
3.String str3=”what”; String str4=str3+”a nice day”;
运行时,+ 相当于new,所以将会有“what a nice day“对象;将会有”what” “a nice day两个对象,不是what a nice day”对象。

4.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String
————————————————
版权声明:本文是CSDN博客作者的原创文章《几美元和一股凉风》如下CC 4.0 BY-SA版权协议,转载请附上原始来源链接和本声明。
原始链接:https://blog.csdn.net/lisulong1/article/details/79310501

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除