jdk8字符串常量池在哪里 Java运行时常量池是什么?
Java运行时常量池是什么?
在回答这个问题之前,让我们先谈谈什么是常量。
用final修改的成员变量称为常量。一旦指定了常量的值,就不能更改
!final修改了三种类型的变量:静态变量、实例变量和局部变量,它们代表三种类型的常量。
Java中的常量池可以分为两种方式:静态常量池和运行时常量池。
1)所谓的静态常量池是*中的常量池。类文件。类文件中的常量池不仅包含字符串(number)的文字量,还包含类和方法的信息,占用了类文件的大部分空间。
2)运行时常量池是JVM虚拟机将类文件中的常量池加载到内存中,并在完成类加载操作后将其保存在方法区域中。我们经常在方法区域中将常量池称为运行时常量池。
只要我们在Java中谈论池的概念,在大多数情况下,它是为了减少频繁的创建和破坏。使用一种方法来管理这个过程。让我们简单地谈谈这个问题,以供具体参考。深入了解Java虚拟机书籍,了解更多。
小木的答案。根据自己的理解和别人的理解站在巨人的肩膀上,走得更远更快。
字符串常量池到底存放的是字符串引用还是字符串对象?
如果你看字符串的源代码,你可以看到它是一个对象
!s=“123”
写这句话时,您将首先找出常量池中是否有字符串对象123。如果没有,他会开始提取,1,2,3
然后把它拼接成一个对象,即“123”
如果有另一个对象需要这个对象,例如S1=“123”
此时,你操作S1,最好去常量池看看是否有这个对象。如果有,您可以直接获取地址,因为常量池数据是共享的
如果此时S1=“1234”则常量池不存在,您将再次提取1、2、3、4,然后将其重新组合为新对象并放入常量池中
字符常量池是什么意思?
可以理解为专门为内存中的字符串类型变量打开的区域。例如,string a=“ABC”定义这样一个变量时,Java会先到常量池中查找是否有像“ABC”这样的字符串,如果有,直接把内存地址给a,否则会生成一个字符串“ABC”。当下一个字符串B=“ABC”时,发现常量池已经有了“ABC”。这时JVM不会再生成“ABC”,而是直接引用“ABC”来引用B,所以这时你会发现a==B
string STR=“nihao”程序开始执行这个代码,它肯定会创建一个对象,只是对象创建后,它是一个常量,不能更改,对象被放在字符串池中,也就是你所说的常量池
如果我以后再写代码:string other=“nihao”
STR和other的地址是一样的,因为STR和other在字符串池中的声明方式是一样的,当创建STR的对象时,如果字符串池中没有“nihao”常量,创建一个。在创建另一个对象时,如果您发现字符串池中有“nihao”常量,请直接使用它
string B1=new string(“nihao”)
但是如果我们使用上述方法直接创建一个新字符串(),则A1和B1引用的对象不在字符串池中,而是在堆中。但是,new string()的参数“nihao”也是一个字符串。这根绳子是从哪里来的?如果我们拆分代码,我们可以看到stringa1=newstring(para)]的代码实际上创建了两个对象,一个是存储在堆中的string对象,另一个是存储在字符串池中的stringconstant对象
jdk8字符串常量池在哪里 字符串常量池在堆中还是方法区 jvm运行时常量池
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。