String类型 堆/字符串池的理解

 1 package test;
 2 
 3 public class StringTest {
 4 
 5     public static void main(String[] args) {
 6 
 7         /**
 8          * 创建过程:
 9          * 1.检查StringPool(字符串池)里是否有"aaa"对象,这里没有,创建StringPool的字符串对象"aaa"
10          * 2.在jvm堆里创建字符串对象"aaa"
11          * 所以,这里创建了2个对象
12          */
13         String s = new String("aaa");
14 
15         /**
16          * 创建过程:
17          * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建
18          * 所以,这里并没有创建对象
19          */
20         String s2 = "aaa";
21 
22         /**
23          * 创建过程:
24          * 1.检查StringPool(字符串池)里是否有"aaa"对象,因为上面已经创建过,所以这里不再创建
25          * 2.在jvm堆里创建字符串对象"aaa"
26          * 所以,这里创建了1个对象
27          */
28         String s3 = new String("aaa");
29 
30         /**
31          * intern方法的作用:返回调用对象的字符串池里的字符串对象的引用
32          */
33         String s4 = s.intern();
34 
35         String hello = "hello";
36         String hel = "hel";
37         String lo = "lo";
38 
39         /**
40          * 打印true
41          * 如果右边计算不涉及变量计算,全部都是常量,不会产生新的对象
42          * 所以返回的是字符串池里的对象引用
43          */
44         System.out.println(hello == "hel" + "lo");
45         /**
46          * 打印false
47          * 右边计算涉及变量计算,有对象操作,会产生一个新的对象
48          * 所以返回的是堆的对象引用
49          */
50         System.out.println(hello == "hel" + lo);
51     }
52 
53 }

 

posted @ 2018-06-03 15:38  无名草110  阅读(352)  评论(0编辑  收藏  举报