类
1 String被final修饰 说明String 无法被其他类继承
2 实现Serializable接口 说明String可以序列化
3 实现Comparable接口 String可以进行对应的排序
4 实现CharSequence接口 CharSequence就是字符序列说明String是通过字符数组实现的
CharSequence它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口
属性
/** 该值用于字符存储。 */ 更说明 String本质是char类型的数组
private final char value[];
/** 缓存字符串的哈希代码 */
private int hash; // 默认为0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
/**
* Class String is special cased within the Serialization Stream Protocol.
*
* A String instance is written into an ObjectOutputStream according to
* <a href="{@docRoot}/../platform/serialization/spec/output.html">
* Object Serialization Specification, Section 6.2, "Stream Elements"</a>
*/
private static final ObjectStreamField[] serialPersistentFields =
new ObjectStreamField[0];
方法
public int length() {
return value.length; // 数组value[]的属性
}
public boolean isEmpty() {
return value.length == 0; // 根据数组value[]的长度
}
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index]; //返回第index个字符,下标从0开始
}
public int codePointAt(int index) { //返回指定下标的代码点 也就是汉字或英文字符等在unicode编码中代表的数字 为十进制 可通过工具转十六进制在转回字符
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return Character.codePointAtImpl(value, index, value.length);
}
public boolean equals(Object anObject) {
// 二个对象不是存放在堆空间 试用如 String a= "a"; 这样的默认放入扎空间;
//开始先和自己进行对比
if (this == anObject) {
return true;
}
//判断是否是String类的数据,其他自定义类型的如果不重写equals() 方法
//那么就是引用Object的equals方法也就是通过 == 对比
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;
}
按字典顺序比较两个字符串。
public int compareTo(String anotherString) { // 排序
int len1 = value.length;
int len2 = anotherString.value.length; //anotherString的字符长度
int lim = Math.min(len1, len2);// 返回二个int较小的值
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) { //
return c1 - c2; //从0开始一但其中一个的unicode编码代码点不同,返回它们二个代码点的差
}
k++;
}
return len1 - len2;
}
测试此字符串是否以指定的后缀结尾。
public boolean endsWith(String suffix) {
return startsWith(suffix, value.length - suffix.value.length); //如此相减 有力使其只对比最后几个
}
public boolean startsWith(String prefix, int toffset) {
char ta[] = value;
int to = toffset; // 从哪里开始对比
char pa[] = prefix.value;
int po = 0;
int pc = prefix.value.length;
// Note: toffset might be near -1>>>1.
if ((toffset < 0) || (toffset > value.length - pc)) {
return false;
}
while (--pc >= 0) {
if (ta[to++] != pa[po++]) {
return false;
}
}
return true;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value; // value并不是*.hashCode中的* 而是java.lang.invoke包中接口属性 如java.lang.invoke.MethodHandleImpl.MAX_ARITY
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i]; //每个字符的代码点相互乘得到的int数字 引用的不同的类型做前缀
}
hash = h;
}
return h;
}
如有不正确之处欢迎指点
原文:https://blog.csdn.net/nullandmy/article/details/83271482