Lorsque j'utilise Java au travail, j'utilise souvent des égaux pour l'évaluation d'équivalence. Quand j'étais un nouveau venu, j'ai entendu dire que "les équivalents utilisent les égaux!" Cependant, il s'agit d'une histoire de types d'objets tels que le type String.
Ici, je m'inquiétais des int / Integer et long / Long qui ont des types primitifs. La question s'est posée: "Le type long est un type d'objet, vous ne pouvez donc pas comparer en utilisant == normalement?"
C'est une question simple, alors j'ai essayé de la vérifier.
La cible est un type Long avec un type primitif et la méthode de comparaison utilise uniquement ==. Cela ressemble à spécifier une instance de type Long sur le côté gauche et un type Long sur le côté droit de différentes manières. En outre, une comparaison entre la constante longue et le type Long. Cela peut être insatisfaisant car c'est juste le modèle que j'ai trouvé rapidement.
La vérification a été confirmée en exécutant la méthode suivante sur Junit4. Je pense que cela ne dépend pas de la version, mais j'ai utilisé Java 8 au cas où. Certains ont été vérifiés en partant du principe que "le type long est un type d'objet".
@Test
public void testEqualsMethod() {
Long value1 = 100L;
//Le type long créé par l'une ou l'autre méthode est évalué comme équivalent
assertTrue(value1==100L); // (1)
assertTrue(value1==Long.parseLong("100")); // (2)
assertTrue(value1==Long.valueOf("100")); // (3)
assertTrue(value1==Long.valueOf(100)); // (4)
assertTrue(100L==Long.parseLong("100")); // (5)
assertTrue(100L==Long.valueOf(100)); // (6)
Long value2 = value1; //Si le type Long est un type d'objet
++value2; //Si vous modifiez la valeur de valeur2, la valeur de valeur1 doit également changer....
assertTrue(100L==value1); //Mais value1 ne change pas
assertTrue(101L==value2); //value2 est fortement augmentée de 1
assertTrue(value1!=value2); //Bien sûr, les objets sont différents...Semble être
}
À partir de la méthode de test ci-dessus, il a été constaté que l'évaluation d'équivalence peut être effectuée en utilisant == lorsque le type Long est généré par n'importe quelle méthode. Cependant, le sentiment de "type long-> type d'objet-> égal est égal" ne disparaît pas ... Il a également été constaté que même si le type Long est affecté à un autre objet, il n'y a aucun comportement partagé par le type d'objet. En d'autres termes, le type Long est créé en tant qu'objet différent lorsqu'il est affecté à une autre variable.
Ce résultat peut être dit pour des types Integer similaires. Cependant, dans le type Double et le type Float, l'évaluation était NG probablement parce que valueOf () a renvoyé le type d'objet dans les méthodes de test (3) et (4). (Au contraire, je me demande pourquoi le type Long et le type Integer sont devenus True par valueOf () ...)
Comme point à noter lors de la définition de "xxx == Xxx.parseXxx ()" ou "xxx == Xxx.valueOf ()", il s'agit d'un type entier ou d'un type fraction. Ainsi, le tableau ci-dessous montre s'ils sont équivalents ou non.
Moule | Xxx.parseXxx() | Xxx.valueOf() |
---|---|---|
Long | Possible | Possible |
Integer | Possible | Possible |
Double | Possible | 不Possible |
Float | Possible | 不Possible |
En fait, la méthode de test (5) est une comparaison entre les types primitifs, et (1), (2) et (6) sont des comparaisons équivalentes de [type primitif] == [type d'objet]. Par conséquent, il est possible que "N'est-ce pas vrai?"
Si cela est laissé tel quel, il sera glissé et déplacé, donc je voudrais examiner cette question à un autre moment. Il est ouvert une fois. .. ..
Je voulais également confirmer la nature de l'autoboxing, j'ai donc expérimenté la méthode de test suivante. C'est comme préparer une méthode avec un argument de type Object et lancer diverses valeurs dans la méthode pour voir quel type de classe il s'agira. (Environnement de vérification: Java8, JUnit4)
@Test
public void testAutoBoxing() {
//Une classe qui ne renvoie que le nom de classe de l'argument
class AutoBoxingTester {
public String get(Object obj) {
return obj.getClass().getName();
}
};
AutoBoxingTester tester = new AutoBoxingTester();
//J'ai essayé d'introduire diverses valeurs
assertEquals(Integer.class.getName(), tester.get(100));
assertEquals(Long.class.getName(), tester.get(100L));
assertEquals(String.class.getName(), tester.get("str"));
assertEquals(Float.class.getName(), tester.get(3.14f));
assertEquals(Double.class.getName(), tester.get(6.0e23));
}
Recommended Posts