Java 如何检查是否以编程方式创建新实例?

Java 如何检查是否以编程方式创建新实例?,java,Java,根据docs,Boolean.valueOf(Boolean)方法从不创建对象 public class Employee { public static void main(String args[]){ String s1 = "false"; String s2 = "false"; String s3 = "true"; System.out.println(Boolean.valu

根据docs,Boolean.valueOf(Boolean)方法从不创建对象

public class Employee {
    public static void main(String args[]){
            String s1 = "false";
            String s2 = "false";
            String s3 = "true";

            System.out.println(Boolean.valueOf(s1));                
            System.out.println(Boolean.valueOf(s2));                
            System.out.println(Boolean.valueOf(s3));                
    }
}
下面的方法将布尔基元值转换为布尔对象引用

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

到目前为止,创建了多少个
布尔对象
?。我可以在控制台的某些位置检查是否创建了
新对象()
,还是仅创建了
对象引用

没有创建新对象,您永远不会实例化新的布尔对象。通过使用
Boolean.valueOf()
您只是在调用引用。

没有创建新对象,您永远不会实例化新的布尔对象。通过使用
Boolean.valueOf()
您只调用了一个引用。

您没有调用

public static Boolean valueOf(boolean b) { ... }
你在打电话吗

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}
其中
toBoolean(String)
实现如下:

private static boolean toBoolean(String name) {
    return ((name != null) && name.equalsIgnoreCase("true"));
}

结论是:在您发布的代码中,根本没有创建新的
Boolean
对象


Boolean
类定义了两个
Boolean
对象,它们是在首次加载类时创建的:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
你不是在打电话吗

public static Boolean valueOf(boolean b) { ... }
你在打电话吗

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}
其中
toBoolean(String)
实现如下:

private static boolean toBoolean(String name) {
    return ((name != null) && name.equalsIgnoreCase("true"));
}

结论是:在您发布的代码中,根本没有创建新的
Boolean
对象


Boolean
类定义了两个
Boolean
对象,它们是在首次加载类时创建的:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

您可以使用jvisualvm或任何其他内存探查器/分析器工具跟踪实例数。

您可以使用jvisualvm或任何其他内存探查器/分析器工具跟踪实例数。

除非文档不正确,为什么需要检查?您在process manager上看到任何内存使用峰值?将布尔值与
=
比较为Boolean.TRUE和Boolean.FALSE。文档中哪里说valueOf保证不会创建新实例?执行数百万次,存储每个结果,并使用探查器工具查看堆上的内容,或者使用jmap查看堆转储。虽然我相信JDK代码在这一点上…除非文档不正确,否则为什么需要检查?您在process manager上看到任何内存使用高峰?将布尔值与
=
比较为Boolean.TRUE和Boolean.FALSE。文档中哪里说valueOf保证不创建新实例?执行数百万次,存储每个结果,并使用探查器工具查看堆上的内容,或者使用jmap查看堆转储。虽然在这一点上我相信JDK代码…“在您发布的代码中,除了在布尔类中定义的对象之外,根本没有创建任何新的布尔对象”有点令人困惑。在OP发布的代码中,根本没有创建任何新的布尔对象,周期,甚至布尔类中声明的那些常量。它们是在布尔的静态初始值设定项运行时创建的,它们只是在这里返回。没有创建布尔对象。@JoshuaTaylor:是的,我的意思是你说的,你的更清楚。在运行时,存在2个
Boolean
对象,但它们是由
Boolean
类创建的,而不是由OPs代码创建的。“在您发布的代码中,除了在Boolean类中定义的对象之外,根本没有创建任何新的Boolean对象”有点令人困惑。在OP发布的代码中,根本没有创建任何新的布尔对象,周期,甚至布尔类中声明的那些常量。它们是在布尔的静态初始值设定项运行时创建的,它们只是在这里返回。没有创建布尔对象。@JoshuaTaylor:是的,我的意思是你说的,你的更清楚。在运行时,存在2个
Boolean
对象,但它们是由
Boolean
类创建的,而不是由OPs代码创建的。