9

我什么时候应该使用布尔值而不是布尔值?我的意思是,为什么我要在一个应该包含“真”或“假”的变量中有一个空值。一个自发的答案(大多数人)是如果该值未知。即,如果我们不知道该值是真还是假。但是从编程的角度来看,我认为使用布尔值可能会破坏代码,因为我们不知道里面是什么。所以,我认为使用原始类型比包装更好。如果我错了,请纠正我。

4

8 回答 8

16

一般来说,包装类用于需要或强烈首选对象的情况。在这些情况之外,最好使用原始类型,因为它们的开销较低,您可以使用==等。有两种半常见的情况:

  • 收藏品。现在这是下一个案例的一个子集,但即使在 Java 5 之前,Collections 类也只支持对象作为键和值,这并没有改变。
  • 泛型。泛型类型只能与对象一起使用,而不能与原始类型一起使用,因此如果您使用“布尔”作为类型参数,它必须是包装类。例如,如果您使用 a Future,则必须使用 aBoolean而不是 a boolean。(HT@user949300)
  • 甲骨文。JPA 和其他 ORM 系统在技术上可以使用原始字段,但习惯上使用包装类,因为开销足够高,无论如何这并不重要,并且包装类可以表示NULL可能存在于数据库中的值. 不过,通常最好禁止空值并为布尔值使用原语,因为从语义上讲,默认值通常比“未定义”更好。

由于布尔值被限制为trueor false,所以很少看到它们在 Collections 或 Generics 中使用;一般来说,如果您将布尔值作为值,则只需使用它Collection#contains

于 2013-09-23T06:54:16.353 回答
10

恕我直言,原语更好。

总是喜欢原语而不是包装器。无论我在哪里能够使用原语,我都会使用它们,因为在运行时,如果我们使用包装器,就会发生装箱转换拆箱转换,显然这需要更多时间。如果您在那里使用原语,则可以节省时间。

和往常一样,这取决于您的要求是需要 a Object(可以是null)还是可以在您的情况下使用原语(不能是null)。

例如:假设您正在处理集合,那么您没有选择,您必须使用包装器:)。

于 2013-09-23T06:51:37.300 回答
5

布尔值有 3 个可能的值(空、真、假),而布尔值只能是(真、假)。

于 2013-09-23T06:51:46.797 回答
3

我非常喜欢原语。但是,布尔值是必要的:

  1. 当他们进入收藏时
  2. 当您需要允许空值时。以我的经验,这主要是如果它们存储在数据库中并且您需要 null 表示它们尚未被读取,或者用户尚未填写某些表格。
于 2013-09-23T06:55:27.363 回答
0

如果需要使用集合怎么办?Collection 不会存储原始类型,您需要在其中存储对象。集合提供了如此多的实用 API,因此如果您想使用它们,则需要一个布尔对象,因为集合将需要对象。尽管您始终可以使用自动装箱,这意味着您可以免受对象创建的影响,并且集合会在内部处理它。

于 2013-09-23T06:51:32.393 回答
0

Wrapper 类将用于需要或强烈首选对象的情况,例如将对象存储在 Collections、缓存或会话等中,其中需要对象(如果不需要,JRE 将在将原语存储在辅助中之前将其转换为 Wrapper 类缓存)。以下链接将更好地解释:

Java中的布尔值与布尔值

于 2013-09-23T06:51:40.237 回答
0

Boolean是一个对象,因此您可以将它与泛型一起使用。例如,您可能必须Map<String,Boolean>为每个字符串 (=key) 存储一个 true\false 值。你不能这样做Map<String,boolean>,因为boolean它不是一个对象——具体来说,它不是Object. 泛型是编译时包装器,因此Map<Foo,Bar>实际上是Map<Object,Object>智能转换,不管是什么FooBar只要它们是类或数组类型。但它们不能是原始的。

于 2013-09-23T06:54:24.230 回答
-1

布尔值是一种对象/引用类型,它包装了一个布尔值,而布尔值是一个原始类型。

Boolean - 你会得到更多有用的方法。

boolean - 将为您节省大量内存。但如果你使用Boolean.valueOf(value) of new Boolean(value),那不应该是一个原因。

像这样在基元和对象之间进行转换称为装箱/拆箱。

点击以下链接了解更多信息:

http://javaeye.wordpress.com/2008/06/17/boxing-and-unboxing-conversion/

http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html

http://www.javapractices.com/topic/TopicAction.do?Id=197

于 2013-09-23T06:58:37.283 回答