การเปรียบเทียบสตริงใน Java

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