java.lang.String源码分析

《java.lang.String源码分析》

博主还是言简意赅的风格,先给大家看一下java.lang.String的初始化静态绑定的属性以及构造method。

首先看到的是一个final修饰的char数组,然后一个int类型的hash值,还有一个static final修饰的数组实例化的是以下的类

《java.lang.String源码分析》

 

 

 可以看到该类实现了Comparable<Object>,顾名思义也就是比较的意思。

 接着介绍几个String的方法,大家也比较熟悉的。

《java.lang.String源码分析》

 

 《java.lang.String源码分析》

首先我在String源码里debug去实例化一个String,通过Debug可以看到String的数据结构是一个char数组,这对我们理解更多的String方法有很大的帮助。

《java.lang.String源码分析》

String这个处理很暴力,你要调length或者isEmpty实际上就是去底层看char数组的长度,为0当然就是空咯。

《java.lang.String源码分析》

这个方法是最好玩的,也是问的最多的,==和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方法也是很多数据结构处理数据的一个手段。

《java.lang.String源码分析》

这就是String的hashcode源码,其实就是循环底层char数组长度去计算h的值,然后把引用给hash。算法采用的是31奇数的权重算法,大的if条件是String有值,且hash的值为0;

打个比方“abc”这个String类型的数据,它的计算hash值的方式就是根据ASCII码计算上面的公式(char(a,b,c)分别对应ASCII计算机国际码对于abc字母对应的数字)

《java.lang.String源码分析》

小写a的ASCII码是97,那么bc是98 99,那么abc的hashcode计算就是  ,第一次循环h=97,第二次循环h=97*31+98,第三次循环h=31*(97*31+98)+99=96354

 

其它的方法下次介绍

 

    原文作者:Spring5945
    原文地址: http://www.cnblogs.com/zhengyu940115/p/6208320.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞