coderABC

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

简单理解两个概念:

一: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


 

posted on 2017-02-16 16:38  as798982083  阅读(868)  评论(0编辑  收藏  举报