JDK源码系列(3)-String

简介: JDK源码系列(3)-String

 

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

 

一、String类的概述

String类的声明如下:

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

image.gif

类被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

image.gif

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

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

image.gif编辑

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

image.gif

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

image.gif

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

三、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();
    }

image.gif

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

参考资料:

    1. https://www.jianshu.com/p/13b10f44a7bb
    2. https://blog.csdn.net/weixin_39788856/article/details/95042195
    相关文章
    |
    4月前
    |
    缓存 Dubbo Java
    趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
    趁同事上厕所的时间,看完了 Dubbo SPI 的源码,瞬间觉得 JDK SPI 不香了
    |
    3月前
    |
    缓存 Java Spring
    Spring 源码阅读 66:基于 JDK 的 AOP 代理如何获取拦截器链(4)- 将 Advice 封装为拦截器
    【1月更文挑战第1天】本文分析了 Advice 被封装成 MethodInterceptor 的过程,Spring AOP 用到的五种 Advice 中,有些本身就是 MethodInterceptor 的实现类,而有些需要通过适配器的封装。
    43 0
    |
    1月前
    |
    算法 Java 索引
    【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
    【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
    31 0
    |
    2月前
    |
    设计模式 Java
    根据JDK源码Calendar来看工厂模式和建造者模式
    根据JDK源码Calendar来看工厂模式和建造者模式
    33 3
    |
    3月前
    |
    Java Linux iOS开发
    Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
    Spring5源码(27)-静态代理模式和JDK、CGLIB动态代理
    23 0
    |
    3月前
    |
    XML Java 数据格式
    Spring 源码阅读 70:基于 JDK 的 AOP 代理拦截器链执行(4)- 容易被忽略的 ExposeInvocationInterceptor
    【1月更文挑战第5天】本文分析了 Spring AOP 拦截器链中的一个特殊拦截器 ExposeInvocationInterceptor 的注册的时机以及它的作用。至此,基于 JDK 的 AOP 代理拦截器链执行的逻辑就分析完了。
    387 0
    |
    3月前
    |
    Java 索引 Spring
    Spring 源码阅读 69:基于 JDK 的 AOP 代理拦截器链执行(3)- MethodInterceptor 分析
    【1月更文挑战第4天】本文详细分析了 Spring AOP 中五种增强类型对应的拦截器中增强方法的执行逻辑,结合上一篇中分析的 ReflectiveMethodInvocation 中proceed方法的执行逻辑,就组成了完整的拦截器链递归调用的逻辑。
    34 0
    |
    3月前
    |
    Java 索引 Spring
    Spring 源码阅读 68:基于 JDK 的 AOP 代理拦截器链执行(2)- ReflectiveMethodInvocation 分析
    【1月更文挑战第3天】本文分析了 ReflectiveMethodInvocation 类中的proceed方法,通过对这个方法的分析,了解了连接器链中的增强逻辑是如何逐层执行的,以及目标方法是什么时候被调用的。
    31 0
    |
    3月前
    |
    Java Spring
    Spring 源码阅读 67:基于 JDK 的 AOP 代理拦截器链执行(1)- 执行前的准备工作
    【1月更文挑战第2天】本文总结了 JdkDynamicAopProxy 的invoke方法在获取到拦截器链之后,是如何开始执行增强逻辑的。对于拦截器链为空的情况,会直接调用目标方法,而存在拦截器的情况下,会将拦截器链和目标方法调用的信息封装成一个 MethodInterceptor 对象,执行其proceed方法,来完成增强逻辑和目标方法的执行。
    21 0
    |
    4月前
    |
    Arthas 缓存 Java
    [Jvm]程序员的精进之路~JDK代理源码初探
    [Jvm]程序员的精进之路~JDK代理源码初探