我知道a和b都指向同一个对象,可是b=null时,为什么a 还有值呢?

解决方案 »

  1.   

    我觉得应该时a和b对象指向的地址是一样,b=null只是擦去了一个指向“hello”的地址,a的指向还在。
    不知道这么理解对不对?请高手讲一下把请问这道题答案时什么啊?为什么?
      

  2.   

    我不明白既然b=null了,为什么还会因为a的存在而不能被收集呢?
      

  3.   

    不可以
    string对象的建立过程有些特别
    string对象有一个类似于pool的东西
    当执行第三行的时候,String a="hello";虚拟机会在内存中建立一个新的string对象,同时将hello放到pool中。当执行到第四行的时候String b="hello";虚拟机会检查pool中有没有hello,如果有那么并不建立新的对象,而是简单的将a的引用付与b。也就是说此时a和b所指向的是同一个对象。因此在第六行并不会被收集。
    当然如果用String b=new String("hello");就又会不同了,这种方式不检查pool直接新建。这样做在第六行,b所指向的对象就会被收集。
      

  4.   

    可是b不是已经等于null了么?
      

  5.   

    b是否可以被垃圾收集器收集---是指b的对象从内存中清空,b=null只是把b的对象句柄设为null(见jsyx说的,a和b所指的是一个对象)
    不能把实例hello清空,
    所以:即b没有被垃圾收集
      

  6.   


         String s0="hello";
         String s1="hello";
         String s2=new String("hello");
         String s3=new String("hello");     System.out.println(s0.hashCode()+"   "+s1.hashCode()+"   "+
                                s2.hashCode()+"   "+s3.hashCode());
         System.out.println((s0==s1)+"   "+(s0==s2)+"   "+(s0==s3));
         System.out.println((s1==s2)+"   "+(s1==s3));
         System.out.println((s2==s3));结果是:
    99162322   99162322   99162322   99162322
    true   false   false
    false   false
    false嘻嘻
      

  7.   

    垃圾收集器只能收集以new创建的对象(见<Think In Java>有关内容)所对应的内存