JavaRush /Blog Java /Random-FR /Pause café #176. Similitudes et différences entre Array e...

Pause café #176. Similitudes et différences entre Array et ArrayList. Comment écrire une méthode equals() efficace

Publié dans le groupe Random-FR

Similitudes et différences entre Array et ArrayList

Source : Medium Cet article se concentre sur la compréhension des concepts de Array et ArrayList et des différences entre eux. Pause café #176.  Similitudes et différences entre Array et ArrayList.  Comment écrire une méthode equals() efficace - 1

Tableau Java

Un tableau est une structure de données qui permet de stocker une séquence ordonnée de valeurs du même type. Par exemple, vous pouvez créer un tableau de caractères, de nombres, etc. Cela s'applique à tous les types primitifs et même aux objets comme String . Une fois le tableau créé, nous ne pouvons pas modifier sa taille. Voici un exemple général de déclaration d'une variable de référence de tableau et d'allocation du tableau :
dataType[] arrayName = new dataType[numElements];
Si nous essayons d'ajouter plus que la taille du tableau, nous obtenons une ArrayIndexOutOfBoundsException .

Déclaration de tableau

Pour déclarer un tableau, utilisez les caractères [ ] après le type de données. Ils indiquent que la variable est une référence à un tableau. Une variable de référence de tableau peut faire référence à des tableaux de différentes tailles. Le mot-clé new crée de l'espace en mémoire pour stocker un tableau avec un nombre spécifié d'éléments. Une variable de référence de tableau est affectée pour faire référence à ce tableau nouvellement alloué. L'exemple suivant déclare une variable de référence de tableau gameScores , alloue un tableau de quatre entiers et attribue des gameScores pour faire référence au tableau alloué.
int[] gameScores = new int[4];
Les éléments du tableau sont automatiquement initialisés aux valeurs par défaut lorsque vous utilisez le mot-clé new pour initialiser une référence de tableau. La valeur par défaut des éléments de type de données entier et à virgule flottante est zéro et la valeur par défaut des éléments booléens est false . Vous pouvez également déclarer une variable de référence de tableau sans allouer immédiatement le tableau, puis affecter la variable avec le tableau alloué.
int[] gameScores;

gameScores = new int[4];

Initialisation d'un tableau avec des valeurs autres que celles par défaut

Vous pouvez initialiser des éléments du tableau avec des valeurs autres que celles par défaut en spécifiant les valeurs initiales entre accolades {} séparées par des virgules.
int [] myArray = { 5 , 7 , 11 };
L'exemple ci-dessus crée un tableau de trois éléments entiers avec les valeurs 5, 7 et 11. Cette initialisation de tableau ne nécessite pas l'utilisation du mot-clé new car la taille du tableau est automatiquement définie sur le nombre d'éléments dans le accolades. Pour les grands tableaux, l'initialisation peut être effectuée en définissant d'abord le tableau, puis en utilisant une boucle pour attribuer les éléments du tableau. Les éléments du tableau sont accessibles à l'aide de leurs indices de base zéro.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

Liste des tableaux

Une ArrayList est une liste ordonnée d'éléments d'un type de référence redimensionnable . Il s'agit également d'une classe du package java.util appartenant au Java Collection Framework. ArrayList nous fournit des tableaux dynamiques et gère automatiquement leur redimensionnement. À mesure que vous ajoutez des éléments à ArrayList, sa taille de mémoire augmente automatiquement. Vous pouvez utiliser une ArrayList en utilisant l' importation java.util.ArrayList ; . Nous pouvons également créer une instance ArrayList à l'aide de l'instruction suivante :
ArrayList<Type> arrayList = new ArrayList<Type>();
La ArrayList peut augmenter en taille pour s'adapter aux éléments dont elle a besoin. ArrayList ne prend pas en charge les types primitifs tels que int , mais plutôt les types de référence tels que Integer . Une erreur courante chez les débutants est de déclarer une ArrayList d'un type primitif tel que int , comme dans ArrayList<int> myVals . Cela entraîne une erreur de compilation : « type inattendu, trouvé : int, requis : référence ». Exemple : Créons un objet ArrayList nommé cars , qui stockera les chaînes :
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
Pour ajouter des éléments à une ArrayList , utilisez la méthode add() . Pour accéder à un élément d' une ArrayList , la méthode get() est utilisée .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
La différence entre un tableau intégré et une ArrayList en Java est que dans le premier cas, la taille du tableau ne peut pas être modifiée (si vous souhaitez ajouter ou supprimer des éléments dans/du tableau, vous devez en créer un nouveau). ). Alors que dans une ArrayList , des éléments peuvent être ajoutés et supprimés à tout moment.

Similitudes entre Array et ArrayList

  • Array et ArrayList sont utilisés pour stocker des éléments.
  • Array et ArrayList peuvent stocker des valeurs nulles.
  • Les deux processus se déroulent en temps constant.
  • Ils peuvent avoir des valeurs en double.
  • Array et ArrayList ne garantissent pas la présence d'éléments ordonnés.

Principales différences entre Array et ArrayList

La principale différence entre un tableau ( Array ) et un ArrayList est la nature statique d'un tableau et la nature dynamique d'un ArrayList . Une fois créé, vous ne pouvez pas modifier la taille du tableau, alors qu'un ArrayList peut modifier sa taille selon vos besoins. Une autre différence importante est qu'un tableau est une fonctionnalité de base fournie par Java. D'un autre côté, ArrayList fait partie du framework de collections en Java. Nous pouvons accéder aux éléments d'un tableau à l'aide d'un crochet dans lequel nous pouvons spécifier un index. Bien qu'il existe un ensemble de méthodes pour accéder aux éléments de l'ArrayList et les modifier. Même s’ils sont différents, tous deux sont néanmoins comparables à d’autres égards. Ces deux structures de données en Java sont basées sur des index et vous permettent de stocker des objets. De plus, ils autorisent les valeurs nulles et les doublons. Si vous connaissez à l'avance la taille des objets, il est préférable d'utiliser un tableau. Mais si vous n'êtes pas sûr de la taille, vous devriez plutôt utiliser ArrayList .

Comment écrire une méthode equals() efficace

Source : Medium Cet article vous aidera à mieux comprendre l'utilisation de la méthode equals() lorsque vous travaillez avec du code Java. Si nous parlons de la méthode par défaut equals() et sans aucune implémentation, alors elle est à bien des égards similaire à l' opération == . Autrement dit, cette méthode compare les objets. Par exemple, equals() compare deux chaînes et renvoie vrai si les chaînes sont égales et faux si elles ne le sont pas. Veuillez noter que l' opérateur == n'est pas recommandé pour comparer des objets en Java. La raison en est que lors de la comparaison d'objets, == ne retournera vrai que si les références pointent vers le même objet. Le moyen le plus simple d'éviter les problèmes est de ne pas remplacer la méthode equals , auquel cas chaque instance de la classe n'est égale qu'à elle-même. Vous n'avez besoin de remplacer égal que lorsque la classe a un concept d' égalité logique différent de la simple identité de l'objet et que la superclasse n'a pas encore remplacé l'égalité. Ainsi, lorsque vous utilisez la méthode equals() , vous devez savoir si les références d'objet sont logiquement équivalentes et si elles font référence au même objet.

Propriétés de la méthode égale

Chaque méthode égale implémente une relation d'équivalence . Il possède les propriétés suivantes :
  • Réflexif : pour toute valeur de référence non nulle x, x.equals (x) doit renvoyer true .

  • Symétrique : Pour toutes les valeurs de référence non nullesx et y , x.equals(y) doit renvoyer true uniquement si y.equals(x) renvoie true .

  • Transitif : Pour toute valeur de référence non nulle x , y , z , si x.equals(y) renvoie true et y.equals(z) renvoie true , alors x.equals(z) doit également renvoyer true .

  • Cohérent : pour toutes les valeurs de référence non nulles x et y, plusieurs appels à x.equals(y) doivent systématiquement renvoyer true ou systématiquement renvoyer false .

  • Non-nullité : Pour toute valeur de référence non nulle x, x.equals (null) doit renvoyer false .

Examinons de plus près chaque propriété :

Réflexivité :

Un objet doit être égal à lui-même. Pour vérifier cela, ajoutez une instance de votre classe à la collection. La méthode contain peut très bien indiquer que la collection ne contient pas l'instance que vous venez d'ajouter.

Symétrie:

Deux objets (ils peuvent appartenir à des classes différentes) doivent être égaux l’un à l’autre.

Sous-séquence :

N'écrivez pas une méthode égale qui dépend de ressources peu fiables/volatiles.

Non nul :

Renvoie toujours true si l'objet passé à égal est null .

Résumons :

Voici une recette pour une méthode de qualité égale :
  1. Utilisez l' opérateur == pour tester si un argument est une référence à cet objet.

  2. Utilisez l' opérateur instanceof pour vérifier si un argument est du type correct.

  3. Convertissez l’argument dans le type correct.

  4. Pour chaque champ « significatif » d'une classe, vérifiez si ce champ d'argument correspond au champ correspondant de cet objet :

    • Pour les champs primitifs : dont le type n'est pas float ou double , utilisez l' opérateur == pour les comparaisons.
    • Pour les champs de référence d'objet : appelez la méthode equals de manière récursive ; pour les champs à virgule flottante, utilisez la méthode statique Float.compare(float, float); et pour les champs doubles, utilisez Double.compare(double, double) .
    • Pour les champs de tableau : appliquez ces directives à chaque élément. Si chaque élément d'un champ de tableau est significatif, utilisez l'une des méthodes Arrays.equals() .
    • Certains champs de référence d'objet peuvent contenir des valeurs nulles . Pour éviter de lancer une NullPointerException , vérifiez l'égalité de ces champs à l'aide de la méthode statique Objects.equals(Object, Object) .
  5. Lorsque vous avez fini d'écrire votre méthode égale , posez-vous trois questions : est-elle symétrique ? Est-ce transitif ? Est-il cohérent ?

Et rappelez-vous, remplacez toujours hashCode lorsque vous remplacez equals .
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION