java.lang 源码剖析_java.lang.String源码分析

6f6d34c5c16af7880ed4a10a955cd5c0.png

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

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

1365584f4cdd33eb80c05a466af77e79.png

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

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

9b933ebea961077cbaa2790b0368d6bf.png

cc01be1843bb9eda970d6f275c24bbed.png

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

1f83bb094dc203266785c5a750cc17a3.png

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

70d8ee72555ba978c81a5abdc2f6a40f.png

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

fce360c07514c6d058bff69a7b1a26de.png

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

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

8b7d7fd765b84a6c6ae8cfa88e84846f.png

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

其它的方法下次介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值