Cuál es la diferencia entre estos dos :

java.util.Date obj1;
java.util.Date obj2;

obj1.equals(obj2)
obj1.getTime() == (obj2.getTime())

¿Tiene alguna diferencia de milisegundos?

0
abc 8 feb. 2015 a las 11:17

6 respuestas

La mejor respuesta

Consulte la implementación de Date#equals:

947     public boolean equals(Object obj) {
948         return obj instanceof Date && getTime() == ((Date) obj).getTime();
949     }

Se compara usando el método getTime.

Date#getTime devuelve el "número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT", no puede usar equals en él ya que es un long, vea su firma:

public long getTime()

Así que simplemente deberías:

obj1.equals(obj2)

O usando el operador == para comparar el valor devuelto por getTime.

2
Maroun 8 feb. 2015 a las 08:20

El primero se compara con Dates. el segundo no se compila, porque long (es devuelto por getTime()) es un tipo primitivo y no se puede llamar a method en un tipo primitivo.

0
Jens 8 feb. 2015 a las 08:20

El segundo causará un error del compilador. :)

java.util.Date.getTime() devuelve la primitiva long y no el tipo de objeto Long. No puede invocar métodos en un tipo primitivo. Está buscando, Long.compare(obj1.getTime(),obj2.getTime()) que devolverá 0 si ambos son iguales. Alternativamente, también se puede usar Long.valueOf(obj1.getTime()).equals(Long.valueOf(obj2.getTime()). Ambos convierten long en Long antes de invocar los métodos.

En segundo lugar, en este caso particular, ambos enfoques no darán lugar a resultados diferentes. '.equals ()' está destinado a verificar si dos objetos son significativamente iguales entre sí. A diferencia de java.util.Date que está representado por un solo número long, ciertas clases pueden tener su igualdad definida por valores de más de una propiedad. Por ejemplo, en una clase Casa, la igualdad se definirá por la suma de la dirección, la ciudad, el código postal y el país. En tal caso, .equals() será el único enfoque para la igualdad.

0
Nibras Reeza 8 feb. 2015 a las 10:28
Date date1 = new Date();
Date date2 = new Date();

Case1: date2.getTime == date1.getTime Esta comparación en particular compara el número de milisegundos transcurridos desde 1970 hasta la instancia de ambos objetos de fecha. El tipo de datos será primitivo long.

Case2: date2.equals(date1) Esta comparación en particular hace lo siguiente,

public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); }

Es decir, case2 también compara el número de milisegundos transcurridos desde 1970 con una verificación adicional de si la fecha comparable es una instancia del objeto Date.

0
Ankur Piyush 8 feb. 2015 a las 08:39

El método equals definido en {{X1} } solo comprueba si getTime() devuelve lo mismo para ambos objetos. Entonces, realmente no debería ser diferente entre usar equals y verificar los valores de getTime() usted mismo. Si todas las bibliotecas estuvieran escritas con sensatez, no las habría.

Sin embargo, al menos una subclase de Date (java.sql.Timestamp) anula equals y cambia su significado para que sea inconsistente con su clase base. Entonces, si uno de sus objetos Date resultara ser un Timestamp, entonces su método equals podría producir un resultado diferente .

0
khelwood 8 feb. 2015 a las 08:27

obj1.getTime().equals(obj2.getTime()) can't compile, as Date # getTime returns a primitive long` que no tiene ningún método.

Si, por otro lado, dijera obj1.getTime() == obj2.getTime(), entonces ninguna de las declaraciones sería diferente a como usa el método Date#equals ...

return obj instanceof Date && getTime() == ((Date) obj).getTime();
0
MadProgrammer 8 feb. 2015 a las 08:25