String** และ StringBuffer** ใช้จัดการข้อความแตกต่างกันที่สำคัญคือ **Immutability (ความไม่เปลี่ยนแปลง)**
ตารางเปรียบเทียบ
| ลำดับ | หัวข้อ | String | StringBuffer |
|---|---|---|---|
| 1 | พื้นฐาน | Immutable - ไม่สามารถเปลี่ยนค่าได้หลังสร้าง | Mutable - เปลี่ยนค่าได้ (append, insert, delete, reverse) |
| 2 | Thread Safety | Thread-safe เพราะ immutable | Thread-safe (methods เป็น synchronized) |
| 3 | ประสิทธิภาพ | เร็วกว่าสำหรับ read-only operations | ช้ากว่าเนื่องจาก synchronization overhead |
| 4 | Memory | เก็บใน String Constant Pool (ถ้า literal) และ Heap | เก็บใน Heap เท่านั้น |
| 5 | Concatenation | + operator สร้าง object ใหม่ทุกครั้ง | append() แก้ไข object เดียวกัน |
ตัวอย่าง String (Immutable)
public class StringExample {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = s1; // ชี้ไป object เดียวกัน
s1 = s1 + " World"; // สร้าง object ใหม่ "Hello World"
System.out.println("s1: " + s1); // Hello World
System.out.println("s2: " + s2); // Hello (ไม่เปลี่ยน)
// toUpperCase() คืน String ใหม่ ไม่แก้ไขต้นฉบับ
String upper = s1.toUpperCase();
System.out.println("upper: " + upper); // HELLO WORLD
System.out.println("s1: " + s1); // Hello World (ยังคงเดิม)
}
}
ตัวอย่าง StringBuffer (Mutable)
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hi");
System.out.println("Initial: " + sb); // Hi
sb.append(" Java 8"); // เพิ่มท้าย
System.out.println("After append: " + sb); // Hi Java 8
sb.insert(3, " there"); // แทรกที่ index 3
System.out.println("After insert: " + sb); // Hi there Java 8
sb.reverse(); // กลับลำดับ
System.out.println("After reverse: " + sb); // 8 avaJ ereht iH
sb.delete(0, 4); // ลบ index 0-3
System.out.println("After delete: " + sb); // avaJ ereht iH
}
}
StringBuilder: ตัวเลือกที่ 3 (Non-thread-safe, เร็วกว่า)
| Class | Mutable | Thread-Safe | Performance | ใช้เมื่อไหร่ |
|---|---|---|---|---|
| String | No | Yes (immutable) | Fast (read) | ค่าคงที่, key ใน Map, ไม่ต้องแก้ไข |
| StringBuffer | Yes | Yes (synchronized) | Medium | Multi-threaded environment ที่ต้องแก้ไข string |
| StringBuilder | Yes | No | Fast (fastest) | Single-threaded, string manipulation เยอะ (แนะนำส่วนใหญ่) |
ตัวอย่าง StringBuilder
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// ใช้ใน loop - มีประสิทธิภาพมากกว่า String +
for (int i = 0; i < 1000; i++) {
sb.append(i).append(",");
}
String result = sb.toString();
System.out.println("Length: " + result.length());
}
}
คำแนะนำการเลือกใช้
- String: ค่าคงที่, configuration, keys, ไม่ต้อง modify
- StringBuilder: **Default choice** สำหรับ string building/manipulation ใน single-thread (เร็วที่สุด)
- StringBuffer: เฉพาะเมื่อ share ระหว่าง multiple threads (legacy code, แทนที่ด้วย concurrent alternatives ในโค้ดใหม่)
ข้อเท็จจริงเกี่ยวกับ + Operator
Java Compiler จะแปลง String s = "a" + "b" + "c"; ให้เป็น StringBuilder อัตโนมัติ ตอน compile time แต่ใน loop จะสร้าง StringBuilder ใหม่ทุก iteration → ควรสร้าง StringBuilder นอก loop เอง