弄懂String常量池,String常见面试题

本文详细介绍了Java中String的常量池,包括其在不同JDK版本的变化,以及字符串创建的多种方式。通过分析各种创建场景,探讨了String对象在堆和常量池的存储情况。同时,对常见的面试题进行了解答,涉及字符串相加、new String()以及intern()方法的行为。最后,通过实战案例解释了String对象引用相等性的判断条件。
摘要由CSDN通过智能技术生成

本次代码使用 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

public static void main(String[] args){

        String s1 = new String("123");

        String s2 = "123";

        System.out.println(s1 == s2);

}


基本上大家都能知道是false,但是再这么深究一次,问 String s1 = new String("123") 创建了几个对象,String s2 = "123" 创建  了几个对象,那如果题目稍微改变一下成下面这样,那输出的又是什么?

[Java] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

8

9

String s1 = new String("123").intern();

String s2 = "123";

System.out.println(s1 == s2);  // true

 

// 如果这样再改一下

String s1 = new String("123");

s1.intern();

String s2 = "123";

System.out.println(s1 == s2);  // false


如果对输出结果不是很明白的,本文都会一一解答并且进行拓展。
创建字符串分析:
首先要分析String,一定要知道String几种常见的创建字符串的方式,以及每一种不同的方式常量池和堆分别是什么储存情况。
1.直接写双引号常量来创建 
判断这个常量是否存在于常量池,
如果存在࿰

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值