小白日更第五十四天->关于字符串的null和“ “问题

小伙伴们先看一段代码:

package com.qcby.algorithm;
public class Test01 {
    public static void main(String[] args) {
    String s="";
    String ss=null;
    System.out.println(s.hashCode());
    System.out.println(ss.hashCode());
    }
}

这段代码执行的结果是什么呢?
在这里插入图片描述
报错了嘿嘿。空指针异常。那为什么呢?我去看了看书,书上关于null和" "的解释:
在这里插入图片描述

emmm这个答案不是很满意~,但是这里面有两句话比较重要,就是我用箭头指出来的。我理解这两句话的意思是,空串也就是" “在内存中是有自己的空间的,jvm是给” "开辟了内存空间了的,只不过里面什么内容也么有。而null是jvm根本就没有给它分配内存空间。我了解到的是,当我们调用一个对象的hashcode()方法,底层是根据对象的地址,然后根据一下hash算法,来计算出这个对象的hashcode,那我分析,之所以报了这个空指针异常还是因为没有内存地址,所以在计算hash值的时候无法找到地址,就报了空指针异常。
文章写到这里,我感觉我也差不多明白了,但是我还想更深入了解一下,然后我们一起看一下String的hashcode()方法:
在这里插入图片描述
关于这个源码我就比较好奇了。
先看一下这个hash和value:
在这里插入图片描述
hash:是一个 private 修饰的 int 变量,用来存放 String 对象的 hashCode。
value:是一个 private final 修饰的 char 数组,String 类是通过该数组来存在字符串的。
小伙伴们是否有一个疑问。为什么 h == 0 时进行 hashCode()计算呢?
首先源码中h 是一个 int 类型的值,默认值为 0,这个 0 可以表示可能未执行过 hash 计算,但不能表示一定未执行过 hash 计算,原因是我们现在还不确定 hash 计算后是否会产生 0 值;
那执行 hash 计算后,会不会产生值为 0 的 hash呢?根据 源码中hash 的计算逻辑,如果 val[0] = 0 时,那根据公式 h = 31 * h + val[i]; 进行计算, h 的值等于 0。
那val[0] = 0 怎么解释呢?查看 ASCII 表发现, null 的 ASCII 值为 0 。显然val[0]怎么可能存null呢?所以hash计算后不会产生0值,如果h是0了那就说明还没有进行hash计算。那这个h==0的操作就可以作为是否进行过hash计算的判断条件
再看另外一个判断条件,数组长度大于0。也就是说,如果字符串的长度为 0 ,不进行 hash 计算。

至此其实分析的就差不多了。在查这个问题的时候,看到别人写了这么一句话。
释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
因为我也学习过jvm,其中一个知识点是判断一个对象是否存活,有两种方法:
引用计数放
可达性分析法
这里我就不做拓展了,但是仔细想想上面的话还是有道理的,确实是这样,感兴趣的小伙伴可以自己学习一下jvm,对我们更好的理解掌握java还是很有好处的~在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值