标签:enc 接口 方法 new 使用 大小 安全 zed 常用类
String是java里一个常用类,关于String从源码中我们可以知道String是不可以有子类的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
...
}
String类由final修饰,是不能有子类的。
String实现了序列化接口(Serializable),预示着String对象是可序列化的。
另外还实现了Comparable和CharSequence接口。
String对象一旦初始化就不能再改变了,即使调用其字符拼接等方法,也只是拼接得到一个新的String对象。
虚拟机提供了一个字符串常量池,相同的字符串再常量池中只有一个,用到相同字符串时直接引用同意字符串常量。String类提供了一个intern方法可以将字符串加到常量池中,即使已经有同样的字符串。
String s1 = "str";
String s2 = "str";
String s3 = new String("str");
s3.intern();
可以看到s1和s2引用的同一个字符串,而调用intern方法之后的s3引用的是另一个“str”。
在程序中频繁的拼接、修改、剪切字符串时,如果使用String类势必会在常量池中产生大量字符串,那就需要使用StringBuffer和StringBuilder了。
StringBuffer和StringBuilder是可修改的字符串类。这两个类都是继承于AbstractStringBuilder并实现了Serializable和CharSequence接口,因此使用方法大体一致。
//StringBuffer中的append(String str)方法
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//StringBuilder中的append(String str)方法
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
从源码中可以看到这两个方法类似,具体的操作都是调用父类的append方法。但是在两个类的源码对比中可以发现StringBuffer的大部分方法都有synchronized修饰而StringBuilder没有。
synchronized可以保证在同一时刻只有一个方法进入临界区,因此StringBuffer类时线程安全的,而StringBuilder是线程不安全的。
在单线线程中StringBuffer和StringBuilder使用没有太大区别,而在多线程中使用StringBuffer更合适。
private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
AbstractStringBuilder类中的方法。从这个方法可以看出字符数组的增长方式是**原大小*2+2**。
String、StringBuffer和StringBuilder
标签:enc 接口 方法 new 使用 大小 安全 zed 常用类
原文地址:https://www.cnblogs.com/Vaxy/p/11380410.html