当前位置:网站首页>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做同步操作。
边栏推荐
猜你喜欢
重构指标之如何监控代码圈复杂度
华为企业组网实例:VRRP+MSTP典型组网配置
Pedestrian fall detection experiment based on YOLOV5
《支付宝体验设计精髓》一书,跟测试相关性知识记录
Seata source code analysis: various message processing processes of seata server
量化交易机器人系统开发
机器学习之支持向量机实例,线性核函数 多项式核函数 RBF高斯核函数 sigmoid核函数
Query the published version records of the APP Store
Defaced Fingerprint Recovery and Identification
我的四周年创作纪念日
随机推荐
SIGIR 2022 | 邻域建模Graph-Masked Transformer,显著提高CTR预测性能
如何给MySQL添加自定义语法 ?
MYSQL获取数据库的表名和表注释
Storage resource activation system to help new infrastructure
电脑一键重装系统后连不上远程了?教你设置的方法
How to add custom syntax to MySQL?
Defaced Fingerprint Recovery and Identification
internship:改了需求
MySQL远程备份策略举例
【ASP.NET Core】 中间件
迪赛智慧数——其他图表(主题河流图):近年居民消费、储蓄、投资意愿
小软件大作用 | 如何省时省力进行Gerber图层快速对比?
JS手写JSON.stringify() (面试)
June To -.-- -..- -
lds链接的 顺序问题
百度智能云重庆工业互联网平台正式亮相,深耕重庆,辐射西南
seata源码解析:seata server各种消息处理流程
The Development and Current Situation of Object Detection
JS: 数组和树的相互转换
工业相机CCD与CMOS