Boxing (การบรรจุ)
การแปลง Value Type → Reference Type (Object) แบบ Implicit (อัตโนมัติ)
int val = 12; object boxed = val; // Boxing: คัดลอกค่า 12 ไป Heap, boxed ชี้ไปที่นั่น
กระบวนการ: จองหน่วยความจำบน Heap → คัดลอกค่า Value type ไป → Reference ชี้ไปที่ Object บน Heap
Unboxing (การแปรงกลับ)
การแปลง Reference Type (Object) → Value Type แบบ Explicit (ต้อง Cast)
int unboxed = (int)boxed; // Unboxing: ตรวจสอบ Type แล้วคัดลอกค่ากลับ Stack
กระบวนการ: ตรวจสอบว่า Object เป็น Type ที่ถูกต้อง → คัดลอกค่าจาก Heap กลับ Stack
ตัวอย่างเพิ่มเติม: ArrayList (เก่า)
int a = 5; ArrayList list = new ArrayList(); list.Add(a); // Boxing: int → object int b = (int)list[0]; // Unboxing: object → int
ผลกระทบประสิทธิภาพ
- Boxing - จอง Heap, Copy ค่า, GC pressure
- Unboxing - Type check, Copy ค่า
- หลีกเลี่ยงด้วย Generics (
List<int>แทน ArrayList)
สรุป
| หัวข้อ | Boxing | Unboxing |
|---|---|---|
| ทิศทาง | Value → Reference | Reference → Value |
| Implicit/Explicit | Implicit | Explicit (Cast) |
| Memory | Stack → Heap | Heap → Stack |
| Performance | ช้ากว่า | ช้ากว่า |