String数据的存储:
一般有new String的话,都会在堆中开辟一个空间存储常量池的地址;如果是直接String str = “str”;这样的方式的话就直接str指向常量池的字符串常量地址。
看到源码,String的数据存储是存储在一个final的char数组。
创建字符串的对象方式很多,其中有两种常用的:
这里的是当以s1的方式来创建,那么就会先查看常量池是否存在该字符串,如果存在,那么就直接地址指向该常量池的字符串地址;如果没有,那么直接在常量池开辟空间,创建该字符串常量,然后地址被s1指向。
按照s2的方式,如果常量池有该字符串常量,那么,在堆里开辟空间value,地址为0x11,value存储的内容为常量池的地址0x99,s2指向value的地址;如果常量池没有,那么也要在常量池先造出"haha"这个字符串常量,然后再让堆的value保存常量池的字符串地址,s2指向value的地址。
- 方式3
String s = "hehe" + "haha"
这个会在常量池创建一个字符串常量hehehaha
然后让s指向该常量地址
- 方式4
这里的a直接指向常量池的常量地址。有new的方式比如c则是在堆里再指向池里的对象。
可以追一下源码:
看到这里是new一个,那么确实是要在堆中开辟一个空间来存储常量池的地址了,实锤了!