zoukankan      html  css  js  c++  java
  • java.lang.String源码分析

    博主还是言简意赅的风格,先给大家看一下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

    其它的方法下次介绍

  • 相关阅读:
    php 微信调用扫一扫
    JavaSE常用API
    Java中的异常处理
    Java实现多态的机制是什么?
    JavaSE(下)
    JavaSE语法(中)
    JavaSE语法
    Java面向对象
    Java零基础入门之常用工具
    Java抽象类、接口、内部类
  • 原文地址:https://www.cnblogs.com/zhengyu940115/p/6208320.html
Copyright © 2011-2022 走看看