1 public class Test01 {
2 public static void main(String[] args) {
3 //demo1();
4 //demo2();
5 //demo3();
6 //demo4();
7 demo5();
8 }
9 private static void demo5() {
10 String s1 = "ab";
11 String s2 = "abc";
12 String s3 = s1 + "c";
13 System.out.println(s3 == s2);
14 System.out.println(s3.equals(s2)); //true
15 }
16 private static void demo4() {
17 //byte b = 3 + 4; //在编译时就变成7,把7赋值给b,常量优化机制
18 String s1 = "a" + "b" + "c";//java中有常量优化机制,在编译时期就能确定s2的值为"abc",所以编译时期,在常量池中创建"abc"
19 String s2 = "abc";//执行到这里时常量池中已经有了"abc",所以就不再创建,所以s1和s2指向的是常量池中同一个字符串常量"abc"
20 System.out.println(s1 == s2); //true,java中有常量优化机制
21 System.out.println(s1.equals(s2)); //true
22 }
23 private static void demo3() {//==比较的是地址值
24 String s1 = new String("abc"); //录的是堆内存对象的地址值
25 String s2 = "abc"; //记录的是常量池中的地址值
26 System.out.println(s1 == s2); //false
27 System.out.println(s1.equals(s2)); //true
28 }
29 private static void demo2() {
30 //创建几个对象
31 //创建两个对象,一个在常量池中,一个在堆内存中
32 String s1 = new String("abc");
33 System.out.println(s1);
34 }
35 private static void demo1() { //常量池中没有这个字符串对象,就创建一个,如果有直接用即可
36 String s1 = "abc";
37 String s2 = "abc";
38 System.out.println(s1 == s2); //==号比较的是地址值,true
39 System.out.println(s1.equals(s2)); //比较的是字符串的内容:true
40 }
41 }
42