Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความแตกต่างระหว่าง String และ StringBuffer ใน Java

String** และ StringBuffer** ใช้จัดการข้อความแตกต่างกันที่สำคัญคือ **Immutability (ความไม่เปลี่ยนแปลง)**

ตารางเปรียบเทียบ

ลำดับหัวข้อStringStringBuffer
1พื้นฐานImmutable - ไม่สามารถเปลี่ยนค่าได้หลังสร้างMutable - เปลี่ยนค่าได้ (append, insert, delete, reverse)
2Thread SafetyThread-safe เพราะ immutableThread-safe (methods เป็น synchronized)
3ประสิทธิภาพเร็วกว่าสำหรับ read-only operationsช้ากว่าเนื่องจาก synchronization overhead
4Memoryเก็บใน String Constant Pool (ถ้า literal) และ Heapเก็บใน Heap เท่านั้น
5Concatenation+ 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, เร็วกว่า)

ClassMutableThread-SafePerformanceใช้เมื่อไหร่
StringNoYes (immutable)Fast (read)ค่าคงที่, key ใน Map, ไม่ต้องแก้ไข
StringBufferYesYes (synchronized)MediumMulti-threaded environment ที่ต้องแก้ไข string
StringBuilderYesNoFast (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 เอง