String源码阅读
String类是final类,且实现了java.io.Serializable,Comparable<String>,CharSequence 接口
主要有三个属性,都是private:
- 内部的字符存储是final 的char[], 由于没有暴露给外界的修改char[] 的接口,所以String是不可变对象
- serialVersionUID用于序列化反序列化的验证
- hash值
重载构造器
String重载了许多构造器方法,可以通过现有的String对象创建string对象(仅仅此方法对hash的值进行了更新),截取byte[]数组某段创建,通过char[]对象创建,通过存储着codepoint的int[]创建对象,甚至可以指定字符集。
通过codepoint的数组创建对象时,涉及到的知识:BMP,utf-8,utf-16等,见链接:
Plane
utf-8
utf-16
在java中默认采用的是unicode字符集和utf-16编码.(对utf-16的编码方法了解不够,有一些codepoint的方法没看).
发现了一个稍微有点特别的构造方法:
String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}
value对象直接复制给String,share是true,为了保持封装,其他的方法都是利用Arrays.copyOf(char[] , length)或者是Arrays.copyOfRange([],offset, offset+count),所以这个构造方法可以创建出一个可变String对象,然而是包可见。
实用的方法:
- void getChars(char dst[] , int dstBegin): 此方法仅包可用,调用了System.arraycopy(source,sourceBegin, dst, detBegin,length);
- public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin),同样调用了System.arraycopy();
- public boolean equalsIgnoreCase(String anotherString)
- public int compareToIgnoreCase(String str)
- public boolean startsWith(String prefix)
- public boolean endsWith(String suffix)
- public int indexOf(int ch)
- public int indexOf(int ch, int fromIndex)
- public int lastIndexOf(int ch, int fromIndex)(searching backward starting at the specified index. )
- static int indexOf(char[] source, int sourceOffset, int sourceCount,
String target, int fromIndex) - public String substring(int beginIndex)并不能创建相同值的另一个String对象,因为beginIndex==0时返回this
- public String concat(String str)
char buf[] = Arrays.copyOf(value, len + otherLen);
//Arrays.copyOf如下
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;
}
- public String replace(char oldChar, char newChar)
- public boolean matches(String regex)
- public boolean contains(CharSequence s)
- public String toUpperCase()
- public String trim()
- public static String format(String format, Object... args
- public static String valueOf(boolean b)
- public native String intern();(原生方法)
重写的equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
1. 如果是同一个对象,true
2. anobject是否是string,不是false
3. 此时先比较比较具体的值char v2[] = anotherString.value;之所以private的value可以被访问是因为在同一个类中
String对象不仅可以和String对象比较还可以和CharSequence(contentEquals)对象,AbstractStringBuilder对象(private),StringBuffer对象(public boolean contentEquals)
f