当前位置:网站首页>String中的hashcode缓存以及HashMap中String作key的好处
String中的hashcode缓存以及HashMap中String作key的好处
2022-08-04 19:36:00 【小刘学安卓】
目录
hashcode方法源码
不可变性
缓存HashCode
线程安全
hashcode方法源码
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}在String类中有个成员变量hash表示该串的哈希值,在第一次调用hashCode方法时,字符串的哈希值被计算并且赋值给hash字段,之后再调用hashCode方法便可以直接取hash字段返回。
不可变性
String类的值是保存在value数组中的,并且是被private final修饰的. private修饰,表明外部的类是访问不到value的,同时子类也访问不到,当然String类不可能有子类,因为类被final修饰了.
final修饰,表明value的引用是不会被改变的,而value只会在String的构造函数中被初始化,而且并没有其他方法可以修改value数组中的值,保证了value的引用和值都不会发生变化(重要!!)
final关键字的作用有如下几种
1、final修饰类时,表明这个类不能被继承
2、final修饰方法,表明方法不能被重写
3、final修饰变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能改变;
如果是对象类型的变量,只能保证它的引用不变,但对象的内容是可以改变的
在Java中数组也是对象,数组即使被final修饰,内容还是可以改变的
所以我们说String类是不可变的。
而很多方法,如substring并不是在原来的String类上进行操作,而是生成了新的String类
缓存HashCode
String类在被创建的时候,hashcode就被缓存到hash成员变量中,因为String类是不可变的,所以hashcode是不会改变的。这样每次想使用hashcode的时候直接取就行了,而不用重新计算,提高了效率。
可以用作HashMap的key
由于String类不可变的特性,所以经常被用作HashMap的key,如果String类是可变的,内容改变,hashCode也会改变,当根据这个key从HashMap中取的时候有可能取不到value,或者取到错的value。
线程安全
不可变对象天生就是线程安全的,这样可以避免在多线程环境下对String做同步操作。
边栏推荐
猜你喜欢

《支付宝体验设计精髓》一书,跟测试相关性知识记录

一些性能测试的要点

How to monitor code cyclomatic complexity by refactoring indicators

华为WLAN技术:AP上线及相关模板的配置实验

02 ts 变量定义,类型

Redis数据库—定义、特点、安装、如何启动与停止

数据库治理的探索与实践

Defaced Fingerprint Recovery and Identification

ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators

Openharmony first experience (1)
随机推荐
[Sql刷题篇] 查询信息数据--Day1
将网页变成字符串,并保存起来
Kubernetes之list-watch机制
直播回顾|7 月 Pulsar 中文开发者与用户组会议
The Development and Current Situation of Object Detection
如何给MySQL添加自定义语法 ?
【Attention演变史】翻译模型seq2seq (第二弹)
备忘录模式
致-.-- -..- -
《支付宝体验设计精髓》一书,跟测试相关性知识记录
nr部分计算
正畸MIA微种植体支抗技术中国10周年交流会在沈举办
图片延迟加载、预加载
【Attention 演变史】RNN的产生、架构、推广、问题(第一弹)
In July 2022, domestic database memorabilia
Yuanguo chain game system development
Embrace the Cmake child is simple and practical, but inflexible
蚂蚁集团时序数据库CeresDB正式开源
02 ts 变量定义,类型
什么是内部客户服务?