Java SE——String

这是关于String类型的介绍,查看的源码是通过idea查看1.8的
一 实现的接口
在这里插入图片描述
1.java.io.Serializable
 这个序列化接口是一个空接口,也就是说这个接口没有声明任何的方法,所以实现这个接口的类也就不需要实现任何的方法。 仅用于标识序列化的语意。
 在这里插入图片描述
2.Comparable
这个接口只有一个compareTo(T 0)接口,用于对两个实例化对象比较大小。
在这里插入图片描述
3.CharSequence
 这个接口是一个只读的字符序列。包括length(), charAt(int index), subSequence(int start, int end)等几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了改接口。
 二 成员变量
 在这里插入图片描述
 1.可以看到,char value[]是存储String的内容的,所以使用String str = “abc”;的时候,本质上,"abc"是存储在一个char类型的数组中的,而且是被final所修饰的。
 2.而hash是String实例化的hashcode的一个缓存。因为String经常被用于比较,比如在HashMap中。如果每次进行比较都重新计算hashcode的值的话,那无疑是比较麻烦的,而保存一个hashcode的缓存无疑能优化这样的操作。
 三 内部类
 String只有一个内部类:

  public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                         = new CaseInsensitiveComparator();
    private static class CaseInsensitiveComparator
            implements Comparator<String>, java.io.Serializable {
        // use serialVersionUID from JDK 1.2.2 for interoperability
        private static final long serialVersionUID = 8575799808933029326L;

        public int compare(String s1, String s2) {
            int n1 = s1.length();
            int n2 = s2.length();
            int min = Math.min(n1, n2);
            for (int i = 0; i < min; i++) {
                char c1 = s1.charAt(i);
                char c2 = s2.charAt(i);
                if (c1 != c2) {
                    c1 = Character.toUpperCase(c1);
                    c2 = Character.toUpperCase(c2);
                    if (c1 != c2) {
                        c1 = Character.toLowerCase(c1);
                        c2 = Character.toLowerCase(c2);
                        if (c1 != c2) {
                            // No overflow because of numeric promotion
                            return c1 - c2;
                        }
                    }
                }
            }
            return n1 - n2;
        }

        /** Replaces the de-serialized object. */
        private Object readResolve() { return CASE_INSENSITIVE_ORDER; }
    }

四 构造器
String支持多种构造方法,但本质上都是将接受到的参数传给局部变量value[]。
在这里插入图片描述
new String()的时候是创建长度为0的字符串,也就是说是可以直接利用 “” 的char数组。
在这里插入图片描述
五 方法

//求字符串长度,可以看到是调用的字符数组的length属性,但是在字符串却是方法
   public int length() {
        return value.length;
    }
    //也是调用数组的长度属性,判断是不是为0
    public boolean isEmpty() {
       return value.length == 0;
    }
    //调用的数组的方法,根据索引获得值
    public char charAt(int index) {
      if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

猜你喜欢

转载自blog.csdn.net/weixin_42255265/article/details/83112112