JDK源码系列(3)-String

在JDK中,String的使用频率和被研究的程度都非常高,所以接下来我只说一些比较重要的内容。

一、String类的概述

String类的声明如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence

类被final修饰,所以String类不能被继承。实现了3个接口。CharSequence有字符相关操作的默认实现方法。

二、String类的属性和方法介绍

两个重要的属性:

    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

字符数组value[]中存的就是字符串对应的每个字符,注意也是用final修饰的,所以说字符串是不可变的。

构造方法一大队,都是为了给字符数组赋值的:

 

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;
    }

hashcode方法:

    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

还有很多其他方法,大部分对字符串的操作,都是生成一个新的字符串,对原来的字符串并无影响。

三、String在jdk8新增的方法

    public static String join(CharSequence delimiter, CharSequence... elements) {
        Objects.requireNonNull(delimiter);
        Objects.requireNonNull(elements);
        // Number of elements not likely worth Arrays.stream overhead.
        StringJoiner joiner = new StringJoiner(delimiter);
        for (CharSequence cs: elements) {
            joiner.add(cs);
        }
        return joiner.toString();
    }

join方法作用是将字符序列数组或集合通过分割符delimiter连接成一个字符串。第一个方法使用的是可变参数,第二个方法使用的可迭代参数,通过遍历数组或集合将数组元素或集合元素添加到StringBuilder,添加前会先加入一个分割符delimiter,然后将StringBuilder中的内容返回。

参考资料:

1、 https://www.jianshu.com/p/13b10f44a7bb
2、 https://blog.csdn.net/weixin_39788856/article/details/95042195;

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: