public class ReferenceTest {
public static void main(String[] args) throws InterruptedException {
WeakHashMap<String, String> ws = new WeakHashMap<String, String>();
// {
// 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<String, String> ws = new WeakHashMap<String, String>();
{
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");
}
}
打印出来的值是Afka Liu
这个例子先new了一个String,这样就没有常量池的引用指向这个new出来的String对象,然后将它put到WeekHashMap中,如果没有lu的强引用,WeekHashMap中get出来的就应该是null。但是第二种方法get出来的不是null,但是lu已经出了作用域,生命周期也已经结束。第一种和第二种在垃圾回收上有什么区别?
问题补充:
你说的我清楚,我也只是建议回收,可是在我的eclipse里跑了几十次都是我提问的结果,如果能得到您给的结果,那就没有什么问题了.
相关推荐
### 黑马程序员Java基础教学知识点详解 #### 一、变量的作用域与生命...以上内容涵盖了Java基础教学中的关键概念,包括变量作用域、循环结构、流程控制以及内存管理的基本原理,是学习Java编程不可或缺的基础知识。
\n\n总之,理解并熟练掌握JAVA中的变量作用域是成为一名合格的JAVA程序员的基础,也是OCJA认证考试的关键内容之一。通过深入学习和实践,可以有效地提升编程技能,为未来的JAVA开发工作打下坚实的基础。
Java变量和对象的作用域是编程时非常重要的概念,它们决定了变量和对象的可见性和生命周期。在Java中,作用域由代码中的大括号 `{}` 定义,这被称为语句块。一旦变量或对象在某个作用域内声明,它们就只能在该作用域...
- 从方法中返回,使得该方法中的局部变量超出作用域。 一旦对象的引用被销毁或不可达,即没有任何引用指向该对象时,该对象就成为了垃圾收集的目标。 #### 垃圾回收算法 常见的垃圾回收算法包括但不限于标记-清除...
- **栈上创建**:原始数据类型的局部变量等,它们的内存会在栈上创建,并且当程序退出作用域时,这些变量的内存会被自动释放。 - **堆上创建**:使用`new`创建的对象,这些对象在堆中创建,由垃圾回收器管理其生命...
在C++中,对象的生命周期与其作用域紧密相关,当对象超出作用域时会被自动销毁。而在Java中,对象的生命周期与其引用有关。只要存在至少一个引用指向对象,那么对象就不会被垃圾回收。当对象的引用计数变为0,即...
例如,在上述代码的`makeComputer()`方法中创建的`tempComputer`对象,一旦方法返回,`tempComputer`变量就离开了其作用域,意味着其指向的对象失去所有引用,等待垃圾回收。 总之,Java的垃圾回收机制是其内存管理...
然而,`finalize()`的调用时机并不固定,它会在垃圾回收器准备释放对象内存时被调用,而不是像C++析构函数那样在对象离开作用域时调用。因此,`finalize()`不应被依赖来保证资源的释放,因为它的时间点无法准确预知...
基于java变量和作用域以及成员变量的默认初始化 Java 变量和作用域是 Java 编程语言的基础概念,了解变量和作用域的概念对编写高效、可靠的 Java 程序非常重要。本文将详细介绍 Java 变量和作用域,以及成员变量的...
在例1中,`computer3`在`null`赋值后,虽然仍有可能通过其他引用访问,但由于直接引用`computer3`的变量被设置为`null`,这个对象也就离开了它的直接作用域,满足了垃圾回收的条件。但是,如果`computer1`也被设置为...
当对象出了作用域后(该对象丢弃不再运用),引用计数器减1,一旦引用计数器为0,对象就满意了垃圾收集的条件。 基于tracing算法的垃圾收集器 tracing算法是为了解决引用计数法的问题而提出,它运用了根集的概念。...
Java变量类型是编程基础,也是面试中经常被问到的话题。理解这些概念对于任何Java开发者都至关重要。在Java中,变量分为两类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。 一、...
在Java中,变量声明会被提升到其所在作用域的顶部,这意味着在实际声明之前可以使用变量。然而,如果在使用前未初始化,会抛出编译错误。 7. **变量的命名规则** - 变量名应以字母、下划线(_)或美元符号($)...
它们的生命周期与对象的生命周期相同,当对象被垃圾回收时,成员变量也随之消失。 类变量(静态变量)是用static关键字修饰的变量,它属于类本身而不是类的实例。这意味着不论创建多少个类的对象,类变量只有一份...
然而,当方法结束返回时,`oa[0]`的作用域也结束,此时对象才符合垃圾回收的条件。因此,答案是D,对象在该方法中永远不会被回收。 第三个例子与第二个类似,对象在第3行创建,然后在第6行`o`被设置为`null`。但...
在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中直接查看,但根据常规的Java教程,我可以提供一个详细的概述。 1. **基本...
本文主要讨论了Java中变量使用时的几个关键方面,包括变量的类型、作用域、值和生存期,并探讨了这些因素在Java虚拟机(JVM)中的实现机制。 1. **变量的类型**: Java中的变量分为两种类型:基本类型和引用类型。...