CodeGym /وبلاگ جاوا /Random-FA /رشته جاوا برابر است()
John Squirrels
مرحله
San Francisco

رشته جاوا برابر است()

در گروه منتشر شد
مقایسه اشیاء برای هم ارزی یکی از مهمترین عملیات برنامه نویسی است. با این حال، با وجود همه آشکار بودن آن در دنیای عددی، همیشه نحوه مقایسه انواع داده های دیگر مشخص نیست. کلاس شی جاوا ، یک کلاس پایه، متدهای ()quals و compareTo() را برای مقایسه تعریف می کند. کلاس رشته متد () quals خود را نادیده می گیرد. متد Java String equals() دو رشته را با توجه به محتوای آنها مقایسه می کند. امضای متد String () به شکل زیر است:
public boolean equals(Object anotherObject)
متد Stringquals () رشته را با شی مشخص شده مقایسه می کند. اگر رشته ها مساوی باشند، true را برمی گرداند، در غیر این صورت false است. شاید تعجب کنید که چرا رشته ها را با استفاده از عملگر مقایسه == مقایسه نمی کنید ؟ در واقع، این نیز ممکن است، اما نتیجه تا حدودی متفاوت خواهد بود. واقعیت این است که عملگر == آدرس ها را در حافظه مقایسه می کند. بنابراین اگر s1 == s2 true را برگرداند ، این دو رشته آدرس یکسانی در حافظه دارند. در همان زمان، equals محتویات رشته ها را برای برابری بررسی می کند. رشته جاوا برابر است () - 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 وجود دارد یا خیر. اگر اینطور باشد، رشته جدیدی ایجاد نخواهد شد. و پیوند جدید به همان آدرس در String Pool که در آن رشته قبلاً ذخیره شده است اشاره می کند. بنابراین وقتی در برنامه نوشتیم
String myString1 = "here is my favorite string";
String myString2 = "here is my favorite string";
مرجع myString1 دقیقاً به همان مکان در حافظه اشاره می کند که myString2 . دستور اول یک رشته جدید در String Pool با متن مورد نیاز ما ایجاد کرد و وقتی نوبت به دومی رسید، به سادگی به همان ناحیه حافظه myString1 اشاره کرد . اما رشته myString4 به عنوان یک شی با استفاده از عملگر جدید ایجاد شد . این عملگر در هنگام ایجاد یک شیء، ناحیه جدیدی را در حافظه به آن اختصاص می دهد. رشته ای که با new ایجاد شده است
String myString1 = new String ("here is my favorite string");
String myString2 = new String ("here is my favorite string");
در String Pool قرار نمی گیرد، اما تبدیل به یک شی جداگانه می شود، حتی اگر متن آن کاملاً با همان رشته از String Pool مطابقت داشته باشد. علاوه بر این، اگر رشته ها را با استفاده از متد String () برابر مقایسه کنیم، نه آدرس، بلکه محتویات رشته، دنباله کاراکترهای رشته ها را بررسی می کند. و اگر متن در رشته ها یکسان باشد، مهم نیست که چگونه ایجاد شده اند و در کجا ذخیره می شوند، در String Pool یا در یک منطقه حافظه جداگانه. به همین دلیل است که myString1 ، myString2 و myString4 در این مقایسه برابر بودند. به هر حال، آیا متوجه شده اید که متد String () quals به شما امکان می دهد رشته ها را به روشی حساس به حروف بزرگ و کوچک به درستی مقایسه کنید؟ یعنی اگر رشته «رشته من» را با رشته «رشته من» و «رشته من» مقایسه کنیم اشتباه می شود.
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

   }
}
خروجی اینجاست:
نادرست نادرست
برای مقایسه رشته ها به روشی غیر حساس به حروف بزرگ، جاوا متدی دارد که بسیار شبیه به برابر است :
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