目录

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关键字的作用有如下几种

final修饰类时,表明这个类不能被继承
    final修饰方法,表明方法不能被重写
    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做同步操作

String中的hashcode缓存以及HashMap中String作key的好处相关推荐

  1. Java中hashCode()方法以及HashMap()中hash()方法

    Java的Object类中有一个hashCode()方法: public final native Class<?> getClass(); public native int hashC ...

  2. java中 hashmap中小数,java基础知识--HashMap中对 h(length-1)的理解

    1.HashMap 数组下标计算方式: (h 是k的hashcode值:length是数组长度,HashMap数组默认长度是16) 2.&是什么意思? &在 java 中做与运算,&a ...

  3. java中的holder类_java – HashMap中Holder类的用途是什么?

    这与Java 7u6的改进有关,并已在Java 8中删除. 相关文件: The alternative hash function improves the performance of these ...

  4. HashMap 中 hash 冲突的解决方法及原理分析

    我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...

  5. Mybatis 中的一级缓存与二级缓存

    一,Mybatis中为什么要有缓存   缓存的意义是将用户经常查询的数据放入缓存(内存)中去,用户去查询数据的时候就不需要从磁盘(关系型数据库)中查询,直接从缓存中查询,从而提高了查询效率,解决了高并 ...

  6. ASP.NET 2.0 中改进的缓存功能

    摘要:本文中,Stephen Walther 将重点介绍 ASP.NET 2.0 中新增的缓存功能,以及如何使用这些新功能改进 ASP.NET 应用程序的性能和可扩展性.(本文包含一些指向英文站点的链 ...

  7. HashMap 中那些精妙绝伦的设计

     点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 一.HashMap构造器 HashMap总共给我们提供了三个构造器来创建HashMap ...

  8. Java高级之HashMap中的keySet()方法

    keySet()方法的源码为: public Set<K> keySet() {Set<K> ks = keySet;if (ks == null) {ks = new Key ...

  9. Ocelot中文文档-缓存

    Ocelot中文文档-缓存 原文:Ocelot中文文档-缓存 目前Ocelot使用CacheManager项目提供了一些非常基本的缓存.这是一个了不起的项目,它解决了很多缓存问题. 我会推荐这个软件包 ...

最新文章

  1. 2022年软件测试工具大全(自动化、接口、性能、安全、测试管理)
  2. python多进程优化_如何利用多进程优化Python视频应用
  3. GlassFish 4升级的构建,Gradle和嵌入式应用服务器
  4. 公众号jdk 获取手机号_如何获取公众号推文封面图
  5. sstableloader工具使用及原理解析
  6. Java Apple_GitHub - izhaorui/AppleLogin-java: 苹果登录 Sign in with Apple 服务端校验
  7. .net开发工程师是做什么的_.NET能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用...
  8. linux 下pycharm 无法输入中文
  9. Mac设置VMARE FUSION虚拟机网卡
  10. JavaEE中级.20190615.易买网项目(一).隐藏域.
  11. 生意参谋高阶指数换算api、指数换算api、生意参谋交易指数换算api、生意参谋数据查询api
  12. 生成专题2 | 图像生成评价指标FID
  13. 一些.NET的开源项目资料
  14. linux系统日志排故方案,Linux系统故障排查思路与常见案例
  15. npm 脚本跨平台设置环境变量命令 cross-env
  16. wish新店快速出单的方法
  17. 重师者王,重友者霸,重己者亡
  18. 三子棋游戏实现(c语言)
  19. 视频教程-三十八课时零基础matlab精通优化算法-Matlab
  20. 【建议收藏】黑客基础必学命令行!

热门文章

  1. Spring Cloud Alibaba 系统保护:微服务架构雪崩效应与服务限流
  2. leetcode 74 java_【LeetCode】74. Search a 2D Matrix
  3. 怎么在手机上下载python模块_python下载模块然后怎么安装
  4. 清华学长请授接口自动化测试进阶攻略
  5. PHP如何设置圆,php绘制圆形的方法
  6. suse linux 备份,suse linux利用scp实现自动远程备份
  7. android5.1和ios差距,Android 5.1和IOS运行流畅度比较Android获胜!
  8. PHP静态方法和属性
  9. 移动**21*设置无法接通_七大新增时刻传奇!外服率先体验而国服暂时无法推出的粉传盘点+21赛季移动端首批精选上架!...
  10. 如何取消linux响铃_linux初学者入门:VIM编辑简易指南(常用操作)