前言
今天这一节的主题是讲解如何解决字符串拼接过程中的问题。我在使用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腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!