String源码解析,基于java8

CharSequence:

charSequence是一个接口,表示char值的一个可读序列,
是一个描述字符串结构的接口,在这个接口里一般有三种常用的子类
:   String类 , StringBuffer类 , StringBuilder类

compareTo:按字典顺序比较

源码如下:

JAVA中string类源码 string类的源码分析_字符串

compareToIgnoreCase:按字典顺序比较,忽略大小写

底层实现就是比compareTo多了个忽略大小写的操作

源码如下:

JAVA中string类源码 string类的源码分析_数组_02


忽略大小写的操作咱们就不要看了,如果有需要大家可以自己去调试看看

hashCode的计算方式 如下图:

JAVA中string类源码 string类的源码分析_JAVA中string类源码_03

substring:

查看源码:在substring方法中调用了string的构造方法
    在string的构造方法中调用了Arrays.copyOfRange(参数1 数组,参数2 start位置,参数3 数组长度),
    在copyOfRange中调用了System.arraycopy(src 原数组,srcPos 原数组的起始位置,dest 目标数组,destPos 目标数组起始位置,length 复制的长度)

replace:

查看源码:实现步骤如下
如果新字符与旧字符相同直接返回this,
之后去循环找到旧字符的位置并保存到i,
创建一个新的数组,数组长度和原数组一样,
遍历小于i的长度,循环将相同的字符添加到新数组,<!-- 这一步非常妙,节省了很多不必要的判断,优化代码执行效率 -->
这时候就找到了要替换的字符位置,
这里使用了三元运算符,如果该位置的字符等于旧字符,就替换为新字符
buf[i] = (c == oldChar) ? newChar : c;   <!-- 特别棒 -->

matches:

public boolean matches(String regex) { <!-- 参数regex为正则表达式 -->  
    return Pattern.matches(regex, this); 
}
这个方法是返回是否匹配指定的字符串,

split:

很多方法都是和split一样,会用很多重载的方法,而最终执行逻辑的方法就一个,
只是给参数赋初始值

CharSequence:

描述字符串结构

Join:

我们先来试一下Join方法怎么使用

JAVA中string类源码 string类的源码分析_字符串_04


得到的结果是

JAVA中string类源码 string类的源码分析_大小写_05


那我们来进入源码看一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JAVA中string类源码 string类的源码分析_字符串_06


调用了StringJoiner的add方法我们进去看一下:

JAVA中string类源码 string类的源码分析_JAVA中string类源码_07


JAVA中string类源码 string类的源码分析_java_08


这里的返回类型是StringBuilder,调用父类AbstractStringBuilder的append方法,

JAVA中string类源码 string类的源码分析_数组_09


然后一步步返回到add方法,

这时候我们得到的字符数组是join-

接下来执行append(newElement方法),将String添加进去,

同样是调用父类AbstractStringBuilder的append方法,

JAVA中string类源码 string类的源码分析_java_10


这里都是append的重载,这里看图四,得到结果之后一步步返回到add,

当得到全部数据之后调用toString,将数组转换为字符串返回

toLowerCase

Locale.getDefault() 获取当前的语言环境
将字母转成小写,源码表示看着有点困难就么有看,
也没有找到相关的博客

trim

去除头尾的空格
t() 获取当前的语言环境
将字母转成小写,源码表示看着有点困难就么有看,
也没有找到相关的博客

trim

去除头尾的空格

JAVA中string类源码 string类的源码分析_大小写_11