布尔值是否在 Java 中实习?

Is boolean interned in Java?

Integer 的以下代码使用了对象驻留:

Integer.valueOf("1")

从 API 文档中不清楚 Boolean 的这段代码是否也使用了内部对象:

Boolean.valueOf("true")

显然有可能。但它必须吗?

更新

我同意源代码可以解释 实际上 发生了什么(顺便说一句,感谢您的回答)。为了使问题不那么琐碎,Java API 规范或 JSL 中是否有任何部分告诉 什么必须 发生?

像这样针对代码提出问题是很自然的:

String str = "true";
if (Boolean.valueOf(str) == Boolean.TRUE) { ... }

结果取决于"object interning"是否有保证。最好完全避免使用此代码并使用 true 而不是 Boolean.TRUE(而不是在任何规范或来源中查找详细信息),但这是提出问题的正当理由。

注意:事实上,我在任何谷歌搜索规范中都没有看到 Integer 对象实习的保证。所以,这可能只是一个任何人都不应该依赖的实现细节。

基于source code,布尔值解析为:

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

public static Boolean valueOf(String s) {
    return toBoolean(s) ? TRUE : FALSE;
}

其中 TRUEFALSE 是静态(不可变)对象。所以是的,已解析的布尔值被保留了。

不过,我同意 that one should not derive code contracts from the source code: as long as a feature is not documented, the developers of Java can change their mind. You better use Boolean.equals检查两个对象是否等价。

这是 source code:

public static Boolean valueOf(String s) {
    return parseBoolean(s) ? TRUE : FALSE;
}

其中 TRUE 是:

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

如果您仍然不确定,请定义两个变量:

Boolean a = Boolean.valueOf("true");
Boolean b = Boolean.valueOf("true");

自己想看什么就看什么

JLS 保证:

Integer i = 1;
Boolean b = true;

将使用实习(整数至少在 -128 到 127 之间,布尔值至少在 true 和 false 之间)。

相关的 javadocs 也保证:

Integer i = Integer.valueOf(1);
Boolean b = Boolean.valueOf(true);

将 return 个对象。

但是 valueOf(String) 没有这样的明确保证:虽然在您使用的特定实现中是这样,但在不同的 JVM 或未来版本中可能不是这样。事实上 return new Boolean(Boolean.parseBoolean(input)) 的实现是有效的。