0Pricing
Java Academy · บทเรียน

StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ

ใช้ StringBuilder สร้างสตริงอย่างมีประสิทธิภาพภายในลูปและการจัดรูปแบบที่ซับซ้อน

StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

StringBuilder สำหรับการต่ออย่างมีประสิทธิภาพ

StringBuilder เป็นทางเลือกที่เปลี่ยนแปลงได้แทน String สำหรับการสร้างข้อความทีละส่วน โดยหลีกเลี่ยงการสร้างอ็อบเจ็กต์ String ชั่วคราวจำนวนมาก

StringBuilder เทียบกับการต่อ String

เมื่อต้องต่อ String หลายรายการ โดยเฉพาะภายในลูป StringBuilder จะทำงานได้เร็วกว่าอย่างมาก เพราะแก้ไขบัฟเฟอร์อักขระภายในแทนการสร้างอ็อบเจ็กต์ใหม่

// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i + ","; // 1000 new String objects!
}

// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String created

ส่วนติดต่อ StringBuilder

เมธอดสำคัญ ได้แก่ append, insert, delete, replace, reverse, toString, ความยาว, charAt และ setCharAt

StringBuilder sb = new StringBuilder("Hello");

sb.append(", World");     // Hello, World
sb.insert(5, "!");        // Hello!, World
sb.delete(5, 6);           // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse();               // avaJ ,olleH
sb.reverse();               // Hello, Java

System.out.println(sb);         // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // H

การเชื่อมโยงการเรียก append

append และเมธอดอื่น ๆ ที่เปลี่ยนแปลงข้อมูลจะส่งคืน this ทั้งหมด จึงสามารถเชื่อมโยงการเรียกแบบต่อเนื่องได้

StringBuilder html = new StringBuilder()
    .append("<div class=\"card\">")
    .append("<h2>").append("Product Title").append("</h2>")
    .append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
    .append("<button>Add to Cart</button>")
    .append("</div>");

System.out.println(html.toString());

ความจุเริ่มต้น

กำหนดขนาดเริ่มต้นของ StringBuilder ตามความจุที่คาดว่าจะใช้ เพื่อหลีกเลี่ยงการปรับขนาดอาร์เรย์ภายในและเพิ่มประสิทธิภาพเมื่อจัดการกับ String ขนาดใหญ่

// Default capacity: 16 chars
StringBuilder small = new StringBuilder();

// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);

for (int i = 1; i <= 10; i++) {
    report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}

System.out.println(report.toString().substring(0, 30));
// "  1. Record 0001: processed OK"

deleteCharAt และการลบเฉพาะส่วน

deleteCharAt จะลบอักขระหนึ่งตัว ส่วน delete(start, end) จะลบช่วงข้อมูล การดำเนินการเหล่านี้มีความซับซ้อน O(n) เนื่องจากต้องเลื่อนข้อมูลในอาร์เรย์

StringBuilder sb = new StringBuilder("Hello, World!");

sb.deleteCharAt(5);     // removes comma: "Hello World!"
sb.delete(5, 6);         // removes space: "HelloWorld!"

System.out.println(sb); // HelloWorld!

// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!

การสร้าง CSV

รูปแบบการใช้งานจริง: สร้างบรรทัด CSV ด้วย StringBuilder พร้อมจัดการตัวคั่นอย่างถูกต้อง

import java.util.List;

static String toCsv(List<String> values) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < values.size(); i++) {
        if (i > 0) sb.append(',');
        sb.append(escapeCsv(values.get(i)));
    }
    return sb.toString();
}

static String escapeCsv(String s) {
    if (s.contains(",") || s.contains("\""))
        return "\"" + s.replace("\"", "\"\"") + "\"";
    return s;
}

System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30

StringJoiner สำหรับเอาต์พุตที่คั่นด้วยตัวแบ่ง

StringJoiner ช่วยให้การเชื่อมองค์ประกอบด้วยตัวแบ่งง่ายขึ้น โดยสามารถกำหนดคำนำหน้าและคำต่อท้ายได้ และไม่ต้องจัดการตัวคั่นด้วยตนเอง

import java.util.StringJoiner;

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]

// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie

// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
    .collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)

StringBuilder เทียบกับ StringBuffer

StringBuffer เป็นรุ่นของ StringBuilder ที่ซิงโครไนซ์และปลอดภัยสำหรับเธรด แต่ทำงานช้ากว่าเนื่องจากต้องล็อก โปรดใช้ StringBuilder ในบริบทที่มีเธรดเดียว ซึ่งครอบคลุมกรณีส่วนใหญ่ถึง 99%

// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");

// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");

// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharing

การกลับลำดับและการตรวจสอบพาลินโดรม

reverse() ในตัวของ StringBuilder ทำให้การตรวจสอบพาลินโดรมทำได้อย่างกระชับและสวยงาม

static boolean isPalindrome(String s) {
    String cleaned = s.toLowerCase()
        .replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
    String reversed = new StringBuilder(cleaned).reverse().toString();
    return cleaned.equals(reversed);
}

System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car"));                      // false
System.out.println(isPalindrome("Was it a car or a cat I saw?"));    // true

การใช้งานจริง: ตัวสร้างคำสั่งค้นหา SQL

สร้างคำสั่งค้นหา SQL แบบไดนามิกด้วย StringBuilder โดยเพิ่มส่วนเงื่อนไขตามความจำเป็น

static String buildQuery(String category, Double minPrice, Double maxPrice) {
    StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
    if (category != null)
        sql.append(" AND category = '" + category + "'");
    if (minPrice != null)
        sql.append(" AND price >= ").append(minPrice);
    if (maxPrice != null)
        sql.append(" AND price <= ").append(maxPrice);
    sql.append(" ORDER BY name");
    return sql.toString();
}

System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY name

ตรวจสอบอย่างรวดเร็ว

เหตุใดการต่อ String ด้วย + ภายในลูปจึงไม่มีประสิทธิภาพ

สรุป: StringBuilder สำหรับการต่ออย่างมีประสิทธิภาพ

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

  • StringBuilder สามารถเปลี่ยนแปลงได้ append/insert/delete จะเปลี่ยนแปลงบัฟเฟอร์ภายใน
  • ใช้ StringBuilder ในลูปเพื่อหลีกเลี่ยงการสร้าง String ที่มีความซับซ้อน O(n²)
  • เมธอดที่เปลี่ยนแปลงข้อมูลทั้งหมดจะส่งคืน this จึงสามารถเชื่อมโยงการเรียกแบบต่อเนื่องได้
  • กำหนดขนาดเริ่มต้นของ StringBuilder ตามความจุที่คาดไว้ เพื่อลดการปรับขนาดภายใน
  • StringJoiner และ String.join สะดวกสำหรับเอาต์พุตที่คั่นด้วยตัวแบ่ง
  • StringBuffer เป็นทางเลือกที่ซิงโครไนซ์และปลอดภัยสำหรับเธรด แต่ทำงานช้ากว่า

คำถามที่พบบ่อย

บทเรียน “StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ”

ใช้ StringBuilder สร้างสตริงอย่างมีประสิทธิภาพภายในลูปและการจัดรูปแบบที่ซับซ้อน คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ความไม่เปลี่ยนแปลงของ String และ String Pool
  2. StringBuilder สำหรับการต่อสตริงอย่างมีประสิทธิภาพ
  3. บล็อกข้อความและ String.format
  4. นิพจน์ทั่วไปด้วย Pattern และ Matcher
← กลับไปที่ Java Academy