比较地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
String a = "123";
String b = "123";
//true
System.out.println(a == b);

String c = new String("123");
//false
System.out.println(a == c);

String d = a;
//true
System.out.println(d == b);

String e = "1" + "23";
//true
System.out.println(a == e);

String _1 = "1";
String _23 = "23";
String f = _1 + _23;
//false
System.out.println(a == f);

String g = "1" + _23;
//false
System.out.println(g == a);

final String f1 = "1";
final String f2 = "23";
//true
System.out.println(a==f1+f2);
新建几个对象

String test = “a”

新建一个对象,jvm在编译时会判断常量池是否有”a”,如果有直接指向它,如果没有就创建

String test = new String(“a”)

两个,一个堆一个常量池

String str = “a”+”b”

三个,”a”,”b”,”ab”都在常量池里

**String str = “a”+new String(“b”) **

四个,常量池里是,”a”,”b”,堆里有”b”,”ab”

只要+上了new的对象,产生的新对象都在堆里面,不放在常量池里