浏览 2472 次
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-12-29
最后修改:2010-12-29
如果,上面的问题您都能很清晰,那么没有必要浪费你宝贵的时间继续看了。否则,请允许我把我一点理解分享给大家,跟着我继续往下走! 这是我自己画的图: 跟着我来读这个图: String的new和"='a'"的区别: 如果String str=new String("aaa");JVM在heap中开辟String内存空间后,在stack中寻找是否已经有"aaa"存在。若不存在,分两步走: 1、就在stack中创建一个"aaa"数组array,然后再heap中创建一个String o;(单独的,不同于str),让o中的char[]指向array首地址,再将array绑定o对象地址 2、将str中的char[]地址指向o中的char[]指向的对象,即将str中的char[]直接指向array首地址 如果"aaa"已经存在,很好办,通过array找到o,然后执行第二步就好。 这样就造成一种假象,没new一String都会重新非配char[]内存,实际不是如此。之所以有这种错觉,是因为每new一个String 索引str所指向的地址不同而已。 如果是String str="aaa";如果stack中没有"aaa"的数组,那么将和上面步骤1中进行同样的操作,只不过2步骤不同:不是单独在heap中开辟一块String的空间了,而是所有的对象的索引str都直接指向第1步中创建的o。 String和普通包装类的区别: 普通包装类只有部分值存在类似String中o对象(如Integer是-128~127),另外的值不管是new还是用=都是重新在heap中开辟空间,尽管最终heap中的的索引也是指向stack中的同一内存区域(栈中不会有int的两个相同值,不过可以有两个相同值的索引)。 上代码: public class HeapDemo { public static void main(String args[]){ Integer i=new Integer(2); Integer j=new Integer(2); System.out.println(j.intValue()==j.intValue());//true System.out.println(i==j);//false Integer h=10; Integer k=10; System.out.println(h==k);//true Integer u=new Integer(1001);//超过缓存范围 Integer uu=new Integer(1001); System.out.println(u.intValue()==uu.intValue());//true System.out.println(uu==u);//false Integer q=1000;//超过缓存范围 Integer qq=1000; System.out.println(q==qq);//false String r=new String("bbb"); String rr=new String("bbb"); System.out.println(r.charAt(0)==rr.charAt(0));//true System.out.println(r==rr);//false String s="aaa"; String ss="aaa"; System.out.println(s==ss);//true } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-12-29
会被投新手贴么?
|
|
返回顶楼 | |
发表时间:2010-12-29
freish 写道 会被投新手贴么? 早些时候遇到了这个问题。也解决了。虽然是个基础问题。现在又温习遍。 |
|
返回顶楼 | |
发表时间:2010-12-29
freish 写道 会被投新手贴么? 我是小白菜,重在交流和分享 |
|
返回顶楼 | |