CodeGym /Blog Java /Random-PL /Ciąg Java równa się ()
John Squirrels
Poziom 41
San Francisco

Ciąg Java równa się ()

Opublikowano w grupie Random-PL
Porównywanie obiektów pod kątem równoważności jest jedną z najważniejszych operacji programistycznych. Jednak pomimo całej oczywistości w świecie liczbowym, nie zawsze jest jasne, jak porównać inne typy danych. Podstawowa klasa Java Object definiuje metody równości() i CompareTo() do celów porównawczych. Klasa String zastępuje swoją metodę równości() . Metoda Java String równa() porównuje dwa ciągi znaków według ich zawartości. Sygnatura metody String Equals() wygląda następująco:
public boolean equals(Object anotherObject)
Metoda String równa się() porównuje ciąg znaków z określonym obiektem. Jeśli ciągi są równe, zwraca wartość true, w przeciwnym razie wartość false. Być może zastanawiasz się, dlaczego nie porównać ciągów znaków za pomocą operatora porównania == ? W rzeczywistości jest to również możliwe, ale wynik będzie nieco inny. Faktem jest, że operator == porównuje adresy w pamięci. Jeśli więc s1 == s2 zwróci true , te dwa ciągi mają ten sam adres w pamięci. Jednocześnie równa sprawdza zawartość ciągów pod kątem równości. Ciąg Java równa się () - 1Weźmy przykład porównania dwóch ciągów znaków.
public class StringEqualsTest {
   //program to test Java equals() method
   public static void main(String[] args) {
       String myString1 = "here is my favorite string";
       String myString2 = "here is my favorite string"; //this string is the same as the previous one, at least we think so
       String myString3 = "here is My favorite string"; //this string looks a little bit like previous two, but the first letter is big M instead of small m
       String myString4 = new String("here is my favorite string");
//here we create a String in an object manner… Why? Find out soon
       String myString5 = "equals to myString1? No, not at all..."; //here we have absolutely different string. Just for fun
    //let’s compare myString1 with myString2 using “==” operator
       System.out.println(myString1 == myString2); //true
    //let’s compare myString1 with myString4 using “==” operator
       System.out.println(myString1 == myString4); //false
//and now we are going to use equals() method to compare myString1 with myString4, myString2 and myString5
     System.out.println(myString1.equals(myString4));//true
       System.out.println(myString1.equals(myString2));//true
       System.out.println(myString1.equals(myString5)); //false

   }
}
Dane wyjściowe tego programu to:
prawda fałsz prawda prawda fałsz
Przyjrzyjmy się bliżej temu, co się tutaj dzieje. Kiedy tworzymy ciąg znaków, jest on umieszczany w puli ciągów, czyli specjalnym obszarze pamięci. Łańcuchy zajmują ogromną część wszystkich obiektów w każdym dużym programie. Aby zaoszczędzić pamięć, utworzono String Pool, w którym umieszczany jest ciąg znaków z potrzebnym tekstem. Później nowo utworzone łącza odnoszą się do tego samego obszaru pamięci, nie ma potrzeby każdorazowej alokacji dodatkowej pamięci. Jeśli utworzysz ciąg bez nowego operatora, to znaczy podczas pisania
String  myStringName = "...........................................",
lub coś w tym stylu, program sprawdza, czy w puli String znajduje się ciąg znaków z takim tekstem. Jeśli tak, nie zostanie utworzony żaden nowy ciąg . Nowy link będzie wskazywał ten sam adres w puli ciągów, w którym ten ciąg jest już zapisany. Więc kiedy pisaliśmy w programie
String myString1 = "here is my favorite string";
String myString2 = "here is my favorite string";
odniesienie myString1 wskazuje dokładnie to samo miejsce w pamięci co myString2 . Pierwsze polecenie utworzyło nowy ciąg w puli ciągów z potrzebnym tekstem, a drugie polecenie po prostu odnosiło się do tego samego obszaru pamięci co myString1 . Ale ciąg myString4 został utworzony jako obiekt przy użyciu operatora new . Operator ten przydziela obiektowi nowy obszar w pamięci podczas jego tworzenia. Ciąg utworzony za pomocą new
String myString1 = new String ("here is my favorite string");
String myString2 = new String ("here is my favorite string");
nie wpada do puli ciągów, ale staje się oddzielnym obiektem, nawet jeśli jego tekst całkowicie pasuje do tego samego ciągu z puli ciągów. Co więcej, jeśli porównamy ciągi za pomocą metody String równości() , to nie sprawdzimy adresu, ale zawartość ciągu, sekwencję znaków w ciągu. A jeśli tekst w ciągach znaków jest taki sam, nie ma znaczenia, w jaki sposób zostały utworzone i gdzie są przechowywane – w puli ciągów czy w oddzielnym obszarze pamięci. Dlatego myString1 , myString2 i myString4 były równe w tym porównaniu. Przy okazji, czy zauważyłeś, że metoda String równa się() pozwala poprawnie porównywać ciągi znaków z uwzględnieniem wielkości liter? Oznacza to, że jeśli porównamy ciąg „mój ciąg” z ciągami „Mój ciąg” i „MÓJ ŁAŃCUCH”, otrzymamy fałsz.
public class StringEqualsTest {

   public static void main(String[] args) {

       String myString1 = new String ("here is my favorite string");
       String myString2 = new String ("here is My favorite string");
       String myString3 = new String("HERE IS MY FAVORITE STRING");

       System.out.println(myString1.equals(myString2)); //false because first string myString1 has small m and myString2 has big M instead
       System.out.println(myString1.equals(myString3));//false because myString1 is in lowercase while myString3 is in uppercase

   }
}
Dane wyjściowe są tutaj:
fałszywe fałszywe
Aby porównać ciągi znaków bez uwzględniania wielkości liter, Java ma metodę bardzo podobną do metody równości :
boolean equalsIgnoreCase​(String anotherString)
Wykorzystajmy to w naszym przykładzie.
public class StringEqualsTest {

   public static void main(String[] args) {

       String myString1 = new String ("here is my favorite string");
       String myString2 = new String ("here is My favorite string");
       String myString3 = new String("HERE IS MY FAVORITE STRING");
     /* here we are going to use the brother of equals() method, equalsIgnoreCase(). It can help to check user input when case isn’t
important */
       System.out.println(myString1.equalsIgnoreCase(myString2));

       System.out.println(myString1.equalsIgnoreCase(myString3));

   }
}
Teraz wynik jest następujący:
Prawda, prawda
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION