字符串常量池在堆中还是方法区 字符串常量池到底存放的是字符串引用还是字符串对象?
字符串常量池到底存放的是字符串引用还是字符串对象?
如果你看字符串的源代码,你会发现它是一个对象
!s=“123”
写这句话时,您将首先找出常量池中是否有字符串对象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”也是一个字符串。这根绳子是从哪里来的?如果我们拆分代码,我们可以看到字符串A1=new string(para)]的代码实际上创建了两个对象,一个是字符串对象,存储在堆中,另一个是字符串常量对象,存储在字符串池中
Java常量池不在堆或堆栈中,这是独立的内存空间管理。
1. 堆栈:它存储基本类型变量数据和对象引用,但对象本身不存储在堆栈中,而是存储在堆(新对象)或常量池(字符串常量对象存储在常量池中)。堆:存储所有新对象。
3. 常量池:存储字符串常量和基本类型常量(publicstaticfinal)。
对于字符串:其对象的引用存储在堆栈中。如果它们是在编译时创建的(直接用双引号定义),则它们存储在常量池中。如果只能在运行时(New)确定它们,则将它们存储在堆中。对于相等的字符串,常量池中总是只有一个副本,堆中总是有多个副本。
字符串常量池在堆中还是方法区 java字符串常量池 字符串常量池和运行时常量池的联系
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。