Comparación de valor entero

Soy un codificador novato de Java y acabo de leer una variable de una clase entera que se puede describir de tres maneras diferentes en la API. Tengo el siguiente código:

if (count.compareTo(0)) { 
            System.out.println(out_table);
            count++;
    }

Esto está dentro de un bucle y solo salidas out_table.
Mi objetivo es descubrir cómo ver si el valor es entero count > 0.

Me doy cuenta de que count.compare(0)es la forma correcta? o es count.equals(0)?

Sé que count == 0es incorrecto. ¿Es esto correcto? ¿Hay un operador de comparación de valores donde sea justo count=0?

Respuesta 1

Para averiguar si un Integeres mayor que 0, puede:

  • compruebe si compareTo(O)devuelve un número positivo:

    if (count.compareTo(0) > 0)
         ...
    

    Pero eso se ve bastante tonto, ¿no? Mejor solo ...

  • usar autoboxing 1 :

    if (count > 0)
        ....
    

    Esto es equivalente a:

    if (count.intValue() > 0)
        ...
    

    Es importante tener en cuenta que " ==" se evalúa así, con el Integeroperando sin caja en lugar del intoperando en caja. De count == 0lo contrario, devolvería falso cuando countse inicializó como new Integer(0)(porque " ==" prueba la igualdad de referencia).

1 Técnicamente, el primer ejemplo usa autoboxing (antes de Java 1.5 no se podía pasar inta compareTo) y el segundo ejemplo usa unboxing . La característica combinada a menudo se llama simplemente "autoboxing" para abreviar, que a menudo se extiende para llamar a ambos tipos de conversiones "autoboxing". Pido disculpas por mi uso laxo de la terminología.

Respuesta: 2

Es mejor evitar el autoboxing innecesario por 2 razones.

Por un lado, es un poco más lento que int < int, ya que (a veces) estás creando un objeto adicional;

void doSomethingWith(Integer integerObject){ ...
  int i = 1000;
  doSomethingWith(i);//gets compiled into doSomethingWith(Integer.valueOf(i));

El problema más grande es que el autoboxing oculto puede ocultar excepciones:

void doSomethingWith (Integer count){
  if (count>0)  // gets compiled into count.intValue()>0

Llamar a este método con nullarrojará un NullPointerException.

La división entre primitivas y objetos de envoltura en Java siempre se describió como un desafío para la velocidad. Autoboxing casi oculta esto, pero no del todo: es más limpio solo para realizar un seguimiento del tipo. Entonces, si tiene un objeto Integer, simplemente puede llamar compare()o intValue(), y si tiene el primitivo, simplemente verifique el valor directamente.

Respuesta: 3

También puedes usar iguales:

 Integer a = 0;

 if (a.equals(0)) {
     // a == 0
 }

que es equivalente a:

 if (a.intValue() == 0) {
     // a == 0
 }

y también:

 if (a == 0) {

 }

(el compilador de Java agrega automáticamente intValue ())

Tenga en cuenta que autoboxing / autounboxing puede introducir una sobrecarga significativa (especialmente dentro de los bucles).

Respuesta: 4

Aunque ciertamente podría usar el compareTométodo en una instancia de Integer, no está claro al leer el código, por lo que probablemente debería evitar hacerlo.

Java le permite usar autoboxing (consulte http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html ) para comparar directamente con un int, para que pueda hacer:

if (count > 0) { }

Y la Integerinstancia countse convierte automáticamente en un intpara la comparación.

Si tienes problemas para entender esto, mira el enlace de arriba, o imagina que está haciendo esto:

if (count.intValue() > 0) { }
Respuesta: 5

public static boolean checkTimeFormat (String str) {try {SimpleDateFormat sdf = new SimpleDateFormat ("aaaa-MM-dd HH: mm: ss"); sdf.parse (str); volver verdadero; } captura (...

Estoy tratando de agregar un icono a una columna JTable particular especificando mi propio renderizador de celdas de tabla como se muestra a continuación (basado en partes de este tutorial): la clase pública MyTableCellRenderer se extiende ...

Llamo a un servicio que devuelve fechas GMT. Ha estado funcionando bien desde noviembre, pero ahora con el horario de verano activo, está fallando. Aquí hay una fecha de muestra del horario de verano: 2011-12 -...

Me gustaría crear un DateTimeFormatter que acepte diferentes tipos de formatos como: "2018", "2018-01-02" o "2018-01-02 10:15". Intenté construirlo así: DateTimeFormatter f1 = new ...