字符串常量池在堆中还是方法区 字符串常量池到底存放的是字符串引用还是字符串对象?
字符串常量池到底存放的是字符串引用还是字符串对象?
你看看String源码就明白了,是对象!
s="123"
写这句话的时候,会在常量池先找有没有123这个字符串对象如果没有,他就开始抽取,1,2,3
然后拼接成一个对象即:"123"
假如后面又来一个也需要这个对象,比如说s1="123"
这个时候在操作s1的时候还是先去常量池找有没有这个对象,如果有,直接把地址拿过来,因为常量池数据为共享的,
假如这个时候s1="1234"那么常量池是没有的,就会重新抽取,1,2,3,4,然后重新拼接成一个新的对象放在常量池!
String源码里面有一个私有变量一个字符类型的数组,他就是用来抽取这些单个字符,然后拼接成
一个字符串对象!
字符串常量池是在方法区中还是在独立的区域中?
String str = "nihao" 程序开始执行这句代码,肯定是要创建一个对象的, 只是这个对象创建后就是一个常量,不可以更改, 并且这个对象是放在串池里面的,也就是你说的那个常量池
如果我后面在写一句代码: String other = "nihao"
str和other这2个引用的地址就是一样的, 因为str和other的声明方式是一样的, 都是在串池, str的对象创建时,串池中没有"nihao"这个常量,就创建一个. other对象创建时,发现串池中已经有了"nihao"这个常量, 就直接拿过来用就是了
String a1 = new String("nihao")
String b1 = new String("nihao")
但是如果我们通过上面的方式直接new String() 那个a1和b1这2个引用的对象就不是在串池中了,而是在堆中, 但是new String() 的参数"nihao"也是一个字符串啊, 这个字符串从哪里来呢?如果我们吧代码拆分一下就明白了:
String para = "nihao"
String a1 = new String(para)
就会发现String a1 = new String("nihao") 这一句代码实际上创建了2个对象, 一个是String对象,存放在堆中, 一个是字符串常量对象,存放在串池中
字符常量池是什么意思?
可以理解为内存里面专门为string类型变量开辟的一片区域譬如String a = "abc" 当你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串当下一个String b = "abc"的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b
Java中的字符串常量池与Java中的堆和栈的区别?
java常量池不在堆中也不在栈中,是独立的内存空间管理。
1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
2. 堆:存放所有new出来的对象。
3. 常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
字符串常量池在堆中还是方法区 java字符串常量池 字符串常量池和运行时常量池的联系
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。