Java字符串常量池,字符串常量池和运行时常量池

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: