Hay discusiones sobre Integer
vs int
en Java. El valor predeterminado del primero es null
mientras que en el segundo es 0
. ¿Qué tal Boolean
vs boolean
?
Una variable en mi aplicación puede tener 0
/ 1
valores. Me gustaría usar boolean
/ Boolean
y prefiero no usar int
. ¿Puedo usar Boolean
/ en su boolean
lugar?
Respuestas:
Sí , puedes usar
Boolean
/ en suboolean
lugar.El primero es Object y el segundo es de tipo primitivo.
En el primero, obtendrá más métodos que serán útiles.
El segundo es barato teniendo en cuenta el gasto de memoria. El segundo le ahorrará mucha más memoria, así que hágalo.
Ahora elige tu camino.
fuente
AsyncTask
, solo puede usar enBoolean
lugar deboolean
.true
,false
ynull
donde un booleano tiene los 2 estados lógicos (true
yfalse
)Boolean
envuelve el tipo primitivo booleano. En JDK 5 y versiones posteriores , Oracle (o Sun antes de que Oracle los comprara) introdujo el autoboxing / unboxing , que esencialmente le permite hacer estoo
Lo que esencialmente hace el compilador,
Entonces, para su respuesta, es SÍ.
fuente
Boolean
a aboolean
. SiBoolean
esnull
e intenta asignarlo a aboolean
, arrojará unNullPointerException
en tiempo de ejecución.Boolean
una clase, ¿por qué el valor siempre es falso incluso si cambié el valor de otra clase que hace referencia a la misma variable booleana? ¿Cuál es el punto de estoBoolean
si no podemos hacer referencia a diferentes clases de instancia / pasar como argumento?AtomicBoolean
y hacer referencia a ella desde las clases de diferenciaEstoy extendiendo un poco las respuestas proporcionadas (ya que hasta ahora se concentran en su terminología "propia" / artificial centrándose en la programación de un lenguaje en particular en lugar de ocuparse de la imagen más amplia detrás de la escena de la creación de los lenguajes de programación , en general, es decir, cuando las cosas como las consideraciones de seguridad de tipo versus memoria hacen la diferencia):
int no es booleano
Considerar
con salida
El código Java en la tercera línea
(bar)?1:0
ilustra que la barra ( booleana ) no se puede convertir (convertir) implícitamente en un int . Menciono esto no para ilustrar los detalles de la implementación detrás de JVM, sino 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 sobre la seguridad de tipo. Especialmente si ese tipo de seguridad no se usa verdadera / totalmente como en los tipos booleanos donde los controles se realizan en forma deTodo 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} seguirá ocupando al menos un byte o una palabra (xbits dependiendo del tamaño del registro) a menos que esté especialmente cuidado (por ejemplo, bien guardado en la memoria - 8 "booleano" bits en 1 byte - adelante y atrás).
Al preferir la seguridad de tipo (como poner / envolver el valor en una caja de un tipo particular) sobre el empaquetado de valor adicional (por ejemplo, usar cambios de bits o aritmética), se elige escribir menos código en lugar de ganar más memoria. (Por otro lado, siempre se puede definir un tipo de usuario personalizado que facilitará toda la conversión que no valga más que booleana).
palabra clave versus tipo
Finalmente, su pregunta es sobre la comparación de palabras clave versus tipo . Creo que es importante explicar por qué o cómo exactamente obtendrá rendimiento al usar / preferir palabras clave ("marcadas" como primitivas ) sobre los tipos (clases compuestas definibles por el usuario normales que usan otra clase de palabras clave ) o en otras palabras
vs.
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 envolventes se puede traducir simplemente en un valor en línea (un LITERAL o una constante que se sustituye directamente por el compilador cada vez que es posible inferir la sustitución o, de lo contrario, recurrir al ajuste del valor).
La optimización se logra debido a trivial:
Es por eso que cuando se realiza la inferencia de tipo real, puede (todavía) terminar instanciando la clase de ajuste con toda la información de tipo si es necesario (o convertir / convertir en tal).
Entonces, la diferencia entre boolean y Boolean está exactamente en Compilation y Runtime (un poco lejos pero casi como una instancia de vs. getClass () ).
Finalmente, el autoboxing es más lento que los primitivos.
Tenga en cuenta que Java puede hacer autoboxing es solo un "azúcar sintáctico". No acelera nada, solo le permite escribir menos código. Eso es. Aún se realiza la conversión y el ajuste en el contenedor de información de tipo. Por razones de rendimiento, elija la aritmética, que siempre omitirá la limpieza adicional al crear instancias de clase con información de tipo para implementar la seguridad de tipo. La falta de seguridad de tipo es el precio que paga para obtener rendimiento. Para el código con expresiones de valor booleano, la seguridad de tipo (cuando escribe menos y, por lo tanto, código implícito ) sería crítica, por ejemplo, para los controles de flujo if-then-else.
fuente
Puede usar las constantes booleanas ,
Boolean.TRUE
y enBoolean.FALSE
lugar de0
y1
. Puede crear su variable a partir de tipoboolean
si primitivo es lo que busca. De esta manera no tendrás que crear nuevosBoolean
objetos.fuente
Básicamente, los booleanos representan un tipo de datos primitivo donde los booleanos representan un tipo de datos de referencia. Esta historia se inicia cuando Java quiere orientarse exclusivamente a los objetos. Se proporciona un concepto de clase envolvente para utilizar el tipo de datos primitivos.
b1
Yb2
no son lo mismo.fuente
Una observación: (aunque esto puede pensarse en el efecto secundario)
ser un booleano primitivo puede decir sí o no.
Boolean es un objeto (puede referirse a sí o no o 'no sabe', es decir, nulo)
fuente
Puede usar booleano / booleano. La simplicidad es el camino a seguir. Si no necesita una API específica (Colecciones, Streams, etc.) y no prevé que las necesitará, use una versión primitiva (booleana).
Con primitivas, garantiza que no pasará valores nulos.
No caerás en trampas como esta. El siguiente código arroja NullPointerException (de: booleanos, operadores condicionales y autoboxing ):
public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; }
Use booleano cuando necesite un objeto, por ejemplo:
fuente