Boolean vs boolean en Java

Hay discusiones alrededor de Integer vs int en Java. El valor predeterminado de la primera es null mientras que en la segunda es 0 . ¿Qué hay de Boolean vs boolean ?

Una variable en mi aplicación puede tener valores 1 0/1. Me gustaría usar boolean / Boolean y prefiero no usar int . ¿Puedo usar Boolean / boolean lugar?

, puede usar Boolean / boolean lugar.

El primero es Object y el segundo es de tipo primitivo.

  • En la primera, obtendrás más métodos que te serán útiles.

  • El segundo es barato teniendo en cuenta el costo de la memoria. El segundo te ahorrará mucha más memoria, así que adelante.

Ahora elige tu camino.

Boolean ajusta el tipo primitivo booleano. En JDK 5 y versiones posteriores , Oracle (o Sun antes de que Oracle los comprara) introdujo el autoboxing / unboxing , lo que esencialmente le permite hacer esto.

 boolean result = Boolean.TRUE; 

o

 Boolean result = true; 

Que esencialmente hace el comstackdor,

 Boolean result = Boolean.valueOf(true); 

Entonces, para su respuesta, es SÍ.

Estoy un poco extendiendo las respuestas proporcionadas (dado que hasta ahora se concentran en su terminología “propia” / artificial enfocándose en progtwigr un idioma particular en lugar de ocuparse de la imagen más grande detrás de la escena de creación de los lenguajes de progtwigción , en general, cuando las cosas como las consideraciones de tipo de seguridad vs. memoria hacen la diferencia):

int no es booleano

Considerar

  boolean bar = true; System.out.printf("Bar is %b\n", bar); System.out.printf("Bar is %d\n", (bar)?1:0); int baz = 1; System.out.printf("Baz is %d\n", baz); System.out.printf("Baz is %b\n", baz); 

con salida

  Bar is true Bar is 1 Baz is 1 Baz is true 

El código de Java en la 3ra línea (bar)?1:0 ilustra que la barra ( booleana ) no se puede convertir implícitamente (casted) en un int . Traigo esto a colación para no ilustrar los detalles de la implementación detrás de JVM, pero para señalar que en términos de consideraciones de bajo nivel (como el tamaño de la memoria) uno tiene que preferir los valores por sobre la seguridad del tipo. Especialmente si ese tipo de seguridad no se utiliza de verdad / completamente como en los tipos booleanos donde los controles se realizan en forma de

si value \ in {0,1} luego se convierte a tipo booleano, de lo contrario arroja una excepción.

Todo para indicar que {0,1} <{-2 ^ 31, .., 2 ^ 31 -1}. Parece una exageración, ¿verdad? La seguridad de tipo es realmente importante en los tipos definidos por el usuario, no en la conversión implícita de primitivas (aunque las últimas se incluyen en la primera).

Los bytes no son tipos o bits

Tenga en cuenta que en la memoria su variable del rango de {0,1} aún ocupará al menos un byte o una palabra (xbits dependiendo del tamaño del registro) a menos que se cuide especialmente (por ejemplo, empaquetado muy bien en la memoria – 8 “booleano”) bits en 1 byte – ida y vuelta).

Al preferir la seguridad de tipo (como poner / envolver valor en un cuadro de un tipo particular) sobre el valor agregado adicional (por ejemplo, utilizando cambios de bit o aritmética), uno elige efectivamente escribir menos código para obtener más memoria. (Por otro lado siempre se puede definir un tipo de usuario personalizado que facilitará todas las conversiones no valen más que Boolean).

palabra clave vs. tipo

Finalmente, su pregunta es sobre comparar palabra clave vs. tipo . Creo que es importante explicar por qué o cómo exactamente obtendrás rendimiento al usar / preferir palabras clave (“marcadas” como primitivas ) sobre tipos (clases compuestas definidas por el usuario normales usando otra clase de palabras clave) o en otras palabras

 boolean foo = true; 

vs.

 Boolean foo = true; 

La primera “cosa” (tipo) no se puede extender (subclasificar) y no sin una razón. Efectivamente, la terminología de Java de las clases primitivas y de envoltura puede traducirse simplemente en un valor en línea (un LITERAL o una constante que se sustituye directamente por el comstackdor siempre que sea posible inferir la sustitución o, en caso contrario, seguir aplicando el valor).

La optimización se logra debido a lo trivial:

“Menos operaciones de lanzamiento en tiempo de ejecución => más velocidad”.

Es por eso que cuando se realiza la inferencia de tipo real, puede (todavía) terminar en la creación de instancias de la clase de ajuste con toda la información de tipo si es necesario (o convertir / fundir en tal).

Entonces, la diferencia entre Boolean y Boolean está exactamente en Comstacktion y Runtime (un poco lejano pero casi como instanceof vs. getClass () ).

Finalmente, el autoboxing es más lento que las primitivas

Tenga en cuenta que el hecho de que Java puede hacer autoboxing es solo un “azúcar sintáctico”. No acelera nada, solo te permite escribir menos código. Eso es. Todavía se realiza la conversión y el empaquetado en contenedores de información tipo. Por razones de rendimiento, elija aritméticos que siempre omitan el mantenimiento adicional de la creación de instancias de clase con información de tipo para implementar seguridad de tipo. La falta de seguridad tipo es el precio que paga para obtener rendimiento. Para el código con expresiones con valores booleanos, la seguridad del tipo (cuando se escribe menos y, por tanto, el código implícito ) sería crítico, por ejemplo, para los controles de flujo if-then-else.

Puede usar las constantes booleanas – Boolean.TRUE y Boolean.FALSE lugar de 0 y 1 . Puede crear su variable como tipo boolean si lo que boolean es primitivo. De esta forma, no tendrá que crear nuevos objetos Boolean .

Básicamente, boolean representa un tipo de datos primitivo donde Boolean representa un tipo de datos de referencia. esta historia se inicia cuando Java desea convertirse en puramente orientado a objetos; se le proporciona el concepto de clase de contenedor para utilizar el tipo de datos primitivo.

 boolean b1; Boolean b2; 

b1 y b2 no son lo mismo.

La clase java.lang.Boolean ajusta un valor del booleano de tipo primitivo en un objeto. Un objeto de tipo Boolean contiene un único campo cuyo tipo es booleano

A continuación se muestra la statement, la clase final pública Boolean extends Object implementa Serializable, Comparable