面试问到的
inta
2012-10-23
指定回收了,list会分配新变量list[i]这样的来指向s1,s2指向的值,s1,s2此时没有地方再使用了 而且已经被设置为null
|
|
de6566088
2012-10-24
1、首先,先明确一下String的概念,String他的类型非常特殊,它不是基本数据类型但是它却可以用基本数据类型的赋值方式进行赋值,如String s1 = "abc";而以这种形式赋值在java中叫直接量,它是在常量池中如:"abc"其就占用一块内存地址,就算String s2 = "abc"其s1与s2指向的都是一个内存地址故s1==s2,而不是象new 一样放在压缩堆中.所以String s3 = new String("abc");(它是从内存里新开辟一个区域)String s4 = new String("abc");由于指向不同的地址s3==s4返回的是false;
2、其次,是中间加了一个list.add(s1)和list.add(s2),其实就是通过list将s1指向的地址和s2指向的地址交给了list引用,这个就是开涛大哥说的list保持引用; 3、再次就是如何理解这个GC,s1=null;s2=null按照GC的理论他们应该就是告诉GC把我处理掉吧。按照这样的说法s1,s2是被回收掉,但是又有这样的理解s1和s2的引用已经给了list无论是不是被GC掉都无关紧要了,其实他对内存没有任何影响,也没有什么优化效果。这个属于个人理解,如有偏差请多指教。 当然这样的面试题目大多数人不爱看到的,因为平常工作中就很少涉及,有时间完成需求就不错了,哪有时间是优化到这个样子,但是这样子也好多了解一些也不是坏事。特别对我们这样的初学者。 |