本次代码使用 jdk 1.8版本,并且以下代码示例除了第一个写了main()方法,并且所有的示例分别独立运行 ,其余为了简洁做了缺省main()。在创建字符串分析的同时,都默认省略了栈中的句柄指向分析。进入正题之时,先科普几个知识点
String源码里面标注为final修饰的类,是一个不可改变的对象,那平时用到字符串A+字符串B怎么改变了呢,其实这里有涉及到String的常量池,首先常量池存放在方法区。
在jdk1.6时,方法区是存放在永久代(java堆的一部分,例如新生代,老年代)而在jdk1.7以后将字符串常量池移动到了的堆内存中
在jdk1.8时,HotspotVM正式宣告了移除永久代,取而代之的是元数据区,元数据区存放在内存里面(存放一些加载class的信息),但是常量池还是和jdk1.7存放位置一样还是存放在堆中。
先看一波常见面试题:
首先看一道常见的面试题,问输出的是什么?
[Java] 纯文本查看 复制代码
1 2 3 4 5 |
|
基本上大家都能知道是false,但是再这么深究一次,问 String s1 = new String("123") 创建了几个对象,String s2 = "123" 创建 了几个对象,那如果题目稍微改变一下成下面这样,那输出的又是什么?
[Java] 纯文本查看 复制代码
1 2 3 4 5 6 7 8 9 |
|
如果对输出结果不是很明白的,本文都会一一解答并且进行拓展。
创建字符串分析:
首先要分析String,一定要知道String几种常见的创建字符串的方式,以及每一种不同的方式常量池和堆分别是什么储存情况。
1.直接写双引号常量来创建
判断这个常量是否存在于常量池,
如果存在