Les types de données en Java peuvent être divisés en deux catégories :
1. Types de données de base, également appelés types de données primitifs. Pour comparer byte, short, char, int, long, float, double, boolean, utilisez le double signe égal (==) et comparez leurs valeurs.
2. Types de données composites (classes) Lorsqu'ils sont comparés à l'aide de (==), ils sont comparés à leurs adresses de stockage en mémoire. Par conséquent, à moins qu'il ne s'agisse du même nouvel objet, le résultat de leur comparaison est vrai, sinon la comparaison. le résultat est faux. Toutes les classes de JAVA héritent de la classe de base Object. La classe de base dans Object définit une méthode égale. Le comportement initial de cette méthode est de comparer les adresses mémoire des objets. Cependant, dans certaines bibliothèques de classes, cette méthode est remplacée, comme String. , Integer et Date, est égal à sa propre implémentation dans ces classes, au lieu de comparer l'adresse de stockage de la classe dans la mémoire tas. Pour une comparaison égale entre les types de données composites, sans remplacer la méthode égale, la comparaison entre eux est toujours basée sur la valeur d'adresse de leur emplacement de stockage en mémoire, car la méthode égale de Object utilise également un double signe égal ( ==) est comparée , donc le résultat de la comparaison est le même que le résultat du double signe égal (==).
Copiez le code comme suit :
classe publique TestString {
publicstaticvoid main(String[] arguments) {
Chaîne s1="Lundi" ;
Chaîne s2="Lundi" ;
si (s1 == s2)
{
System.out.println("s1 == s2");}
autre{
System.out.println("s1 != s2");}
}
}
Compilez et exécutez le programme, sortie : s1 == s2 Remarque : s1 et s2 font référence au même objet String - "Lundi" 2. Si vous modifiez légèrement le programme, vous trouverez quelque chose d'encore plus étrange :
Copiez le code comme suit :
classe publique TestString {
publicstaticvoid main (String[] arguments)
{
Chaîne s1="Lundi" ;
String s2 =new String("Lundi");
if (s1 == s2) {System.out.println("s1 == s2");
}
autre
{
System.out.println("s1 != s2");
}
si (s1.equals(s2))
{
System.out.println("s1 est égal à s2");
}
autre
{
System.out.println("s1 n'est pas égal à s2");
}
}
}
Nous utilisons l'opérateur new pour créer la sortie du programme pour s2 : s1 != s2 s1 est égal à s2 Remarque : s1 et s2 font respectivement référence à deux objets String "Lundi".
3. Pool de tampons de chaînes Il s'avère que le programme créera un pool de tampons de chaînes lors de son exécution. Lorsqu'il utilise une expression telle que s2 = "Monday" pour créer une chaîne, le programme recherchera d'abord la même valeur dans la chaîne. pool de mémoire tampon. Objet, dans le premier programme, s1 a d'abord été placé dans le pool, donc lorsque s2 a été créé, le programme a trouvé s1 avec la même valeur et a référencé s2 à l'objet "lundi" référencé par s1 dans le deuxième programme. À l'aide de l'opérateur new, il indique clairement au programme : "J'en veux un nouveau ! Pas l'ancien !" Ainsi, un nouvel objet Sting "Monday" est créé dans la mémoire. Leurs valeurs sont les mêmes, mais leurs emplacements sont différents, l'un nage dans la piscine et l'autre se repose sur le rivage. Oups, quel gaspillage de ressources. Pourquoi devons-nous les séparer alors qu’elles sont évidemment identiques ?
4. Modifiez à nouveau le programme :
Copiez le code comme suit :
chaîne de test de classe publique
{
publicstaticvoid main (String[] arguments)
{
Chaîne s1="Lundi" ;
String s2 =new String("Lundi");
s2 = s2.intern();
si (s1 == s2)
{
System.out.println("s1 == s2");
}
autre
{
System.out.println("s1 != s2");
}
si (s1.equals(s2))
{
System.out.println("s1 est égal à s2");
}
autre
{
System.out.println("s1 n'est pas égal à s2");
}
}
}
Cette fois, ajouté : s2 = s2.intern(); Sortie du programme : s1 == s2 s1 est égal à s2 Il s'avère que la valeur de retour de la méthode intern() de java.lang.String "abc".intern() est toujours une chaîne " abc", à première vue, cette méthode semble inutile. Mais en fait, elle fait une petite astuce : vérifiez s'il y a une chaîne telle que "abc" dans le pool de chaînes, et si elle existe, renvoyez la. chaîne dans le pool ; si elle n'existe pas, cette méthode ajoutera "abc" au pool de chaînes puis renverra sa référence).