jdk源码学习之String,手动实现一个String
package com.amazing.jdk.string_2017_12_31;import java.io.Serializable;import java.util.Arrays;/** * Created by yaming on 17-12-31. */public final class MyString implements Serializable{ private final char value[];//数组 private int hash; private static final long serialVersionUID = -6849794470754667710L; public MyString() { this.value =new char[0]; } public MyString(char[] value) { this.value = value; } /** * 返回String长度 * @return */ public int length(){ return value.length; } /** * 取得该位置上的char * @param index * @return */ public char charAt(int index){ if(index<0|| index>=value.length) throw new StringIndexOutOfBoundsException(); return value[index]; } /** * 实现comparable接口,实现compareTo方法。 * 按词典比较String的内容,结果正,负,零。大小写不等价 * 思想: * 从第一个字符开始比较。 * 比较次数是长度小的字符串长度 * 如果前面都相同,比较字符串长度 * @param another * @return */ public int compareTo(MyString another) { int len1=value.length; char[] str1=value; int len2=another.value.length; char[] str2=another.value; int min=Math.min(len1,len2); int k=0;//从第一个字符开始比较 while (k0){ char val[] = value; for (int i = 0; i
分析:
1.该类被final修饰,所以不可以被继承
2.为什么每次修改字符串都new String()?
final char [] value; //String的底层是字节数组。被final修饰,该字节数组不可以被修改。所以每次修改都new一个String
3.该类重写了equals方法。
Object类里的方法是比较两个字符串的引用是否相同,String类重写了equals方法,比较的是两个字符串的值。
[ 注: == 号比较基本数据类型时,比较的是数据的值是否相同。比较引用类型的时候,比较的引用是否相同