java变量作用域完了是不是就可以垃圾回收

public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap ws = new WeakHashMap();
// {
// String lu = new String("sb");
// ws.put(lu, "Afka Liu");
// }

    initHash(ws);
    System.gc();
    System.out.println(ws.get("sb"));
}
public static void initHash(WeakHashMap<String, String> ws) {
    String lu = new String("sb");
    ws.put(lu, "Afka Liu");
}

}

打印出来的值是 null

public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap ws = new WeakHashMap();
{
String lu = new String("sb");
ws.put(lu, "Afka Liu");
}

// initHash(ws);
System.gc();
System.out.println(ws.get("sb"));
}
public static void initHash(WeakHashMap ws) {
String lu = new String("sb");
ws.put(lu, "Afka Liu");
}
}

打印出来的值是Afka Liu

这个例子先new了一个String,这样就没有常量池的引用指向这个new出来的String对象,然后将它put到WeekHashMap中,如果没有lu的强引用,WeekHashMap中get出来的就应该是null。但是第二种方法get出来的不是null,但是lu已经出了作用域,生命周期也已经结束。第一种和第二种在垃圾回收上有什么区别?
[b]问题补充:[/b]
你说的我清楚,我也只是建议回收,可是在我的eclipse里跑了几十次都是我提问的结果,如果能得到您给的结果,那就没有什么问题了.

跑了一下代码,两个测试结果都是null哦。得不到你要第二个结果。

顺便提一下。System.gc(); 调用之后System.gc(); 不一定马上运行哦。只是说:

[quote]
调用此方法意味着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制从方法调用中返回时,虚拟机已经尽最大努力回收了所有丢弃的对象。
[/quote]

对象是否被回收是不被保证的。