博主还是言简意赅的风格,先给大家看一下java.lang.String的初始化静态绑定的属性以及构造method。
首先看到的是一个final修饰的char数组,然后一个int类型的hash值,还有一个static final修饰的数组实例化的是以下的类
可以看到该类实现了Comparable<Object>,顾名思义也就是比较的意思。
接着介绍几个String的方法,大家也比较熟悉的。
首先我在String源码里debug去实例化一个String,通过Debug可以看到String的数据结构是一个char数组,这对我们理解更多的String方法有很大的帮助。
String这个处理很暴力,你要调length或者isEmpty实际上就是去底层看char数组的长度,为0当然就是空咯。
这个方法是最好玩的,也是问的最多的,==和equals有什么区别。
这里可以看到String的源码对于equals是这样操作的,首先判断==是否为true,如果为true就不用接着判断了,两个都是一个地址(理论上的,实际hashcode算法也有误差)了也不存在不相等的情况了。如果为false呢,下面我分析一下。
如果==为false,就需要判断字节的相等与否,那么注意String的char字节是final的,一旦声明不可改变,equals方法的value和this都代表String本身,调用equals本身就是这个final的value和参数的比较。
那么String的处理是首先判断是不是String的instance,是的话,声明一个String接收参数数值的引用,然后判断如果调用equals的String本身和要比较的参数length一样,就用char数组接收了以后逐个下标比较,直到不相等为止,如果从头到尾都等,就返回true,
这就是String的equals方法原理,而且hashmap等类集框架广泛应用这个方式,重写equals和hashcode方法也是很多数据结构处理数据的一个手段。
这就是String的hashcode源码,其实就是循环底层char数组长度去计算h的值,然后把引用给hash。算法采用的是31奇数的权重算法,大的if条件是String有值,且hash的值为0;
打个比方“abc”这个String类型的数据,它的计算hash值的方式就是根据ASCII码计算上面的公式(char(a,b,c)分别对应ASCII计算机国际码对于abc字母对应的数字)
小写a的ASCII码是97,那么bc是98 99,那么abc的hashcode计算就是 ,第一次循环h=97,第二次循环h=97*31+98,第三次循环h=31*(97*31+98)+99=96354
其它的方法下次介绍