【问题标题】:What is the difference between Boolean.TRUE and true in Java?Java 中的 Boolean.TRUE 和 true 有什么区别?
【发布时间】:2011-06-21 03:03:14
【问题描述】:

PS:我理解“真”和“真”的区别。

编辑: 我也明白 Boolean.TRUE 是原始 true 的包装器,那么我的问题是 - 为什么原始布尔值接受 Boolean.TRUE 作为值? 例如,

boolean boolVar = Boolean.TRUE;

似乎是一个有效的陈述。

【问题讨论】:

  • 该链接没有回答为什么boolean boolVar = Boolean.TRUE; 是一个有效的、有意义的声明。我说有意义是因为它做它看起来做的事情:)
  • 这是因为该链接解决了您在编辑之前提出的问题。
  • 我也在编辑后发表了评论 - 我只是澄清这不是我想要的。我不是说你错了——我只是说我不是在寻找你链接到的东西。

标签: java boolean


【解决方案1】:

由于多种原因,原始类型(例如boolean)比类(例如Boolean)更受欢迎。请参阅此处的讨论。 https://softwareengineering.stackexchange.com/questions/203970/when-to-use-primitive-vs-class-in-java。原始类型使代码更具可读性,防止指针错误,例如if(a==b) vs if(a.equals(b)),提高性能并遵循转换。

有一种情况是BooleanIntegerbooleanint 效果更好。也就是说,如果您想允许 null 作为值。这会导致许多空检查,但它可以防止false

【讨论】:

    【解决方案2】:

    您还可以从下面的 Wikipedia 中获得有关链接的说明。

    Java 中的所有原始包装类都是不可变的。 J2SE 5.0 将原始类型的自动装箱引入其包装对象,并将包装对象自动拆箱为其原始值——包装对象和原始值之间的隐式转换。

    更多关于http://en.wikipedia.org/wiki/Primitive_wrapper_class

    【讨论】:

      【解决方案3】:

      正如前面的答案所述,Boolean.TRUE 返回布尔值 true包装器 对象,因此对于我们需要将布尔值视为对象的上下文(例如,具有 @ 987654324@ 的布尔值),我们可以使用Boolean.TRUEBoolean.FALSE

      至于为什么:

      boolean boolVar = Boolean.TRUE;
      

      有效是因为Autoboxing and Unboxing

      简而言之,Java 编译器,当它看到您将原始数据视为对象时,例如

      List<Boolean> listOfBoolean = new ArrayList<Boolean>();
      boolean someBool = true;
      listOfBoolean.add(someBool);
      

      它会自动包装它,或者 autobox

      List<Boolean> listOfBoolean = new ArrayList<Boolean>();
      boolean someBool = true;
      listOfBoolean.add(Boolean.valueOf(someBool));
      

      如果它发现您将包装对象(例如 Boolean.TRUE)视为原始对象,例如:

      boolean boolVar = Boolean.TRUE;
      

      它将把它转换成一个原始的,或者unbox它,就像我们做的那样:

      boolean boolVar = Boolean.TRUE.booleanValue();
      

      曾几何时,您必须手动执行此操作,但现在,无论好坏,这主要由您来处理。

      如果你想知道为什么有Boolean.TRUE,那是因为true 不需要在很多布尔对象周围浮动。由于布尔值只能是两个值之一,因此将它们作为常量更简单,而不是每次有人需要装箱true

      Boolean trueBool = new Boolean(true); 
      

      【讨论】:

      • 我似乎无法接受 2 个答案,所以我接受了 Colin 之前发布的,但您的详细解释很有意义 - 谢谢!
      • @user183037 没关系,我很乐意提供帮助 :-)
      【解决方案4】:

      原因

      boolean boolVar = Boolean.TRUE;
      

      works 是因为 autounboxing,这是 Java 5 的一项功能,它允许包装器对象在需要时自动转换为其原始等效对象。相反的,自动装箱,也是可能的:

      Boolean boolVar = true;
      

      【讨论】:

      • 太棒了——我忘记了自动拆箱!但是为什么首先要有 Boolean.TRUE 呢?
      • @user183037:因此您可以在需要时直接使用该对象,而不必通过自动装箱。至于常量本身,您希望系统中的所有Boolean 实例都是Boolean.TRUEBoolean.FALSE 这两个对象之一。只要不使用Boolean的构造函数,就是这样。
      • 更重要的是,您只需要 VM 中具有 true 值的单个布尔对象。 false 也是如此。换句话说,equal() 的两个布尔对象也是==——也就是说,同一个(相同的)对象。
      • @Ted:是的,我就是这么说的。
      • “Java 不支持运算符重载”就这么多。这正是运算符重载所能实现的......
      【解决方案5】:

      Boolean.TRUE 是一个包装对象和单例。 true 是一个字面常量。以下是我在原语上使用包装器的两种情况

      1. 我想将它们存储在集合中
      2. 我想要一个 null 的概念。原始布尔值只能表示两种状态。

      【讨论】:

        【解决方案6】:

        Boolean.TRUE 是对 Boolean 类对象的引用,而 true 只是原始布尔类型的值。像 Boolean 这样的类通常被称为“包装类”,当您需要一个对象而不是原始类型时使用(例如,如果您将其存储在数据结构中)。

        【讨论】:

          【解决方案7】:

          true 是基本的boolean 类型,而Boolean.TRUE 是包装true 值的Boolean 对象。

          【讨论】:

            猜你喜欢
            • 2021-05-13
            • 1970-01-01
            • 1970-01-01
            • 2011-06-22
            • 2018-12-20
            • 2023-03-14
            • 2014-10-27
            • 2014-05-19
            • 1970-01-01
            相关资源
            最近更新 更多