การเปรียบเทียบออบเจ็กต์เพื่อความเท่าเทียมเป็นหนึ่งในการดำเนินการโปรแกรมที่สำคัญที่สุด อย่างไรก็ตาม เพื่อความชัดเจนในโลกของตัวเลข การเปรียบเทียบประเภทข้อมูลอื่นๆ อาจไม่ชัดเจนเสมอไป คลาส Java Objectซึ่งเป็นคลาสพื้นฐานกำหนด วิธี การเท่ากับ ()และcomparisonTo ()สำหรับการเปรียบเทียบ คลาสสตริงแทนที่วิธีการเท่ากับ () Java String เท่ากับ ()วิธีการเปรียบเทียบสองสายตามเนื้อหาของพวกเขา ลายเซ็นเมธอด String เท่ากับ ()มีลักษณะดังนี้:
ลองมาตัวอย่างการเปรียบเทียบสองสาย
public boolean equals(Object anotherObject)
สตริงเท่ากับ ()วิธีการเปรียบเทียบสตริงกับวัตถุที่ระบุ หากสตริงเท่ากัน จะคืนค่าเป็นจริง ไม่เช่นนั้นจะเป็นเท็จ คุณอาจสงสัยว่าทำไมไม่เปรียบเทียบสตริงโดยใช้ตัวดำเนินการเปรียบเทียบ== ที่จริงแล้วสิ่งนี้ก็เป็นไปได้เช่นกัน แต่ผลลัพธ์จะแตกต่างออกไปบ้าง ความจริงก็คือ ตัวดำเนินการ ==เปรียบเทียบที่อยู่ในหน่วยความจำ ดังนั้นหากs1 == s2ส่งคืนtrueแสดงว่าทั้งสองสตริงมีที่อยู่เดียวกันในหน่วยความจำ ในขณะเดียวกันEqualsจะตรวจสอบเนื้อหาของสตริงเพื่อความเท่าเทียมกัน ![สตริง Java เท่ากับ () - 1](https://cdn.codegym.cc/images/article/3328911e-84f2-4fe9-9bfc-b649eb048ce9/800.jpeg)
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 ใหม่ และลิงก์ใหม่จะชี้ไปยังที่อยู่เดียวกันใน 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 Equals()ช่วยให้คุณเปรียบเทียบสตริงได้อย่างถูกต้องโดยคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ นั่นคือถ้าเราเปรียบเทียบสตริง "my string" กับสตริง "My string" และ "MY STRING" เราจะได้เท็จ
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));
}
}
ตอนนี้ผลลัพธ์คือ:
จริงจริง
อ่านเพิ่มเติม: |
---|