千家信息网

JAVA中字符串常量池和缓冲池的作用是什么

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇"JAVA中字符串常量池和缓冲池的作用是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来
千家信息网最后更新 2025年01月20日JAVA中字符串常量池和缓冲池的作用是什么

这篇"JAVA中字符串常量池和缓冲池的作用是什么"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"JAVA中字符串常量池和缓冲池的作用是什么"文章吧。


1 常量池

常量池分为两个类型,一是.class文件中静态的常量池,二是.class文件中的静态常量池被加载到JVM中而形成的运行时常量池

1.1 静态常量池

.class文件中的常量池可以看作一个数组,数组中存储了一些常量,当需要在字节码指令中用到这个常量的时候,就通过数组的索引来访问它。

看下面的代码:

 String m = "hellohellohellohellohello"; String n = "hellohellohellohellohello";

它在字节码中将会是这种形式:

 // 常量池: #1 hellohellohellohellohello #2 ... ... ----------------------------  String m = #1; String n = #1;

当然,这只是一个简化的版本,实际上要更加复杂 (实际的版本可以看文章末尾参考资料部分里面贴出的那个回答,目前可以先只考虑简化的版本)

注意,在这个里面存储的字符串常量只是一个简单的UTF8编码的字节序列,而不是Java的字符串对象,它就和你在一个txt文本中存储的字符串一样,我们用UTF8格式来打开一个.class文件,可以看到hellohellohellohellohello是可以被解析的:

1.2 运行时常量池

理解了静态的常量池之后,运行时常量池就很容易想明白了。简单来说,运行时常量池就是.class文件中的静态常量池在JVM中的运行时表示,每一个.class文件的静态常量池都会生成一个对应的运行时常量池。等到JVM在解释String m = #1这条指令时,它可以去这个类的运行时常量池中查找#1的定义。

2 字符串池

字符串池是Java为了重用String对象而设置的一个缓存池,Java1.7之前设置在方法区上,保存的是String对象;Java1.7之后设置在堆上,保存的是String对象的引用,String对象本身存在于堆上的其他位置。下文中以Java1.7之后的情况为标准。

继续上面的例子。当JVM在解释String m = #1时,它已经从运行时常量池拿到了相应的UTF8序列,接下来,它会在字符串池中寻找和这个UTF8序列对应的String对象,并把这个对象的引用赋值给m。你可能会好奇这个String被创建的时机,根据R大的这篇文章,在这条语句所在的类被加载时,如果字符串池中已经存在对应的对象了,那么就什么都不做,如果不存在,就会创建一个对应的String对象,并把其引用放入池中。

除了字符串池,IntegerLong等Wrapper类型也有自己的缓存池,比如Integer会缓存从-128~127的Integer对象,当使用字面量赋值或者Integer.valueOf()时,如果池中存在相应的对象,就会返回池中的对象,只有当池中没有时才会在堆上创建新对象。

不过,和字符串池不同的时,这些Wrapper池不会像字符串池一样可以增长,也就是池中的对象数目是固定的,Integer池中只会有-128~127。

基本类型对应的缓冲池如下:

boolean values true and false all byte values short values between -128 and 127 int values between -128 and 127 char in the range \u0000 to \u007F

在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax= 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。

以上就是关于"JAVA中字符串常量池和缓冲池的作用是什么"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

常量 对象 字符 字符串 缓冲 运行 文件 静态 内容 时候 作用 上界 字节 序列 数组 文章 版本 篇文章 类型 缓存 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏服务器机房厂家供应虚拟主机 便于筛选导出的数据库软件 电商软件开发公司排名 r语言怎么直接输入数据库 网络安全观 种意识 香港大学生网络安全 麒麟网络安全宣传周 文山软件开发专业培训 网络安全宣传员和保护神 云服务器管理好麻烦怎么办 数据库ssb 场景 天使之战今天服务器有问题 如何保障网络数据库的安全 用数据库怎样编制工资单 微信公众号 与数据库 时代网络技术分类产品介绍 显示无法与服务器建立安全链接 克隆侠服务器是什么意思 优秀毕业论文 软件开发 网络安全任务怎么做 电商软件开发怎么做好产品详情页 金山软件开发武汉 公安机关信息网络安全告知承诺书 like数据库使用方法 西安大地测绘软件开发 如何保障网络数据库的安全 李永乐网络安全 服务器管理口是做什么用 加强网络安全工作小结 天涯明月刀各服务器
0