布尔值是否在 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;
}
其中 TRUE
和 FALSE
是静态(不可变)对象。所以是的,已解析的布尔值被保留了。
不过,我同意 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))
的实现是有效的。
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;
}
其中 TRUE
和 FALSE
是静态(不可变)对象。所以是的,已解析的布尔值被保留了。
不过,我同意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))
的实现是有效的。