· StringChangLiangChi

 1 package com.miaoshaProject.demo;
 2 
 3 /**
 4  * @Author wangshuo
 5  * @Date 2022/5/9, 17:42
 6  * 字符串常量池
 7  */
 8 public class StringChangLiangChi {
 9 
10     /*
11         jvm为了提高性能和减少开销,在实例化字符串常量时进行了一些优化
12         字符串类维护了一个字符串池,当代码创建字符串常量时,jvm会先检查常量池,若已存在,直接返回池中实例的引用
13      */
14     //使用常量池
15     static class Program_A {
16         public static void main(String[] args) {
17             String a = "hello";
18             String b = "hello";
19             //比较值
20             System.out.println(a.equals(b));
21             //比较内存地址
22             System.out.println((a == b));
23         }
24     }
25 
26     /*
27         new 的 String 不会指向常量池的对象
28      */
29     //不使用常量池
30     static class Program_B {
31 
32         public static void main(String[] args) {
33             String a = "hello";
34             String b = new String("hello");
35             //比较值
36             System.out.println(a.equals(b));
37             //比较内存地址
38             System.out.println((a == b));
39         }
40     }
41 
42     //intern()方法 将字符串指向常量池中的某一个,返回一个保留池字符串
43     static class Program_C{
44 
45         public static void main(String[] args) {
46             String a = "hello";
47             String b = new StringBuilder("he").append("llo").toString();
48             String c = b.intern();
49 
50             //比较值
51             System.out.println(a.equals(c) && a.equals(b));
52             //比较内存地址
53             System.out.println((a == b));
54             System.out.println((a == c));
55         }
56     }
57 }