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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใด String จึงเปลี่ยนแปลงไม่ได้
- การสร้างข้อความด้วย StringBuilder
- เมธอดของ StringBuilder
- StringBuilder เทียบกับ StringBuffer