เชี่ยวชาญการใช้ contains() ใน Java: วิธีทำการค้นหา Substring อย่างมีประสิทธิภาพ

目次

1. บทนำ: ทำไมการค้นหาสตริงจึงสำคัญใน Java

การจัดการสตริงเป็นหนึ่งในปฏิบัติการที่ใช้บ่อยที่สุดเมื่อเขียนโปรแกรมด้วย Java.
ไม่ว่าจะเป็นการตรวจสอบข้อมูลผู้ใช้, การแยกวิเคราะห์เนื้อหาไฟล์, หรือการค้นหาคำสำคัญเฉพาะ, คุณมักต้องตรวจสอบว่าคำใดคำหนึ่งอยู่ภายในสตริงที่กำหนดหรือไม่.

เพื่อรองรับความต้องการเหล่านี้, Java มีเมธอดที่สะดวกชื่อ contains().
ด้วยเมธอดนี้, คุณสามารถตรวจสอบได้อย่างง่ายดายว่าสตริงหนึ่ง ส่วนหนึ่งมี อีกสตริงหนึ่งหรือไม่.
เช่น หากคุณต้องการตรวจสอบว่าข้อความแสดงข้อผิดพลาดมีคำสำคัญเฉพาะหรือไม่, contains() ช่วยให้ทำได้ในบรรทัดโค้ดเดียว.

โดยเฉพาะในสถานการณ์ที่ต้องจัดการข้อความจำนวนมาก—เช่น แอปพลิเคชันเว็บ, การประมวลผล API, หรือการวิเคราะห์บันทึก—เมธอด contains() ช่วยเพิ่มความอ่านง่ายและการบำรุงรักษาของโค้ดอย่างมาก.
อย่างไรก็ตาม, ยังมีประเด็นสำคัญที่ต้องคำนึงถึง เช่น ความไวต่อขนาดอักษร (case sensitivity) และความเป็นไปได้ของค่า null.

บทความนี้จะอธิบายเมธอด contains() ของ Java อย่างละเอียด—ตั้งแต่การใช้งานพื้นฐาน, ข้อผิดพลาดทั่วไป, ความแตกต่างจากเมธอดอื่น ๆ, จนถึงการประยุกต์ใช้ในทางปฏิบัติ.
เป้าหมายของเราคือการให้ข้อมูลที่เป็นประโยชน์ไม่เพียงแต่สำหรับผู้เริ่มต้น แต่ยังสำหรับนักพัฒนาที่ใช้งาน Java ในโครงการจริง.

2. ไวยากรณ์พื้นฐานและลักษณะของเมธอด contains()

เมธอด contains() ของ Java ตรวจสอบว่าสตริงหนึ่ง ส่วนหนึ่งมี อีกสตริงหนึ่งหรือไม่.
ไวยากรณ์ของมันง่ายมาก แต่มีประโยชน์สูงและถูกใช้บ่อยในงานเขียนโปรแกรมประจำวัน.

ไวยากรณ์พื้นฐาน

boolean result = targetString.contains(searchString);

เมธอดนี้เป็นส่วนหนึ่งของคลาส String และรับอาร์กิวเมนต์ประเภท CharSequence (โดยทั่วไปคือ String).
ค่าที่คืนกลับเป็น boolean: true หากสตริงเป้าหมายมีส่วนย่อยที่กำหนด, และ false ในกรณีอื่น.

ตัวอย่างโค้ด

String message = "Java programming is fun!";
boolean hasKeyword = message.contains("programming");

System.out.println(hasKeyword); // Output: true

ในตัวอย่างข้างต้น, ส่วนย่อย "programming" ปรากฏอยู่ในสตริงเป้าหมาย, ดังนั้น contains() จะคืนค่า true.

ลักษณะของเมธอด

  • ตรวจสอบเฉพาะการจับคู่บางส่วน: หากต้องการการจับคู่ที่ตรงกันทั้งหมด, ให้ใช้ equals() แทน.
  • ไวต่อขนาดอักษร (Case-sensitive): ตัวอย่างเช่น "Java" และ "java" ถือว่าแตกต่างกัน (รายละเอียดจะอธิบายต่อไป).
  • ไม่รองรับ regular expressions: เนื่องจากมันเพียงตรวจสอบการมีอยู่ของสตริง, การจับคู่แบบ pattern ต้องใช้ matches() หรือคลาส Pattern.

พฤติกรรมเมื่อส่งค่า null

การส่งค่า null ไปยัง contains() จะทำให้เกิด NullPointerException.
เช่น โค้ดต่อไปนี้จะทำให้เกิดข้อยกเว้น:

String text = null;
System.out.println(text.contains("test")); // Exception occurs

เช่นเดียวกัน, หากสตริงเป้าหมายเองเป็น null, จะเกิดข้อยกเว้นเดียวกัน.
ดังนั้นจึงแนะนำอย่างยิ่งให้ ตรวจสอบค่า null ก่อนเรียกใช้ contains().

3. ตัวอย่างการใช้งานจริงและข้อควรพิจารณาที่สำคัญ

เมธอด contains() ของ Java ใช้งานง่ายและสะดวก, แต่การใช้ผิดวิธีอาจทำให้เกิดบั๊กที่ไม่คาดคิดหรือโค้ดที่ไม่มีประสิทธิภาพ.
ส่วนนี้จะอธิบายการใช้งานพื้นฐานของ contains() พร้อมกับจุดสำคัญที่คุณควรระวัง.

3-1. ตัวอย่างการใช้งานพื้นฐาน

โค้ดต่อไปนี้แสดงตัวอย่างง่าย ๆ ของการตรวจสอบว่าสตริงเป้าหมายมีคำสำคัญเฉพาะหรือไม่:

String sentence = "今日はJavaの勉強をしています。";

if (sentence.contains("Java")) {
    System.out.println("Javaが含まれています。");
} else {
    System.out.println("Javaは含まれていません。");
}

ตามที่แสดง, contains() มักถูกใช้ร่วมกับคำสั่ง if เพื่อทำการแยกสาขาตามเงื่อนไข.

3-2. ความไวต่อขนาดอักษร (Case Sensitivity)

เมธอด contains() ไวต่อขนาดอักษร.
เช่น โค้ดต่อไปนี้จะคืนค่า false:

String text = "Welcome to Java";
System.out.println(text.contains("java")); // false

ในกรณีเช่นนี้ มักจะทำการ แปลงสตริงให้เป็นตัวพิมพ์เล็ก (หรือตัวพิมพ์ใหญ่) ก่อนทำการเปรียบเทียบ:

String text = "Welcome to Java";
System.out.println(text.toLowerCase().contains("java")); // true

แนวทางนี้ช่วยกำจัดความแตกต่างในตัวพิมพ์ของข้อมูลนำเข้า (เช่น ข้อมูลจากผู้ใช้)。

3-3. การจัดการ null และสตริงว่าง

หนึ่งในข้อพิจารณาที่สำคัญที่สุดเมื่อใช้ contains() คือการจัดการ null
หากสตริงเป้าหมายหรืออาร์กิวเมนต์เป็น null จะเกิด NullPointerException

String text = null;
System.out.println(text.contains("test")); // Runtime error

เพื่อหลีกเลี่ยงปัญหานี้ ควรเพิ่มการตรวจสอบ null เสมอ:

if (text != null && text.contains("test")) {
    // Safe to process
}

นอกจากนี้ ยังโปรดทราบว่า:
การส่งสตริงว่าง ("") จะคืนค่า true เสมอ。

String sample = "test";
System.out.println(sample.contains("")); // true

อย่างไรก็ตาม พฤติกรรมนี้ไม่ค่อยมีประโยชน์ในทางปฏิบัติ และอาจนำไปสู่บั๊กโดยไม่ได้ตั้งใจหากส่งสตริงว่างโดยไม่ได้ตั้งใจ。

3-4. ไม่รองรับการค้นหาคำหลักหลายคำ

contains() สามารถตรวจสอบได้เพียงคำหลักเดียวในแต่ละครั้ง。
หากต้องการตรวจสอบคำหลักหลายคำ ต้องเรียกใช้ contains() หลายครั้ง หรือใช้ Stream API。

String target = "エラーコード123:アクセス拒否";
if (target.contains("エラー") || target.contains("拒否")) {
    System.out.println("問題のあるメッセージです。");
}

หรือ สำหรับชุดคำหลักแบบไดนามิก:

List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(target::contains);

4. เมธอดที่มักถูกเปรียบเทียบกับ contains()

Java มีเมธอดหลายตัวสำหรับเปรียบเทียบสตริงหรือตรวจสอบว่ามีซับสตริงเฉพาะหรือไม่。
ในจำนวนนั้น contains() ใช้สำหรับ “การจับคู่บางส่วน” แต่เมธอดอื่น ๆ ก็มีวัตถุประสงค์คล้ายคลึงกัน。
ส่วนนี้จะอธิบายลักษณะและความแตกต่างของเมธอดเหล่านั้น เพื่อช่วยให้คุณใช้ได้อย่างเหมาะสม。

4-1. ความแตกต่างจาก equals(): การจับคู่ที่ตรงกันเป๊ะ vs. การจับคู่บางส่วน

equals() ตรวจสอบว่า สองสตริงตรงกันเป๊ะหรือไม่
ในทางตรงกันข้าม contains() ตรวจสอบการจับคู่บางส่วน。

String a = "Java";
String b = "Java";

System.out.println(a.equals(b));      // true: Exact match
System.out.println(a.contains("av")); // true: Partial match

ความแตกต่างหลัก:

Comparisonequals()contains()
Match TypeExact matchPartial match
Case SensitivitySensitiveSensitive
Argument TypeObjectCharSequence

แนวทางการใช้งาน:
ใช้ equals() เมื่อค่าต้องตรงกันเป๊ะ (เช่น การยืนยัน ID)。
ใช้ contains() เมื่อยอมรับการจับคู่บางส่วนได้ (เช่น การค้นหาคำหลัก)。

4-2. ความแตกต่างจาก indexOf(): ว่าต้องการตำแหน่งหรือไม่

เมธอด indexOf() สามารถใช้ตรวจสอบว่ามีซับสตริงในสตริงหรือไม่。
ความแตกต่างคือ indexOf() คืนค่า ดัชนีเริ่มต้น ของซับสตริงหากพบ。
หากไม่พบ จะคืนค่า -1

String text = "Hello, Java World!";
System.out.println(text.indexOf("Java"));    // 7
System.out.println(text.indexOf("Python"));  // -1

คุณยังสามารถใช้ indexOf() เพื่อเลียนแบบพฤติกรรมของ contains() ได้:

if (text.indexOf("Java") >= 0) {
    System.out.println("It is contained.");
}

แนวทางการใช้งาน:
หากไม่ต้องการดัชนี contains() จะอ่านง่ายกว่าและควรใช้。

4-3. ความแตกต่างจาก matches(): การรองรับ Regular Expressions

เมธอด matches() ตรวจสอบว่าสตริง ตรงกับ regular expression ที่กำหนดทั้งหมดหรือไม่
ในทางตรงกันข้าม contains() ตรวจสอบเฉพาะการจับคู่ซับสตริงแบบตัวอักษรธรรมดา และไม่รองรับ regex。

String text = "abc123";
System.out.println(text.matches(".*123")); // true
System.out.println(text.contains(".*123")); // false (not regex)

หากต้องการการจับคู่บางส่วนโดยใช้ regex ให้ใช้คลาส Pattern:

4-4. สรุปการเปรียบเทียบคุณสมบัติ

MethodPurposeReturn TypeRegex SupportUse Case
contains()Partial matchbooleanNoKeyword search
equals()Exact matchbooleanNoID/password checks
indexOf()Get match positionintNoIndex-based processing
matches()Regex matchbooleanYesFind pattern-based strings

5. กรณีใช้งานทั่วไปและตัวอย่างโค้ด

.Java’s contains() method is simple yet widely used in real development scenarios.
Typical use cases include user input validation, log analysis, and filtering operations.
This section covers practical examples with corresponding code.

5-1. การตรวจสอบความถูกต้องของข้อมูลผู้ใช้ (Detecting Prohibited Words)

ในฟอร์มหรือแอปพลิเคชันแชท คุณอาจต้องตรวจจับว่ามีคำต้องห้ามบางคำถูกใส่เข้ามาหรือไม่

String input = "このアプリは最悪だ";
String banned = "最悪";

if (input.contains(banned)) {
    System.out.println("不適切な言葉が含まれています。");
}

การจัดการหลายคำ NG:

List<String> bannedWords = Arrays.asList("最悪", "バカ", "死ね");
for (String word : bannedWords) {
    if (input.contains(word)) {
        System.out.println("不適切な言葉が含まれています: " + word);
        break;
    }
}

5-2. การวิเคราะห์ไฟล์บันทึก (Detecting Specific Messages)

เมื่อวิเคราะห์บันทึกระบบหรือแอปพลิเคชัน คุณอาจต้องดึงเฉพาะบรรทัดที่มีคีย์เวิร์ดเฉพาะเช่น ERROR หรือ WARN

List<String> logs = Arrays.asList(
    "[INFO] サーバーが起動しました",
    "[ERROR] データベース接続失敗",
    "[WARN] メモリ使用率が高い"
);

for (String log : logs) {
    if (log.contains("ERROR")) {
        System.out.println("エラー発生ログ: " + log);
    }
}

5-3. การกรองสตริงในรายการ (Using Stream API)

เมื่อจัดการชุดข้อมูลขนาดใหญ่ ใช้ Stream API เพื่อดึงเฉพาะองค์ประกอบที่มีสตริงย่อยที่ต้องการ:

List<String> users = Arrays.asList("tanaka@example.com", "sato@gmail.com", "yamada@yahoo.co.jp");

List<String> gmailUsers = users.stream()
    .filter(email -> email.contains("@gmail.com"))
    .collect(Collectors.toList());

System.out.println(gmailUsers); // [sato@gmail.com]

5-4. การแยกส่วนหัวของ HTTP Request หรือ URL

ในการพัฒนาเว็บ การกำหนดเส้นทางหรือการจัดการตามอุปกรณ์อาจต้องตรวจสอบสตริงย่อยใน User-Agent หรือ URL

String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)";
if (userAgent.contains("iPhone")) {
    System.out.println("スマートフォンからのアクセスです。");
}

5-5. การตรวจสอบเส้นทางไฟล์หรือส่วนขยาย

เพื่อระบุประเภทของไฟล์โดยใช้เส้นทางของไฟล์:

String filePath = "/usr/local/data/sample.csv";
if (filePath.contains(".csv")) {
    System.out.println("CSVファイルです。");
}

หมายเหตุ:
สำหรับการตรวจสอบส่วนขยายไฟล์ endsWith(".csv") มักจะแม่นยำกว่า

ข้อพิจารณาเชิงปฏิบัติ

  • ใช้การทำให้เป็นมาตรฐาน (เช่น toLowerCase(), trim()) เมื่อความแม่นยำเป็นสิ่งจำเป็น.
  • สำหรับข้อมูลขนาดใหญ่ ควรพิจารณาใช้ Stream API หรือ regex.
  • จำไว้ว่า contains() เป็นการจับคู่แบบบางส่วน—ควรผสานกับเงื่อนไขอื่นเพื่อความปลอดภัยของตรรกะ.

6. ข้อพิจารณาด้านประสิทธิภาพ

แม้ว่าเมธอด contains() จะให้ความอ่านง่ายและความเรียบง่ายที่ยอดเยี่ยม คุณต้องพิจารณา ผลกระทบต่อประสิทธิภาพ เมื่อจัดการชุดข้อมูลขนาดใหญ่หรือทำการดำเนินการซ้ำหลายครั้ง
ส่วนนี้อธิบายต้นทุนการประมวลผลของ contains() และแนวทางทางเลือกเพื่อเพิ่มประสิทธิภาพ

6-1. พฤติกรรมภายในและความซับซ้อนของเวลา contains()

เมธอด contains() ค้นหาสตริงเป้าหมาย อย่างต่อเนื่องจากจุดเริ่มต้น เพื่อหาสตริงย่อย
ภายในอาศัยเมธอด indexOf() และความซับซ้อนในกรณีที่แย่ที่สุดคือ:

O(n * m)
– n = ความยาวของสตริงเป้าหมาย
– m = ความยาวของสตริงที่ค้นหา

ตัวอย่างการประมวลผลหนัก:

for (String line : hugeTextList) {
    if (line.contains("error")) {
        // processing
    }
}

สิ่งนี้สามารถส่งผลกระทบต่อประสิทธิภาพอย่างมากเมื่อทำซ้ำในลูปขนาดใหญ่

6-2. เทคนิคการปรับปรุงประสิทธิภาพเมื่อทำการค้นหาบ่อยครั้ง

เมื่อใช้ contains() ซ้ำในชุดข้อมูลขนาดใหญ่ เทคนิคต่อไปนี้สามารถเพิ่มความเร็วการประมวลผลได้:

• แปลงสตริงทั้งหมดเป็นตัวพิมพ์เล็กล่วงหน้า

แทนที่จะเรียก toLowerCase() ในแต่ละการเปรียบเทียบ ให้ทำการทำให้เป็นมาตรฐานล่วงหน้า:

List<String> normalizedList = originalList.stream()
    .map(String::toLowerCase)
    .collect(Collectors.toList());
• ใช้ Stream API กับ parallel() สำหรับการประมวลผลแบบขนาน

ใช้คอร์ CPU เพื่อเร่งความเร็วในการค้นหา:

List<String> result = hugeTextList.parallelStream()
    .filter(line -> line.contains("keyword"))
    .collect(Collectors.toList());
• ใช้ regular expressions สำหรับรูปแบบการค้นหาที่ซับซ้อน

หากเงื่อนไขซับซ้อนและสามารถแสดงออกใน regex เดียว Pattern อาจทำงานได้ดีกว่า:

Pattern pattern = Pattern.compile("error|fail|fatal");
for (String log : logs) {
    if (pattern.matcher(log).find()) {
        // matched
    }
}

6-3. การพิจารณาประสิทธิภาพหน่วยความจำและการนำกลับมาใช้ใหม่

การดำเนินการที่แปลงสตริงบ่อยครั้ง—เช่น toLowerCase() หรือ substring()—อาจสร้าง วัตถุสตริงที่ไม่จำเป็นจำนวนมาก ซึ่งส่งผลต่อการใช้งานหน่วยความจำ
นี่เป็นสิ่งสำคัญโดยเฉพาะสำหรับแอปพลิเคชันที่ทำงานนานหรือการประมวลผลฝั่งเซิร์ฟเวอร์

ประเด็นสำคัญ:

  • หลีกเลี่ยงการสร้างอินสแตนซ์สตริงที่ไม่จำเป็น
  • สำหรับชุดข้อมูลขนาดใหญ่ พิจารณาการบัฟเฟอร์หรือการประมวลผลแบบชิ้นส่วน
  • การแคชผลลัพธ์ contains() ที่ซ้ำอาจปรับปรุงประสิทธิภาพในบางกรณี

7. การเปรียบเทียบกับภาษาการเขียนโปรแกรมอื่นๆ

เมธอด contains() ของ Java ให้การจับคู่ส่วนย่อยของสตริงที่เรียบง่ายและเชื่อถือได้ แต่ภาษาอื่นๆ ให้คุณสมบัติที่คล้ายกันด้วยลักษณะเฉพาะของตัวเอง
ส่วนนี้เปรียบเทียบการตรวจสอบส่วนย่อยของสตริงใน Python, JavaScript, และ C# เพื่อเน้นความแตกต่างและความคล้ายคลึง

7-1. Python: การจับคู่บางส่วนแบบง่ายด้วยตัวดำเนินการ in

ใน Python คุณสามารถตรวจสอบการรวมส่วนย่อยของสตริงโดยใช้ตัวดำเนินการ in:

text = "Hello, Python!"
if "Python" in text:
    print("含まれています")

ไวยากรณ์นี้สามารถอ่านได้ง่ายมาก—เกือบเหมือนภาษาธรรมชาติ—และต้องใช้การเรียนรู้ขั้นต่ำ

ความแตกต่างและหมายเหตุ:

  • in เป็นตัวดำเนินการของภาษา ไม่ใช่เมธอด
  • Python ก็เป็น case-sensitive สำหรับการเปรียบเทียบสตริงเช่นกัน
  • None จะทำให้เกิดข้อยกเว้น; ต้องตรวจสอบ null

7-2. JavaScript: การจับคู่บางส่วนด้วย includes()

ใน JavaScript (ES6+) คุณสามารถใช้เมธอด includes():

const text = "JavaScript is fun";
console.log(text.includes("fun")); // true

เมธอดนี้คล้ายกับ contains() ของ Java มากและง่ายต่อการย้ายในใจ

ความแตกต่างและหมายเหตุ:

  • การส่ง undefined จะไม่โยนข้อยกเว้น; มันเพียงคืนค่า false
  • includes() ยังทำงานกับอาร์เรย์ ทำให้มีความยืดหยุ่นมากขึ้น

7-3. C#: Contains() คล้ายกับ Java

C# ก็มีเมธอด Contains() ที่มีพฤติกรรมคล้ายกับ Java:

string text = "Welcome to C#";
bool result = text.Contains("C#");

ความแตกต่างและหมายเหตุ:

  • Contains() ของ C# เป็น case-sensitive โดยค่าเริ่มต้น แต่คุณสามารถเพิกเฉย case โดยใช้ StringComparison.OrdinalIgnoreCase
  • การส่ง null จะกระตุ้น ArgumentNullException

7-4. ตารางเปรียบเทียบข้ามภาษา

LanguageExample SyntaxCase SensitivityNotes
Java"abc".contains("a")SensitiveThrows exception on null
Python"a" in "abc"SensitiveMost intuitive syntax
JavaScript"abc".includes("a")SensitiveAlso works for arrays
C#"abc".Contains("a")Sensitive (configurable)Comparison mode can be chosen

สรุป: เลือกไวยากรณ์ที่เหมาะสมสำหรับกรณีใช้งานของคุณ

แม้ว่าการตรวจสอบส่วนย่อยของสตริงจะเป็นความต้องการทั่วไปข้ามภาษา แต่แต่ละภาษาจะให้เมธอดหรือไวยากรณ์ของตัวเอง
contains() ของ Java ให้ความเสถียรและความชัดเจน ทำให้เหมาะสำหรับระบบองค์กรและแอปพลิเคชันที่บำรุงรักษาได้
ภาษาอย่าง Python และ JavaScript ให้ไวยากรณ์ที่ง่ายกว่าและกระชับกว่า ซึ่งอาจเหมาะสำหรับสคริปต์เบาๆ หรือการสร้างต้นแบบอย่างรวดเร็ว

โดยการเข้าใจทั้งแนวคิดทั่วไปและคุณสมบัติเฉพาะของแต่ละภาษา คุณจะสามารถเขียนโค้ดที่ปลอดภัยและมีประสิทธิภาพมากขึ้นข้ามภาษาต่างๆ

8. คำถามที่พบบ่อย (FAQ)

ด้านล่างนี้คือคำถามที่พบบ่อยเกี่ยวกับเมธอด contains() ของ Java—ช่วยให้คุณเข้าใจจุดที่ซับซ้อนและหลีกเลี่ยงหลุมพรางทั่วไป

คำถามที่ 1. contains() เป็น case-sensitive หรือไม่?

ใช่ มันเป็น case-sensitive
ตัวอย่างเช่น "Java".contains("java") คืนค่า false

วิธีแก้ไข:

String input = "Welcome to Java";
boolean result = input.toLowerCase().contains("java");

คำถามที่ 2. ฉันสามารถตรวจสอบการจับคู่บางส่วนโดยใช้ regular expressions ได้อย่างไร?

contains() ไม่รองรับ regular expressions.
ใช้ matches() หรือคลาส Pattern แทน。

ตัวอย่าง (ตรวจสอบรูปแบบตัวเลข):

import java.util.regex.Pattern;
import java.util.regex.Matcher;

String text = "注文番号: A123456";
Pattern pattern = Pattern.compile("A\\d+");
Matcher matcher = pattern.matcher(text);

if (matcher.find()) {
    System.out.println("パターンに一致しました。");
}

Q3. อะไรจะเกิดขึ้นถ้าฉันเรียก contains() บน null?

A NullPointerException จะถูกโยนออกมา.

String target = null;
System.out.println(target.contains("test")); // Error

วิธีแก้ไข:

if (target != null && target.contains("test")) {
    System.out.println("含まれています。");
}

Q4. อะไรจะเกิดขึ้นถ้าฉันส่งสตริงว่าง (“”) ไปยัง contains()?

มันจะคืนค่า true เสมอ.

String text = "Java";
System.out.println(text.contains("")); // true

แม้ว่าจะเป็นส่วนหนึ่งของสเปคอย่างเป็นทางการ พฤติกรรมนี้ไม่ค่อยมีประโยชน์และอาจทำให้เกิดบั๊กที่ไม่คาดคิดหากสตริงว่างไม่ใช่สิ่งที่ตั้งใจ。

Q5. contains() สามารถค้นหาคำหลักหลายคำพร้อมกันได้หรือไม่?

ไม่ แต่ละการเรียกตรวจสอบเฉพาะคำหลักเดียว.

String text = "本日はシステムエラーが発生しました";
if (text.contains("エラー") || text.contains("障害") || text.contains("失敗")) {
    System.out.println("問題が検出されました。");
}

แนวทางแบบไดนามิก:

List<String> keywords = Arrays.asList("エラー", "障害", "失敗");
boolean found = keywords.stream().anyMatch(text::contains);

Q6. เมื่อไหร่ควรใช้ contains() เทียบกับ indexOf()?

contains() คืนค่า boolean ในขณะที่ indexOf() คืนค่าดัชนีตัวเลข.

  • ใช้ contains() เมื่อคุณต้องการทราบเพียงว่าชุดย่อยมีอยู่หรือไม่
  • ใช้ indexOf() เมื่อคุณต้องการตำแหน่งด้วย
    String text = "Error: Disk full";
    if (text.contains("Error")) {
        int pos = text.indexOf("Error");
        System.out.println("Position: " + pos);
    }
    

9. สรุป

เมธอด contains() ของ Java เป็นเครื่องมือที่ทรงพลังและสะดวกสำหรับการกำหนดว่าชุดย่อยเฉพาะ มีอยู่ในสตริง หรือไม่
มันถูกใช้อย่างกว้างขวางในสถานการณ์ต่างๆ เช่น การตรวจสอบข้อมูลผู้ใช้ การวิเคราะห์ล็อก และการกรองข้อมูล。

ในบทความนี้ เราได้ครอบคลุม:

  • ไวยากรณ์พื้นฐานและค่าที่คืน
  • ความไวต่อตัวพิมพ์ใหญ่-เล็กและวิธีจัดการ
  • การจัดการ null และสตริงว่าง
  • ความแตกต่างจากเมธอดเปรียบเทียบสตริงอื่นๆ
  • กรณีใช้งานจริง: การตรวจสอบ การค้นหาล็อก การประมวลผล Stream
  • ข้อพิจารณาด้านประสิทธิภาพและเทคนิคการปรับปรุง
  • การเปรียบเทียบกับ Python, JavaScript, และ C#
  • คำถามที่พบบ่อยและเคล็ดลับการแก้ไขปัญหา

แม้ว่า contains() จะใช้งานง่ายและหลากหลาย แต่การใช้งานควรได้รับการประเมินอย่างรอบคอบในกรณีที่เกี่ยวข้องกับ ชุดข้อมูลขนาดใหญ่, การเรียกบ่อยครั้ง, หรือ เงื่อนไขค้นหาที่ซับซ้อน
โดยการรวมการทำให้ปกติ การประมวลผลแบบขนาน regex และกลยุทธ์การแคช คุณสามารถรักษาทั้งประสิทธิภาพและความสามารถในการอ่านได้。

เนื่องจาก contains() เป็นพื้นฐานสำหรับการทำงานกับสตริงใน Java เราหวังว่าบทความนี้จะช่วยให้คุณใช้งานได้อย่างปลอดภัยและมีประสิทธิภาพมากขึ้นในโครงการพัฒนาของคุณ