J'ai étudié les types primitifs Java

introduction

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.

Identifier les modèles à comparer

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.

Vérifions! !!

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
}

Considération

À 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. .. ..

prime

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

J'ai étudié les types primitifs Java
Types primitifs Java, types de référence, immuable, mutable
A propos des types primitifs et des types de référence Java
À propos des types de données Java (en particulier des types primitifs) et des littéraux
J'ai d'abord touché Java ②
J'ai d'abord touché Java ③
J'ai d'abord touché Java ④
J'ai étudié l'automatisation des tests
Résumé de la spécialisation des primitives Java
J'ai d'abord touché Java
[Java] Principaux types de données
[Java] Types de variables et types
Types de données de base Java
J'ai résumé les types et les bases des exceptions Java
Comparaison équivalente de la classe wrapper Java et du type primitif
Ce que j'ai recherché sur Java 8
J'ai enquêté sur l'instance englobante.
J'ai commencé Java Gold (Chapitre 1-1)
Ce que j'ai recherché sur Java 6
Ce que j'ai recherché sur Java 9
À propos des types de chargeur de classe Java
J'ai pris Java SE8 Gold.
J'ai essayé Drools (Java, InputStream)
Ce que j'ai recherché sur Java 7
J'ai essayé d'utiliser Java REPL
[Java] J'ai essayé d'implémenter la combinaison.
Je ne suis pas sûr du traitement parallèle Java
J'ai étudié Randoop, un générateur de classe de test JUnit pour Java.
Je voulais penser avoir compris les types personnalisés d'Elm en Java
Générer un flux à partir d'un tableau de types primitifs en Java
Java Learning 1 (apprendre divers types de données)
J'ai étudié le constructeur (java)
J'ai essayé la métaprogrammation avec Java
Ce que j'ai recherché sur Java 5
J'ai envoyé un e-mail en Java
Déclaration, initialisation et types de variables Java
[Java] Types de base et notes d'instructions
Série Java Primer (variations et types)
J'ai créé un PDF avec Java.
J'ai créé une application shopify @java
Types de données de base et types de référence (Java)
J'ai vérifié Java Flight Recorder (JFR)
Tombé dans Java Silver (pleurant)
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
Les variables de tableau Java sont des types de référence
J'ai écrit le théorème de Gordobach en java
J'ai essayé le framework Java "Quarkus"
J'ai essayé d'utiliser l'API Java8 Stream
Ce que j'ai appris avec Java Gold
J'ai fait une annotation en Java.
J'ai essayé d'utiliser JWT en Java
J'ai essayé de résumer l'apprentissage Java (1)
Types de données de base et types de référence Java
Liste des types ajoutés dans Java 9
Ce que j'ai appris avec Java Silver
Ce que j'ai recherché sur l'apprentissage Java
J'ai essayé de résumer Java 8 maintenant
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai comparé Java et Ruby FizzBuzz.
[Java] Types d'exception et traitement de base