简单理解两个概念:
一:Java机制里有很多空间,我们的问题涉及到以下三种空间:
1、stack(栈)
2、heap(堆)
3、常量池
二:java中的String是引用类型。
创建的String对象,实际上存储的是一个地址。
下面举例:
创建String对象的两种方式:
String s1 = new String("11"); //new一个对象
String s2 = "11"; //双引号创建
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
【解析】:s1、s2都是引用类型,其存储的是字符串的地址。
第一种方法,先将字符串"11"存储在常量池中,然后在heap中创建一个对象,该对象指向常量池中的"11",最后将s1指向heap中创建的这个对象。
第二种方法,直接将字符串存储在常量池中,然后将s2指向常量池种中的"11"。
也就是说,s1和s2存储的内容是一样的,都是"11",但地址不一样,s1保存的是heap中那个对象的地址,s2中保存的是常量池中"11"的地址。
三:双等于号"=="比较的是地址,equals()比较的是内容,所以会有上面的结果。
最后再说一点:s1和s2都是引用,他们本身存储在stack(栈)中。
了解了他们的机制后,尝试理解下面的例子:
String s1 = new String("11");
String s2 = "11";
String s3 = "11";
String s4 = new String("11");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2));//true
System.out.println(s2 == s3); //true
System.out.println(s1 == s4); //false