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

StringBuilder เทียบกับ StringBuffer

ข้อแลกเปลี่ยนด้านความปลอดภัยของเธรด

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

คลาสที่เปลี่ยนแปลงได้สองคลาส

Java มีคลาสสตริงที่เปลี่ยนแปลงได้สองคลาส ได้แก่ StringBuilder และ StringBuffer ส่วนติดต่อการใช้งานเกือบเหมือนกันทั้งหมด แต่แตกต่างกันในประเด็นสำคัญประการหนึ่งคือ ความปลอดภัยต่อเธรด

ส่วนติดต่อการใช้งานเหมือนกัน

ทั้งสองคลาสมี append insert delete reverse และเมธอดอื่น ๆ เช่นเดียวกัน โดยทั่วไปโค้ดที่ใช้คลาสหนึ่งสามารถเปลี่ยนไปใช้อีกคลาสได้ เพียงเปลี่ยนชื่อชนิดเท่านั้น

public class Main {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("Hello").append(", ").append("World");
        System.out.println(sb);
    }
}

StringBuffer มีการทำงานประสานกัน

เมธอดของ StringBuffer มีการทำงานแบบประสานกัน หมายความว่าเธรดหลายตัวสามารถแก้ไขอินสแตนซ์เดียวกันได้อย่างปลอดภัย ความปลอดภัยนี้แลกมาด้วยต้นทุนด้านประสิทธิภาพเล็กน้อย

public class Main {
    public static void main(String[] args) {
        StringBuffer buffer = new StringBuffer("thread-safe");
        buffer.append("!");
        System.out.println(buffer);
    }
}

StringBuilder ไม่มีการทำงานประสานกัน

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

public class Main {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder("fast");
        builder.append("!");
        System.out.println(builder);
    }
}

ควรใช้ StringBuilder เมื่อใด

ใช้ StringBuilder ในกรณีทั่วไป เช่น การสร้างสตริงภายในเมธอดหรือเธรดเดียว นี่เป็นตัวเลือกเริ่มต้นสำหรับโค้ดทั่วไปเกือบทั้งหมด

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            sb.append("#");
        }
        System.out.println(sb);
    }
}

ควรใช้ StringBuffer เมื่อใด

เลือกใช้ StringBuffer เฉพาะเมื่ออินสแตนซ์ตัวสร้างเดียวกันถูกใช้ร่วมกันและแก้ไขโดยเธรดหลายตัวจริง ๆ ซึ่งในทางปฏิบัติพบได้ไม่บ่อย

public class Main {
    public static void main(String[] args) {
        StringBuffer shared = new StringBuffer("log: ");
        shared.append("event A; ");
        shared.append("event B");
        System.out.println(shared);
    }
}

ตัวแปรเฉพาะที่ไม่ถูกใช้ร่วมกัน

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

public class Main {
    static String build() {
        StringBuilder sb = new StringBuilder();
        sb.append("local only");
        return sb.toString();
    }
    public static void main(String[] args) {
        System.out.println(build());
    }
}

ความแตกต่างด้านประสิทธิภาพ

ภาระจากการซิงโครไนซ์ใน StringBuffer ทำให้ทำงานช้าลงเมื่อใช้งานกับเธรดเดียว สำหรับลูปที่ทำงานซ้ำอย่างเข้มข้น StringBuilder ให้ประสิทธิภาพที่ดีกว่า

public class Main {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append('x');
        }
        System.out.println("Built length: " + sb.length());
    }
}

หมายเหตุทางประวัติ

StringBuffer มีมาก่อนใน Java ยุคแรก ส่วน StringBuilder ถูกเพิ่มเข้ามาใน Java 5 ในฐานะทางเลือกที่เร็วกว่าและไม่ซิงโครไนซ์สำหรับกรณีเธรดเดียวที่พบได้ทั่วไป

การเลือกใช้อย่างถูกต้อง

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

public class Main {
    public static void main(String[] args) {
        StringBuilder result = new StringBuilder();
        result.append("Use StringBuilder ").append("by default");
        System.out.println(result);
    }
}

ทั้งสองแปลงเป็น String

ทั้งสองคลาสสร้าง String ที่ไม่เปลี่ยนแปลงผ่าน toString() ตัวเลือกที่แตกต่างกันมีผลเฉพาะการประกอบข้อความ ไม่ใช่ผลลัพธ์สุดท้าย

public class Main {
    public static void main(String[] args) {
        String a = new StringBuilder("one").toString();
        String b = new StringBuffer("two").toString();
        System.out.println(a + " " + b);
    }
}

ตรวจสอบความเข้าใจสั้น ๆ

ความแตกต่างหลักระหว่าง StringBuilder และ StringBuffer คืออะไร

ทบทวน

คุณได้เรียนรู้ข้อแลกเปลี่ยนต่าง ๆ ดังนี้

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

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

บทเรียน “StringBuilder เทียบกับ StringBuffer” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “StringBuilder เทียบกับ StringBuffer”

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

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

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

บทเรียน “StringBuilder เทียบกับ StringBuffer” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุใด String จึงเปลี่ยนแปลงไม่ได้
  2. การสร้างข้อความด้วย StringBuilder
  3. เมธอดของ StringBuilder
  4. StringBuilder เทียบกับ StringBuffer
← กลับไปที่ Java Academy