String_shod be so difficiult

来源:互联网 发布:数据新常态 下载 编辑:程序博客网 时间:2024/05/29 12:48

闲话少说,先看程序吧:

 

反正我是没预料到结果,暂时还解释不了,先在此发表了,不知有谁能猜对答案:

结果如下:

D:/java_pro_jdk>java StringTest
false
--------------
false
----------------
true
-----------------------
true
-------------------
false
-----------------
true

求解释啊...等一段时间吧....

时间:  2011-05-1120:14:52

现在开始先解释一谢谢吧:

 首先:new 了两个Object类对象,返回两个不同地址,则明天object和object2的对象地址不同---返回false;

第二个,同样是new了两个String类对象,返回两个不同地址,同上----返回false;

第三个,在java中,所有字符串对象均作为String类的对象,首先"bbb"是一个对象,即str3和str4均是指向"bbb"对象

的应用,则地址是相同的-----返回true;

第四个,str5是new出来的,指向的肯定不是"ccc"的地址,而str6是指向"ccc"的引用,两个地址不一样---返回false;

第五个,(暂时的理解)s是指向的"hello"对象的引用,s1是指向"hel"对象的引用,s2是指向"lo"对象的引用,三个均是地址,

基本可以认为s不会那么巧的等于另外两个地址相加的和----返回false;

第六个,(暂时的理解)"hel" + "lo" 是先将两个字符串组合以后再生成"hello"对象,因为hello在javapool中已存在,则将javapool中

的hello对象的地址返回,因为s是有字符字面值产生的,不是new出来的,则即也指向javapool中的hello对象,所以返回----true;

 

可以预测:若s是通过new出来的,即String s = new String("hello"); 则s指向的是在堆中创建的"hello"对象,则s == "hello"为false,

s== "hel" +"lo"为false; 实验结果验证我的预测是正确的,嘻嘻嘻....

小结: 当str对象是通过字面值产生时,先到String类维护的stringpool中查看是否已有该对象,例如:String str = "ccc";

先到stringpool中查看"ccc"是否已存在,(1) 若已经存在,则返回该对象的地址,即str指向"ccc";(2)  若不存在,则在javapool中创建"ccc"然后

将"ccc"对象的地址返回。                         当str对象时通过new方法产生时: 例如: String str = new String("ccc"); 同样的,先到

stringpool中产看是否已存在:(1)不存在,在javapool中创建,然后到heap堆中创建"ccc"对象,返回在heap堆中创建的那个对象的

地址; (2)已存在,直接到heap堆中创建"ccc"对象,返回heap堆中对象的地址 。 无论如何,new()方法都是在返回heap堆中的那个地址。

 

 

原创粉丝点击