Java字符串常量池,字符串常量池和运行时常量池
本文给大家带来一些java的知识,包括对字符串常量池和缓冲池的理解和作用。弦池和恒池是完全不同的,但是很多地方喜欢混淆,新手容易误解。我想在这里讨论一下,希望对你有所帮助。
如何解决写爬虫IP受阻的问题?立即使用。
串池也可以叫字符串常量池。我觉得这个名字是误会的根源。有的人说的时候省略了字符串这个词,只剩下常量池.所以为了避免误解,我建议在引用string对象的缓存池时,我们直接称之为字符串池。
1 常量池
常量池分为两种,一种是静态的常量池in。类文件,另一个是运行时常量池由静态常量池中形成。加载到JVM中的类文件。
:
1.1 静态常量池
.类文件中的常量池可以看作一个数组,数组中存储了一些常量。当需要在字节码指令中使用这个常量时,可以通过数组的索引来访问它。
请看下面的代码:
string m= hellohellohellohelohello ;
string n= hellohellohellohelohello ;在字节码中,它看起来像这样:
//常量池:
#1你好你好你好你好
#2 .
.
-
字符串m=# 1;
字符串n=# 1;当然,这只是简化版,实际上更复杂(实际版本请参考文末参考资料部分贴出的回答。暂时只能考虑简化版)
注意,这里存储的字符串常量只是一个简单的UTF8编码的字节序列,而不是一个Java字符串对象。它就像你存储在txt文本中的字符串。我们用UTF8格式打开一个. class文件,可以看到hellohellohellohellohello可以解析:
1.2 运行时常量池
了解了静态常量池之后,运行时常量池就很容易搞清楚了。简单地说,运行时常量池是。JVM中的类文件和。类文件会生成一个相应的运行时常量池。当JVM解释指令字符串m=#1时,它可以在这个类的运行时常量池中查找#1的定义。
2 字符串池
字符串池是Java为重用字符串对象而设置的缓存池。在Java1.7之前,在方法区上设置,保存String对象;Java1.7以后在堆上设置,保存String对象的引用。字符串对象本身存在于堆的其他地方。以下是基于Java1.7之后的情况。
继续上面的例子。当JVM解释字符串m=#1时,它已经从运行时常量池中获得了相应的UTF8序列。接下来,它将在字符串池中查找对应于这个UTF8序列的字符串对象,并将这个对象的引用赋给m,您可能对这个字符串的创建时间感到好奇。根据R的这篇文章,当这个语句所在的类被加载时,如果对应的对象已经存在于字符串池中,那么什么都不会做。如果它不存在,将创建一个相应的string对象,并将其引用放入池中。
除了字符串池,整型和长型等包装器类型也有自己的缓存池。例如,整数缓存从-128到127的整数对象。当使用literal赋值或Integer.valueOf()时,如果池中有对应的对象,它将返回池中的对象,只有当池中没有对象时,才会在堆上创建新的对象。
但是,与字符串池不同,这些包装器池不能像字符串池一样增长,即池中对象的数量是固定的,整数池中只会有-128~127。
对应于这些类型的基本缓冲池如下:
布尔值true和false
所有字节值
介于-128和127之间的短值
介于-128和127之间的int值
在jdk 1.8的所有数字缓冲池中的\ u 0000到\ u007f范围内,Integer的缓冲池IntegerCache是非常特殊的。这个缓冲池的下界是-128,缺省的上界是127,但是这个上界是可调的。启动jvm时,通过-XX:AutoBoxCacheMax=指定这个缓冲池的大小。该选项将在JVM初始化时设置一个名为java.lang.IntegerCache.high的系统属性,然后在IntegerCache初始化时读取该系统属性确定上限。
推荐学习:《java教程》以上是深入分析JAVA中字符串常量池和缓冲池的理解和作用的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。