1. ภาพรวม
ในบทความนี้เราจะพูดถึงวิธีต่างๆในการเปรียบเทียบStringsใน Java
เนื่องจากStringเป็นประเภทข้อมูลที่ใช้มากที่สุดชนิดหนึ่งใน Java จึงเป็นการดำเนินการที่ใช้กันทั่วไปโดยทั่วไป
2. Stringเมื่อเปรียบเทียบกับStringชั้น
2.1. การใช้ตัวดำเนินการเปรียบเทียบ“ ==”
การใช้โอเปอเรเตอร์“ ==” เพื่อเปรียบเทียบค่าข้อความเป็นหนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดสำหรับผู้เริ่มต้น Java สิ่งนี้ไม่ถูกต้องเนื่องจาก“ ==”ตรวจสอบความเท่าเทียมกันของการอ้างอิงของสองสตริงเท่านั้นซึ่งหมายความว่ามันอ้างอิงวัตถุเดียวกันหรือไม่
ลองดูตัวอย่างของพฤติกรรมนี้:
String string1 = "using comparison operator"; String string2 = "using comparison operator"; String string3 = new String("using comparison operator"); assertThat(string1 == string2).isTrue(); assertThat(string1 == string3).isFalse();
ในตัวอย่างด้านบนการยืนยันครั้งแรกเป็นจริงเนื่องจากตัวแปรทั้งสองชี้ไปที่สตริงลิเทอรัลเดียวกัน
ในทางกลับกันการยืนยันที่สองเป็นเท็จเนื่องจากstring1ถูกสร้างขึ้นด้วยลิเทอรัลและstring3ถูกสร้างขึ้นโดยใช้ตัวดำเนินการใหม่ดังนั้นจึงอ้างอิงอ็อบเจ็กต์ที่แตกต่างกัน
2.2. ใช้เท่ากับ ()
Stringระดับแทนที่เท่ากับ ()สืบทอดมาจากวัตถุ วิธีนี้จะเปรียบเทียบอักขระ Stringsสองตัวตามอักขระโดยไม่สนใจที่อยู่
จะถือว่าพวกมันเท่ากันหากมีความยาวเท่ากันและอักขระอยู่ในลำดับเดียวกัน:
String string1 = "using equals method"; String string2 = "using equals method"; String string3 = "using EQUALS method"; String string4 = new String("using equals method"); assertThat(string1.equals(string2)).isTrue(); assertThat(string1.equals(string4)).isTrue(); assertThat(string1.equals(null)).isFalse(); assertThat(string1.equals(string3)).isFalse();
ในตัวอย่างนี้ตัวแปรstring1, string2และstring4มีค่าเท่ากันเนื่องจากมีกรณีและค่าเดียวกันโดยไม่คำนึงถึงที่อยู่
สำหรับstring3วิธีการคืนค่าเท็จเนื่องจากเป็นกรณีที่สำคัญ
นอกจากนี้หากสตริงใด ๆ ในสองสายเป็นโมฆะเมธอดจะส่งคืนเท็จ
2.3. การใช้equalsIgnoreCase ()
วิธีการequalsIgnoreCase ()ส่งคืนค่าบูลีน ตามชื่อที่แนะนำวิธีนี้จะละเว้นการใส่ตัวอักษรในขณะที่เปรียบเทียบสตริง :
String string1 = "using equals ignore case"; String string2 = "USING EQUALS IGNORE CASE"; assertThat(string1.equalsIgnoreCase(string2)).isTrue();
2.4. การใช้CompareTo ()
compareTo ()วิธีการส่งกลับintค่าชนิดและเปรียบเทียบสองสตริงทีละอักขระ lexicographicallyอยู่บนพื้นฐานของพจนานุกรมหรือสั่งซื้อทางธรรมชาติ
วิธีนี้จะคืนค่า 0 หากสตริงสองสตริงเท่ากันหรือถ้าทั้งสองเป็นโมฆะจำนวนลบหากสตริงแรกมาก่อนอาร์กิวเมนต์และตัวเลขที่มากกว่าศูนย์หากสตริงแรกมาหลังสตริงอาร์กิวเมนต์
ลองดูตัวอย่าง:
String author = "author"; String book = "book"; String duplicateBook = "book"; assertThat(author.compareTo(book)) .isEqualTo(-1); assertThat(book.compareTo(author)) .isEqualTo(1); assertThat(duplicateBook.compareTo(book)) .isEqualTo(0);
2.5. การใช้CompareToIgnoreCase ()
compareToIgnoreCase ()คล้ายกับวิธีการก่อนหน้า แต่มันไม่สนใจกรณี:
String author = "Author"; String book = "book"; String duplicateBook = "BOOK"; assertThat(author.compareToIgnoreCase(book)) .isEqualTo(-1); assertThat(book.compareToIgnoreCase(author)) .isEqualTo(1); assertThat(duplicateBook.compareToIgnoreCase(book)) .isEqualTo(0);
3. การเปรียบเทียบสตริงกับคลาสออบเจ็กต์
ออบเจ็กต์เป็นคลาสยูทิลิตี้ที่มีวิธีการคงที่เท่ากับ ()ซึ่งมีประโยชน์ในสถานการณ์นี้ - เพื่อเปรียบเทียบสองสตริง
วิธีการส่งกลับจริงถ้าสองสายมีค่าเท่ากันโดยครั้งแรกเปรียบเทียบพวกเขาโดยใช้ที่อยู่ของพวกเขาคือ“ ==” ดังนั้นหากอาร์กิวเมนต์ทั้งสองเป็นโมฆะจะส่งกลับค่าจริงและถ้าอาร์กิวเมนต์หนึ่งอาร์กิวเมนต์เป็นโมฆะจะส่งคืนเท็จ
มิฉะนั้นจะเรียกใช้เมธอดequals ()ของคลาสของประเภทอาร์กิวเมนต์ที่ส่งผ่าน - ซึ่งในกรณีของเราคือคลาสของ String เท่ากับ ()วิธี เมธอดนี้คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์เนื่องจากภายในเรียกวิธีการเท่ากับ ()ของคลาสString
ลองทดสอบสิ่งนี้:
String string1 = "using objects equals"; String string2 = "using objects equals"; String string3 = new String("using objects equals"); assertThat(Objects.equals(string1, string2)).isTrue(); assertThat(Objects.equals(string1, string3)).isTrue(); assertThat(Objects.equals(null, null)).isTrue(); assertThat(Objects.equals(null, string1)).isFalse();
4. การเปรียบเทียบสตริงกับApache Commons
ห้องสมุด Apache คอมมอนส์มีระดับยูทิลิตี้ที่เรียกว่าStringUtilsสำหรับString-การดำเนินงานที่เกี่ยวข้อง ; นอกจากนี้ยังมีวิธีการที่เป็นประโยชน์สำหรับการเปรียบเทียบสตริง
4.1. ใช้equals ()และequalsIgnoreCase ()
เท่ากับ ()วิธีการStringUtilsชั้นเป็นรุ่นที่เพิ่มขึ้นของStringวิธีการเรียนเท่ากับ ()ซึ่งยังจับค่า null:
assertThat(StringUtils.equals(null, null)) .isTrue(); assertThat(StringUtils.equals(null, "equals method")) .isFalse(); assertThat(StringUtils.equals("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equals("equals method", "EQUALS METHOD")) .isFalse();
equalsIgnoreCase ()วิธีการStringUtilsส่งกลับแบบบูลค่า วิธีนี้ใช้งานได้ในทำนองเดียวกันกับเท่ากับ ()ยกเว้นว่าจะละเว้นตัวพิมพ์ใหญ่ในสตริง:
assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD")) .isTrue();
4.2. การใช้equalsAny ()และequalsAnyIgnoreCase ()
The equalsAny() method's first argument is a String and the second is a multi-args type CharSequence. The method returns true if any of the other given Strings match against the first String case sensitively.
Otherwise, false is returned:
assertThat(StringUtils.equalsAny(null, null, null)) .isTrue(); assertThat(StringUtils.equalsAny("equals any", "equals any", "any")) .isTrue(); assertThat(StringUtils.equalsAny("equals any", null, "equals any")) .isTrue(); assertThat(StringUtils.equalsAny(null, "equals", "any")) .isFalse(); assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY")) .isFalse();
The equalsAnyIgnoreCase() method works similarly to the equalsAny() method, but also ignores casing:
assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();
4.3. Using compare() and compareIgnoreCase()
The compare() method in StringUtils class is a null-safe version of the compareTo() method of String class and handles null values by considering a null value less than a non-null value. Two null values are considered equal.
Furthermore, this method can be used to sort a list of Strings with null entries:
assertThat(StringUtils.compare(null, null)) .isEqualTo(0); assertThat(StringUtils.compare(null, "abc")) .isEqualTo(-1); assertThat(StringUtils.compare("abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compare("bbc", "abc")) .isEqualTo(1);
The compareIgnoreCase() method behaves similarly, except it ignores casing:
assertThat(StringUtils.compareIgnoreCase("Abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compareIgnoreCase("bbc", "ABC")) .isEqualTo(1); assertThat(StringUtils.compareIgnoreCase("abc", "ABC")) .isEqualTo(0);
ทั้งสองวิธีสามารถใช้กับตัวเลือกnullIsLess นี่คือหนึ่งในสามบูลอาร์กิวเมนต์ที่ตัดสินใจถ้าค่า null ควรพิจารณาน้อยลงหรือไม่
nullมูลค่าต่ำกว่าที่อื่นStringถ้าnullIsLessเป็นความจริงและที่สูงขึ้นหากnullIsLessเป็นเท็จ
มาลองดู:
assertThat(StringUtils.compare(null, "abc", true)) .isEqualTo(-1); assertThat(StringUtils.compare(null, "abc", false)) .isEqualTo(1);
compareIgnoreCase ()ด้วยวิธีที่สามบูลทำงานโต้แย้งในทำนองเดียวกันเว้นแต่โดยไม่สนใจกรณี
5. สรุป
ในบทช่วยสอนฉบับย่อนี้เราได้พูดถึงวิธีต่างๆในการเปรียบเทียบStrings
และเช่นเคยซอร์สโค้ดสำหรับตัวอย่างสามารถพบได้บน GitHub