该文章基于jdk1.8
String 不可变性
String类是被final修饰的,意味着String是不可变的,那么为什么这么设计呢?其实源码里的注释给出了答案:
their values cannot be changed after they are created.
String buffers support mutable strings.
Because String objects are immutable they can be shared.
因为String 可以被共享,所以不可变。
如果字符串可变的话,当两个引用指向指向同一个字符串时,对其中一个做修改就会影响另外一个。
不可变对象可以自由地在多个线程之间共享。不需要任何同步处理。
所以String设计成不可变是安全而且高效的。
String 实现的接口
String 实现了三个接口,分别是 java.io.Serializable ,Comparable,CharSequence
java.io.Serializable
序列化接口
Comparable
比较对象大小的接口 该接口有一个compareTo(T o)方法。实现 该方法比较对象大小,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。以下是String对compareTo的实现:
从第一个字符开始比较,当遇到较小的字符时,判断该字符串小,如果循环中两个字符串比较的字符都相等,那么判断字符串长度长的字符串大。
CharSequence
CharSequence 对许多不同实现类的 char 序列提供统一的只读访问。
CharSequence 有四个抽象方法,分别是:
int length();
返回字符序列的长度,也就是该字符序列字符的数量。以下是String 对int length()的实现
直接返回了字符数组的长度
char charAt(int index);
返回该字符序列指定索引的字符,以下是String 对char charAt(int index)的实现
判端了传入索引是否在字符数组索引范围内,不在范围内,抛出索引越界异常。反之则返回字符。
subSequence(int start, int end);
返回指定索引范围的子字符序列,如果start==end ,返回空字符串。
直接调用了substring方法。
String toString();
返回字符序列组成的字符串 直接返回自己:
public String toString() {
return this;
}
CharSequence还有两个默认方法:
chars
public default IntStream chars() {
class CharIterator implements PrimitiveIterator.OfInt {
int cur = 0;
public boolean hasNext() {
return cur < length();