StringBuilder多次生成hashcode随机不同

2024-02-11 20:24:01 浏览数 (2)

前言

今天这一节的主题是讲解如何解决字符串拼接过程中的问题。我在使用StringBuilder的hashcode方法时遇到了一些问题,当我将多个字符串拼接后,通过Hashcode方法计算出的hashcode值却与我预期的不同。于是我开始一步步排查问题,逐渐了解了字符串拼接过程中的一些机制和细节,并最终解决了这个问题。在这个过程中,我也学习了一些新的知识,对字符串拼接的方法和细节有了更深入的理解。

问题点

这是生成的部分代码。这段代码的作用就主要是用属性来进行一个拼机,然后生成一个哈西扣的。

代码语言:javascript复制
    public int getId() {
        StringBuilder sb = new StringBuilder();
        sb.append(name);
        sb.append(type);
        sb.append(absolutePath);
        sb.append(hostname);
        log.info("======string:{}=====hashcode:{}=====", sb.toString(), sb.hashCode());
        return sb.hashCode();
    }

这是打印的日志。很明显可以看出每次生成的结果是不一样的。当我们调了toString方法之后,结果就一样了。

代码语言:javascript复制
======string:dev-web-011nulldev-web-01=====hashcode:405184175=====list
======string:dev-web-011nulldev-web-01=====hashcode:1398059196=====

// toStrin之后

======string:dev-web-011nulldev-web-01=====hashcode:-137608968=====list
======string:dev-web-011nulldev-web-01=====hashcode:-137608968=====

当我修改了部分代码。由原本的直接调用hashcode方法变成了先toString方法之后,再进行一个hashcode调用。然后问题就解决了。

代码语言:javascript复制
        log.info("======string:{}=====hashcode:{}=====", sb.toString(), sb.toString().hashCode());
        return sb.toString().hashCode();

分析问题

接下来就是分析问题的存在原因。

StringBuilder的hashcode方法

因为对象的hashcode。它还是会有一定的区别的,它调用的是对象的一个生成方法。

java.lang.Object#hashCode

String的hashcode方法

但是到了String这里他就不一样了,他是手动写的一个hashcode方法。本身它就是一个特殊的函数。所以有些时候需要做一些的的哈西匹配的话,string是最好的选择。因为他对这个hash code代码进行了一个重写。

java.lang.String#hashCode

总结

这一章节主要是在讲,在编码当中碰到的一些问题的点,做一个记录。String和StringBuilder虽然他们都是操控字符串,但本质上还是会有一定的区别的String它是一个特殊的字符类,StringBuilder它是一种常用的字符工具类。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

0 人点赞