Maison Java javaDidacticiel Détails auxquels il faut prêter attention dans la programmation Java

Détails auxquels il faut prêter attention dans la programmation Java

Jul 18, 2018 am 11:40 AM

Comme le dit le proverbe : « Les détails déterminent le succès ou l'échec », et cela est particulièrement vrai pour la programmation.

Récemment, j'ai participé à un projet qui m'a fait prendre conscience de cela profondément.

Ce projet fait partie du système de recommandation. La partie dont je suis responsable est la programmation MapRedcue pour calculer la similarité entre les vidéos ! Un autre collègue a utilisé Sqoop pour importer les résultats que j'ai calculés dans la base de données pour les appels en ligne.

Pendant le processus d'importation de données, une exception java.lang.NumberFormatException se produit toujours. Je pense que c'est la raison pour laquelle son Sqoop ne filtre pas les lignes vides ou les espaces. Mon résultat de similarité n'est pas faux. Plus tard, il a copié une partie des résultats de similarité dans le Bloc-notes et a découvert que certaines données comportaient des espaces. Il les a lues directement puis les a converties, mais bien sûr, quelque chose s'est mal passé. Je ne sais pas si Sqoop peut filtrer les espaces, mais mon programme peut contrôler les résultats de sortie, j'appelle donc la méthode trim() de la classe java.lang.String pour chaque résultat de sortie. Finalement, le problème est résolu.

Les espaces posent toujours quelques problèmes mineurs, mais ils ne peuvent être ignorés. Pour éliminer les espaces, pensez à appeler la méthode trim().

Un autre problème est que lors de la comparaison des classes d'encapsulation de types de données de base, il se peut que ce ne soient pas les valeurs numériques qui sont comparées, mais les adresses mémoire !

Dans le processus de calcul de similarité, il existe un endroit où un jugement d'égalité entre les types java.lang.Long est requis. Lorsque j’ai découvert que le résultat final de similarité était incorrect, j’ai enquêté sur la cause et j’ai finalement atterri ici. Le code original est comme ceci :

if(lg1 == lg2){
    return true;
}
Copier après la connexion

lg1 et lg2 sont tous deux de type java.lang.Long Ici, je veux déterminer si les valeurs​​de lg1 et lg2 sont égales. Je me souvenais seulement qu'en général, les classes encapsulées de Java effectueraient une conversion lors de la comparaison, alors je l'ai écrit comme ça ! Mais l'écrire de cette façon peut aussi être relativement important, non pas la valeur numérique, mais leurs adresses respectives en mémoire.

J'ai recherché cette question sur Google. Il a été dit en ligne que le type java.lang.Float et le type java.lang.Double utilisent "==" pour porter des jugements d'égalité et doivent être convertis en données de base. types, java.lang.Integer. et java.lang.Long n'ont pas besoin d'être convertis, Java les convertira automatiquement. Cependant, mes propres tests contredisent cette affirmation. Voici le code du test :

package org.jindao.basic;

/**
 * @author 
 * @date 2013年10月25日 上午7:30:47
 */
public class BasicTest {
	public static void main(String[] args) {
		Integer ig1 = 3;
		Integer ig2 = 3;
		System.out.println("Integer ig1 = 3,Integer ig2 = 3  ig1==ig2的结果为:"+(ig1==ig2));
		
		Integer ig3 = new Integer(3);
		Integer ig4 = new Integer(3);
		System.out.println("Integer ig3 = new Integer(3),Long ig4 = new Integer(3) ig3==ig4的结果为:"+(ig3==ig4));
		
		Long lg1 = 3l;
		Long lg2 = 3l;
		System.out.println("Long lg1 = 3l,Long lg2 = 3l lg1==lg2的结果为:"+(lg1==lg2));
		
		Long lg3 = new Long(3);
		Long lg4 = new Long(3);
		System.out.println("Long lg3 = new Long(3),Long lg4 = new Long(3) lg3==lg4的结果为:"+(lg3==lg4));
		
		Float flt1 = 3.2f;
		Float flt2 = 3.2f;
		System.out.println("Float flt1 = 3.2f,Float flt2 = 3.2f  flt1==flt2的结果为:"+(flt1==flt2));
		
		Float flt3 = new Float(3.2);
		Float flt4 = new Float(3.2);
		System.out.println("Float flt3 = new Float(3.2),Float flt4 = new Float(3.2)) flt3==flt4的结果为:"+(flt3==flt4));
		
		Double db1 = 3.2;
		Double db2 = 3.2;
		System.out.println("Double db1 = 3.2,Double db2 = 3.2 db1==db2的结果为:"+(db1==db2));
		
		Double db3 = new Double(3.2);
		Double db4 = new Double(3.2);
		System.out.println("Double db3 = new Double(3.2),Double db4 = new Double(3.2) db3==db4的结果为:"+(db3==db4));
	}
}
Copier après la connexion

Résultats d'exécution :

Integer ig1 = 3,Integer ig2 = 3  ig1==ig2的结果为:true
Integer ig3 = new Integer(3),Long ig4 = new Integer(3) ig3==ig4的结果为:false
Long lg1 = 3l,Long lg2 = 3l lg1==lg2的结果为:true
Long lg3 = new Long(3),Long lg4 = new Long(3) lg3==lg4的结果为:false
Float flt1 = 3.2f,Float flt2 = 3.2f  flt1==flt2的结果为:false
Float flt3 = new Float(3.2),Float flt4 = new Float(3.2)) flt3==flt4的结果为:false
Double db1 = 3.2,Double db2 = 3.2 db1==db2的结果为:false
Double db3 = new Double(3.2),Double db4 = new Double(3.2) db3==db4的结果为:false
Copier après la connexion

Comme le montrent les résultats, uniquement lorsque les types Integer et Long se voient attribuer des valeurs directement, utilisez "== "Ce ne sera vrai que lorsqu'il sera jugé égal, et ce sera faux dans les autres cas.

C'est-à-dire que le reste des cas concerne principalement l'adresse où la variable est stockée dans la mémoire, et non la valeur de la variable.

Alors pourquoi les types Integer et Long attribuent-ils directement des valeurs​​et le résultat est vrai, alors que les types Float et Double attribuent directement des valeurs​​et le résultat est faux ? Je suppose que Java lui-même a des mesures d'optimisation, c'est-à-dire que lors de l'attribution directe de valeurs aux types Integer et Long, les objets de types Integer et Long ne sont pas créés dans la mémoire, mais sont directement optimisés pour les types de données de base int et long, donc "= est utilisé. =" Le résultat ne sera vrai que s'ils sont égaux.

Par souci de sécurité, pour juger que les valeurs des variables de classe encapsulées sont égales, il est préférable de retirer directement les valeurs​​pour le jugement "==", ou d'utiliser les égaux méthode, c'est-à-dire

lg1.equals(lg2)
Copier après la connexion

Comme ces petits détails, s'ils ne sont pas compris, peuvent causer des problèmes à un moment donné.

Les détails déterminent le succès ou l'échec. Il y a de nombreux détails auxquels il faut prêter attention dans la programmation Java. Nous n'en discuterons qu'un ou deux ici.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Apr 19, 2025 pm 04:51 PM

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Apr 19, 2025 pm 06:21 PM

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Apr 19, 2025 pm 11:42 PM

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Apr 19, 2025 pm 11:30 PM

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Apr 19, 2025 pm 11:45 PM

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Comment convertir en toute sécurité les objets Java en tableaux? Comment convertir en toute sécurité les objets Java en tableaux? Apr 19, 2025 pm 11:33 PM

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Comment obtenir élégamment les conditions de requête de création de nom de variable de classe d'entité lors de l'utilisation de tkmybatis pour la requête de base de données? Comment obtenir élégamment les conditions de requête de création de nom de variable de classe d'entité lors de l'utilisation de tkmybatis pour la requête de base de données? Apr 19, 2025 pm 09:51 PM

Lorsque vous utilisez TkMyBatis pour les requêtes de base de données, comment obtenir gracieusement les noms de variables de classe d'entité pour créer des conditions de requête est un problème courant. Cet article épinglera ...

Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Apr 19, 2025 pm 11:36 PM

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...

See all articles