当前位置:网站首页>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做同步操作。
边栏推荐
- Finished product upgrade program
- PG网络传输安全SSL介绍及使用示例
- 运维就业现状怎么样?技能要求高吗?
- T+Cloud: A "Smart Company" for Building New Business Social Networks and Marketing Relationships
- 成品升级程序
- 正畸MIA微种植体支抗技术中国10周年交流会在沈举办
- 电脑一键重装系统内存完整性无法打开怎么办
- 百度智能云重庆工业互联网平台正式亮相,深耕重庆,辐射西南
- [Sql brush topic] Query information data--Day1
- Switch node version and switch npm source tool
猜你喜欢
随机推荐
查询APP Store已发布过的版本记录
七夕福利!中奖名单:书籍免费送!
六月 致 -.-- -..- -
力扣题(5)—— 最长回文子串
【着色器实现Glitch单项故障闪烁效果(与Television效果不同)_Shader效果第十四篇】
密码学系列之:PEM和PKCS7,PKCS8,PKCS12
译文推荐|Apache Pulsar 隔离系列(四):单集群隔离策略
visual studio 与 visual studio code
电脑一键重装系统内存完整性无法打开怎么办
ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators
Query the published version records of the APP Store
存储资源盘活系统助力新基建
奥拉时钟芯片生成配置文件脚本
QT 小知识随记
百度智能云重庆工业互联网平台正式亮相,深耕重庆,辐射西南
《支付宝体验设计精髓》一书,跟测试相关性知识记录
如何推动乡村振兴的落地
完善的交叉编译环境记录 peta 生成的shell 脚本
JS手写JSON.stringify() (面试)
SAP UI5 确保控件 id 全局唯一的实现方法