2

我的豆子如下

private boolean myBoolean;

public boolean isMyBoolean() {
    return myBoolean;
}

public void setMyBoolean(
        boolean myBoolean) {
    this.myBoolean = myBoolean;
}

现在,当我对上述布尔字段使用 setter 时,那么有效的方法应该是什么

setMyBoolean(true);

或者

setMyBoolean(Boolean.TRUE);

我知道自动装箱会很小心,两者都可以工作但我不知道这个例子中的有效方法是什么。所以我的问题是我应该使用哪一个来编写有效的代码,或者两者都一样好

TIA

4

5 回答 5

4

使用第一个。更具可读性。您无需担心这里的性能问题,尽管第二个将涉及自动装箱并且相对较慢(同样,您无需考虑它)。

在这种情况下只考虑代码的可读性,并记住原语总是比对象快。

于 2013-09-03T05:52:05.063 回答
1

恕我直言

 setMyBoolean(true);

Primitives 总是比 Wrappers 更受欢迎。无论何时我能够使用 Primitives,我都会使用它们

因为在运行时,如果我们使用 Wrappers装箱转换拆箱转换发生在运行时,显然需要更多时间。

在你的情况下

在运行时,装箱转换按如下方式进行:

如果 p 是 类型 的值boolean,则装箱转换将 p 转换为类和布尔类型的引用 r,使得r.booleanValue() == p

如果你在那里使用原始,显然你节省了时间。

于 2013-09-03T05:51:30.867 回答
1

原因

boolean boolVar = Boolean.TRUE;

之所以有效是因为autounboxing是 Java 5 的一项功能,它允许包装器对象在需要时自动转换为其原始等效对象

如您所知,设置比自动拆箱然后设置要快...

于 2013-09-03T05:52:24.817 回答
0

不要紧。在编译代码的最后,生成的字节码最终将使用 JVM 上的布尔数据类型。

我想说的是,在编译时,像这样的简单代码将自动针对 JVM 进行优化。使用哪种方式并不重要,请记住编译器最终会将其转换为字节码,而如今的 JVM 一直在进行这种优化。

如果您对此持怀疑态度,可以尝试两种方法并在代码上使用分析器。你会感到惊讶。

于 2013-09-03T05:58:24.877 回答
0

Boolean.TRUE是 的包装对象boolean

Sun SDK 的布尔类实现:

public final class Boolean ... 
{
    private final boolean value;

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

当你使用setMyBoolean(Boolean.TRUE);

  1. VM 创建布尔对象(在堆中)并将其保存value为 true。
  2. 将创建的对象拆箱,最后将原语分配truemyboolean.

当你使用setMyBoolean(true);: 只会从上面执行第 2 步。从而更快!

于 2013-09-03T06:09:35.653 回答