【问题标题】:Why is avoiding Boolean instantiation a good idea?为什么避免布尔实例化是个好主意?
【发布时间】:2014-07-17 07:17:33
【问题描述】:

PMD 警告我避免布尔实例化(出于效率原因)。 我有这样的东西

Boolean variable = new Boolean(somestringIGotRepresentingABoolean);

我应该使用这个

Boolean variable = Boolean.valueOf(somestringIGotRepresentingABoolean);

为什么这样更好?

【问题讨论】:

    标签: java performance pmd


    【解决方案1】:

    原因是 new Boolean 总是返回一个新实例。由于布尔实例是不可变的,因此拥有超过 2 个实例是没有意义的。一个为假,一个为真。

    试试这个,你会看到

    Boolean boolean1 = new Boolean("true");
    Boolean boolean2 = new Boolean("true");
    Boolean boolean3 = new Boolean("true");
    
    System.out.println(System.identityHashCode(boolean1));
    System.out.println(System.identityHashCode(boolean2));
    System.out.println(System.identityHashCode(boolean3));
    
    Boolean valueOf1 = Boolean.valueOf("true");
    Boolean valueOf2 = Boolean.valueOf("true");
    
    System.out.println(System.identityHashCode(valueOf1));
    System.out.println(System.identityHashCode(valueOf2));
    

    【讨论】:

      【解决方案2】:

      从文档中,您可以阅读:

      new Boolean(boolean value)
      

      分配一个表示值参数的布尔对象。

      注意:很少使用这个构造函数。除非需要新实例,否则静态工厂 valueOf(boolean) 通常是更好的选择。它可能会产生明显更好的空间和时间性能。

      【讨论】:

        【解决方案3】:

        在 Java 中,布尔值(如字符串)是不可变的。这意味着如果你使用

        Boolean x = new Boolean(true);
        x = false;
        

        x 将在“x = false”之后指向与之前不同的对象。因此,如果您使用 Boolean.valueOf() 方法,Java 将注意最多只有两个布尔对象,一个代表真,另一个代表假。如果你使用 .valueOf(true) 它将返回一个真实对象的句柄,如果你使用 .valueOf(false) 它将返回一个虚假对象的句柄。因此,您不会创建任何不必要的对象,因此垃圾收集器不必将它们删除。

        如果你改用“new Boolean()”,这不起作用,Java 每次都会创建一个新对象。因此,您将拥有大量不必要的对象,这些对象可能会很快被释放并且必须由垃圾收集器清理。因此,这会花费您更多的内存(对于所有对象)、分配时间(当创建新的布尔值时)和释放时间(当对象被垃圾收集器捕获时),而根本没有给您带来任何好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-12
          相关资源
          最近更新 更多