CodeGym /בלוג Java /Random-HE /Java String שווה()
John Squirrels
רָמָה
San Francisco

Java String שווה()

פורסם בקבוצה
השוואת אובייקטים לצורך שקילות היא אחת מפעולות התכנות החשובות ביותר. עם זאת, למרות כל המובן מאליו בעולם המספרי, לא תמיד ברור כיצד להשוות סוגי נתונים אחרים. מחלקת Java Object , בסיסית, מגדירה את השיטות equals() ו- compareTo() להשוואה. מחלקה מחרוזת עוקפת את שיטת equals() שלה . השיטה Java String equals() משווה שתי מחרוזות בהתאם לתוכן שלהן. חתימת המתודה String equals() נראית כך:

public boolean equals(Object anotherObject) 
שיטת String equals() משווה את המחרוזת לאובייקט שצוין. אם המחרוזות שוות, זה מחזיר אמת, אחרת זה שקר. אולי אתה תוהה למה לא להשוות מחרוזות באמצעות אופרטור ההשוואה == ? למעשה, זה גם אפשרי, אבל התוצאה תהיה שונה במקצת. העובדה היא שהאופרטור == משווה כתובות בזיכרון. אז אם s1 == s2 מחזירה true , לשתי המחרוזות הללו יש אותה כתובת בזיכרון. במקביל, equals בודק את תוכן המחרוזות לשוויון. מחרוזת Java שווה() - 1ניקח דוגמה להשוואה בין שתי מחרוזות.

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

   }
}
הפלט של תוכנית זו הוא:
נכון לא נכון נכון לא נכון
בואו נסתכל מקרוב על מה שקורה כאן. כאשר אנו יוצרים מיתר, הוא ממוקם בבריכת המיתרים, אזור מיוחד של זיכרון. מחרוזות תופסות חלק עצום מכל האובייקטים בכל תוכנית גדולה. אז כדי לחסוך בזיכרון נוצר String Pool, שבו ממוקמת מחרוזת עם הטקסט שאתה צריך. קישורים חדשים שנוצרו מאוחר יותר מתייחסים לאותו אזור זיכרון, אין צורך להקצות זיכרון נוסף בכל פעם. אם אתה יוצר מחרוזת ללא אופרטור חדש, כלומר כשאתה כותב

String  myStringName = "...........................................", 
או משהו כזה, התוכנית בודקת אם יש מחרוזת עם טקסט כזה ב-String pool. אם כן, לא תיווצר מחרוזת חדשה. והקישור החדש יצביע על אותה כתובת ב-String Pool שבה המחרוזת כבר מאוחסנת. אז כשכתבנו בתוכנית

 String myString1 = "here is my favorite string";
 String myString2 = "here is my favorite string";
ההפניה myString1 מצביעה בדיוק לאותו מקום בזיכרון כמו myString2 . הפקודה הראשונה יצרה מחרוזת חדשה ב-String Pool עם הטקסט שהיינו צריכים, וכאשר הגיעה לשנייה, היא פשוט התייחסה לאותו אזור זיכרון כמו myString1 . אבל המחרוזת myString4 נוצרה כאובייקט באמצעות אופרטור חדש . אופרטור זה מקצה אזור חדש בזיכרון לאובייקט כאשר הוא נוצר. מחרוזת שנוצרה עם חדש

 String myString1 = new String ("here is my favorite string");
 String myString2 = new String ("here is my favorite string");
אינו נופל למאגר המחרוזות, אלא הופך לאובייקט נפרד, גם אם הטקסט שלו תואם לחלוטין לאותה מחרוזת ממאגר המחרוזות. יתרה מכך, אם נשווה מחרוזות באמצעות שיטת String equals() היא תבדוק לא את הכתובת, אלא את תוכן המחרוזת, את רצף התווים במחרוזות. ואם הטקסט במחרוזות זהה, זה לא משנה איך הם נוצרו והיכן הם מאוחסנים, ב-String Pool, או באזור זיכרון נפרד. לכן myString1 , myString2 ו- myString4 היו שווים בהשוואה זו. אגב, שמתם לב ששיטת String equals() מאפשרת לכם להשוות נכון מחרוזות באופן תלוי-רישיות? כלומר, אם נשווה את המחרוזת "המחרוזת שלי" למחרוזות "המחרוזת שלי" ו-"MY STRING" נקבל false.

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

   }
}
הפלט נמצא כאן:
שקר שקר
כדי להשוות מחרוזות באופן לא רגיש לאותיות גדולות, ל-Java יש שיטה שדומה מאוד לשווה :

boolean equalsIgnoreCase​(String anotherString)
בואו נשתמש בזה בדוגמה שלנו.

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));

   }
}
כעת הפלט הוא:
אמת אמת
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION