[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?

introduction

Merci pour votre visite. Pour la méthode equals () de Java, j'ai comparé le temps d'exécution avec et sans l'implémentation suivante qui renvoie immédiatement true si elles sont identiques.

// equals()Contrôle d'identité au début de
if (this == obj){
	return true;
}

Ikisatsu (désolé d'être long)

Je suis actuellement en formation de nouveau diplômé SE du SIer. C'est un peu ennuyeux parce que c'est basé sur l'hypothèse que vous êtes nouveau sur Java, mais c'est amusant. (Bien que j'aie un sentiment de crise que je dois étudier par moi-même même un peu dans l'intervalle de temps ...)

Maintenant, dans la formation, nous menons des exercices de développement. C'est comme une expérience de projet telle qu'une unité, un test d'intégration, la création d'un document de conception interne (spécification de composant) et un codage basé sur le document de conception externe créé.

Dans la conception interne, l'organigramme de la méthode est créé de manière à pouvoir être codé en fonction du nom de champ et du nom de méthode qui ont déjà été décidés. Quand j'ai commencé à travailler sur une certaine spécification DTO, il ** "Remplacer la méthode equals ()" ** Il y avait. Oh, ça continue ● Je viens de le faire dans un séminaire.

Remplacer la méthode equals ()

La méthode equals () est définie dans la classe Object comme suit.

	//Extrait du code source Java 11
	public boolean equals(Object obj) {
		return (this == obj);
	}

Cela renvoie simplement la similitude, vous devez donc l'implémenter correctement dans votre propre classe. Dans ce cas, l'équivalence est déterminée par les spécifications, donc par exemple, dans la classe self-made Person, même si le champ age est différent, si même le nom est le même, il est libre de juger de l'équivalence (si vous le souhaitez). キャプチャ.PNG

Et voici le sujet principal de cet article. La méthode equals () vérifie d'abord l'identité.

// equals()Contrôle d'identité au début de(Republier)
if (this == obj){
	return true;
}

Autrement dit, dans le cas de ```a.equals (a) `` `, true est renvoyé immédiatement. Ce n'est pas obligatoire, mais la génération automatique d'Eclipse indique qu'il est habituel de l'implémenter car elle a un impact sur les performances. Sans cela, il faudrait déterminer si le champ de a est égal au champ de a.

Quel est ce processus?

Lorsque j'ai créé un organigramme de la méthode equals () et l'ai soumis à l'instructeur qui jouait le rôle de PM, j'ai reçu le commentaire suivant sur la partie pertinente du traitement du contrôle d'identité. ** "Quel est ce processus?" ** Lors de l'implémentation de equals (), je pensais que c'était un processus à inclure, donc je ne pensais pas qu'il serait intriqué. Même si je le mets, je connais le concept de contrôle d'identité en lui-même, et si je précise que "cette fois c'est une petite échelle, un traitement tellement strict n'est pas nécessaire", je ne peux m'empêcher de "je ne connais pas un tel traitement, même sur le terrain Cela n'a pas de sens car je ne l'ai pas vu et les résultats renvoyés sont les mêmes. " Bien sûr, jusqu'à récemment, je suis étudiant et je ne sais rien du site, alors peut-être qu'il n'y a pas de contrôle d'identité dans le monde ...? Je suis devenu méfiant, et j'ai pensé que ce serait juste un fou d'écrire une logique redondante, alors j'ai écrit cet article. Pour le moment, si je peux réaliser les avantages du temps d'exécution, je gagnerai (forcé).

environnement

Windows10 Eclipse

Méthode

Utilisez le Person.java suivant. À l'origine, la méthode equals () de la classe Object devait être remplacée, mais à des fins de comparaison, nous avons créé equalsWithSelfCheck () avec contrôle d'identité et méthode equalsWithoutSelfCheck () sans contrôle d'identité et les avons comparées. Les deux sont basés sur la méthode equals () générée automatiquement par Eclipse.

Person.java


public class Person {

	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public boolean equalsWithoutSelfCheck(Object obj) {
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public boolean equalsWithSelfCheck(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

De plus, la différence de temps d'exécution est sortie avec les mêmes conditions dans le Main suivant. Il a été mesuré 10 fois à plusieurs reprises.

Main.java


public class Main {

	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<>();
		Person person = new Person("Taro", 20);

		//Une liste qui contient tous la même personne
		for(int i = 0; i < 10000000; i++) {
			list.add(person);
		}

		for (int i = 0; i < 10; i++) {
			long time1 = 0;
			long time2 = 0;

			for (Person p : list) {
				long start = System.nanoTime();
				person.equalsWithoutSelfCheck(p);
				long end = System.nanoTime();
				time1 = time1 + end - start;
			}

			for (Person p : list) {
				long start = System.nanoTime();
				person.equalsWithSelfCheck(p);
				long end = System.nanoTime();
				time2 = time2 + end - start;
			}

			System.out.println("Différence de temps d'exécution:" + (time1 - time2) * 0.000001 + "milliseconde");
		}
	}
}


résultat

Différence de temps d'exécution: 7.8233999999999995 millisecondes
Différence de temps d'exécution: 5.2443 millisecondes
Différence de temps d'exécution: 3.8985 millisecondes
Différence de temps d'exécution: 4.9727 millisecondes
Différence de temps d'exécution: 5.5971 millisecondes
Différence de temps d'exécution: 2.7468 millisecondes
Différence de temps d'exécution: 10.9687 millisecondes
Différence de temps d'exécution: 5.1853 millisecondes
Différence de temps d'exécution: 5.4607 millisecondes
Différence de temps d'exécution: 3.6744 millisecondes

Dans les deux cas, la méthode incluant le contrôle d'identité a donné des résultats plus rapides. Il existe quelques variantes. Comme l'ordre d'exécution peut en être la cause, j'ai essayé de changer l'ordre, mais la différence de temps d'exécution est devenue négative et la même conclusion a été tirée.

Au fait

J'ai également essayé les cas où le contenu de la liste est le même mais pas le même que celui indiqué ci-dessous.

		//Tous les éléments ont la même valeur(Pas le même)liste
		for(int i = 0; i < 10000000; i++) {
			list.add(new Person("Taro", 20));
		}

En conséquence, il n'y avait pas de différence de temps d'exécution moyenne comme indiqué ci-dessous.

Différence de temps d'exécution: 3.5603 millisecondes
Différence de temps d'exécution:-0.223 millisecondes
Différence de temps d'exécution: 1.0935 millisecondes
Différence de temps d'exécution: 0.5618 millisecondes
Différence de temps d'exécution:-0.006999999999999999 millisecondes
Différence de temps d'exécution:-1.4681 millisecondes
Différence de temps d'exécution:-0.8628 millisecondes
Différence de temps d'exécution: 1.5103 millisecondes
Différence de temps d'exécution:-1.9932999999999998 millisecondes
Différence de temps d'exécution: 0.3394 millisecondes

De là, il a été confirmé que le contrôle d'identité dans la méthode equals () contribue suffisamment à la performance.

Conclusion

Il a été confirmé que le contrôle d'identité dans la méthode equals () a suffisamment contribué à la performance, et il s'est avéré être une mise en œuvre utile. (Ma victoire (?))

à la fin

Jusqu'à la fin Merci d'avoir lu. Si vous avez des questions, faites-le nous savoir et donnez-nous vos conseils.

Recommended Posts

[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Quelle est la méthode principale en Java?
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Fonction statique pour vérifier si l'erreur RVB de BufferdImage est dans le rapport spécifié en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
L'ordre des modificateurs de méthode Java est fixe
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
Est-il courant de ne pas écrire la balise de fermeture de la balise <P> dans Javadoc?
[Java] Mémo de méthode d'implémentation pour définir le jeton de nom d'utilisateur WS-Security dans SOAP Stub of axis2
Implémentation Java de tri-tree
Comment obtenir le nom d'une classe / méthode exécutée en Java
Un moyen simple de vérifier la liste des méthodes / champs dans Java REPL
Créer une méthode pour renvoyer le taux de taxe en Java
Comment dériver le dernier jour du mois en Java
[Ruby] Penser quand il n'y a pas de récepteur devant la méthode (ça ressemble à)
Implémentation d'une fonction similaire en Java
Appelez la super méthode en Java
Il ne répond pas à la description en .js du fichier packs
[Note] Java: est-il nécessaire de remplacer les égaux pour le jugement d'égalité?
Comment vérifier le contenu de la chaîne de caractères java de longueur fixe
Méthode d'enquête lorsque le processeur du serveur exécutant java est lourd
Comment obtenir la longueur d'un fichier audio avec Java
Comment incrémenter la valeur de Map sur une ligne en Java
Emplacement de la définition de la méthode Résumé de la vérification Lorsque défini dans le projet et Rails / Gem
Représentez graphiquement les informations du capteur de Raspberry Pi en Java et vérifiez-les avec un navigateur Web
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~
Mes réflexions sur la méthode d'égalité (Java)
Obtenez le résultat de POST en Java
Comment créer un retrait de deux espaces d'un octet dans l'implémentation JAXB du JDK
Vérifiez le contenu du magasin de certificats Java
Référence Java à comprendre dans la figure
L'histoire de l'oubli de fermer un fichier en Java et de l'échec
[Java] Résumez comment comparer avec la méthode equals
[Servlet Java] La route de Senri est également une étape vers la première
L'identité des paramètres de rails [: id]
Mémo: [Java] Vérifiez le contenu du répertoire
Mémo: [Java] Si un fichier se trouve dans le répertoire surveillé, traitez-le.
Obtenez le type d'un élément d'un tableau pour déterminer s'il s'agit d'un tableau
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
Comparaison des méthodes d'implémentation de thread en Java et de la méthode d'expression lambda
Comment trouver le nombre total de pages lors de la pagination en Java
Comment obtenir la date avec Java
Sortie du livre "Introduction à Java"
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
[Java] Affiche le résultat de ffprobe -show_streams dans JSON et mappe-le à un objet dans Jackson
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
L'histoire de l'écriture de Java dans Emacs
Développement Android, comment vérifier null dans la valeur de l'objet JSON
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] Vérifiez si la chaîne de caractères est composée uniquement de blancs (= Vierge)
Qu'est-ce que CHECKSTYLE: OFF trouvé dans la source Java? Checkstyle à savoir de
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?
Quand j'ai voulu créer une méthode pour Premium Friday, c'était déjà dans l'API standard Java 8
J'ai reçu les données du voyage (application agenda) en Java et j'ai essayé de les visualiser # 001
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
AndroidStudio Faisons référence au C ++ dans le module des autres projets (Java / kotlin)
Valider le jeton d'ID d'un utilisateur authentifié par AWS Cognito en Java
Récupérer le premier jour de la semaine dans les paramètres régionaux actuels (quel jour est-il aujourd'hui?)