018Java面试002String常量池

1 对象生成个数

测试代码如下:

1 public static void main(String[] args) throws Exception {
2      String s1 = new String("abc");
3      String s2 = "abc";
4      String s3 = new String("abc");
5      System.out.println(s1 == s2);// false
6      System.out.println(s1 == s3);// false
7      System.out.println(s2 == s3);// false
8 }

上述代码执行后,在常量池中生成了一个对象,在堆中生成了两个对象(指向常量池中的对象)。

s1先在堆中创建了一个对象,然后在常量池中寻找字符串,没有找到则在常量池中创建一个对象,堆中保存常量池中对象的引用。

s2先在常量池中寻找字符串,找到了则返回常量池中对象的引用。

s3先在堆中创建了一个对象,然后在常量池中寻找字符串,找到了则返回常量池中对象的引用,堆中保存常量池中对象的引用。

2 对象创建机制

测试代码如下:

1 public static void main(String[] args) throws Exception {
2      String s1 = "java";
3      String s2 = "ja";
4      String s3 = "va";
5      System.out.println(s1 == "java");// true
6      System.out.println(s1 == (s2 + s3));// false
7      System.out.println(s1 == "ja" + s3);// false
8      System.out.println((s2 + s3) == (s2 + s3));// false
9 }

上述代码执行后,在常量池中生成了三个对象,在堆中生成了四个对象(指向常量池中的对象)。

s1先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。

s2先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。

s3先在常量池中寻找字符串,没有找到则在常量池中创建一个对象,返回常量池中对象的引用。

字符串在拼接时,先在堆中创建了一个对象,然后在常量池中寻找字符串,找到了则返回常量池中对象的引用,堆中保存常量池中对象的引用。

 

上一篇:2022.1.26


下一篇:Leetcode 14.最长公共前缀 Python