Autoboxing และ Unboxing ใน java คืออะไร

Feb 19 2023
Autoboxing : Autoboxing เป็นคุณสมบัติใน java ที่แปลงประเภทข้อมูลดั้งเดิมเป็นวัตถุคลาส wrapper ที่สอดคล้องกันโดยอัตโนมัติ ตัวอย่างเช่น การแปลง int เป็นจำนวนเต็ม, double เป็น double เป็นต้น

กล่องอัตโนมัติ:

Autoboxing เป็นคุณสมบัติใน java ที่แปลงประเภทข้อมูลดั้งเดิมเป็นวัตถุคลาส wrapper ที่สอดคล้องกันโดยอัตโนมัติ ตัวอย่างเช่น การแปลง int เป็นจำนวนเต็ม, double เป็น double เป็นต้น

ตัวอย่างที่ง่ายที่สุดของ autoboxing คือ:

ตัวอักษร ch = 'c'

โดยที่ 'c' เป็นประเภทดั้งเดิม (ถ่าน) ที่ถูกแปลงเป็นคลาส wrapper ที่สอดคล้องกัน (ตัวอักษร) โดยอัตโนมัติ

สิ่งนี้จะมีประโยชน์ที่ไหนระหว่างการฝึกเขียนโค้ด

การใส่กล่องอัตโนมัติมีประโยชน์กับรายการ (เช่น ArrayList, LinkedList เป็นต้น) ลองมาดูตัวอย่าง ArrayList

ดังที่เราทราบ ArrayList มีเฉพาะวัตถุเท่านั้น ไม่ใช่ประเภทข้อมูลดั้งเดิม ซึ่งหมายความว่าเราสามารถจัดเก็บวัตถุของคลาส wrapper ได้ แต่เราไม่สามารถจัดเก็บประเภทข้อมูลดั้งเดิมภายใน ArrayList ตัวอย่างเช่นArrayList<Integer> arr = new ArrayList<Integer>() ; สิ่งนี้ใช้ได้ แต่ArrayList<int> arr = new ArrayList<int>() ; สิ่งนี้ไม่ถูกต้อง

ลองพิจารณาข้อมูลโค้ดที่เขียนด้านล่าง

อธิบาย Autoboxing (รูปที่ 1. a)

แม้ว่าเราจะเพิ่มค่า int เป็นประเภทดั้งเดิม แทนที่จะเป็นอ็อบเจกต์จำนวนเต็ม แต่โค้ดก็คอมไพล์สำเร็จและไม่สร้างข้อผิดพลาดในการคอมไพล์ เนื่องจากคอมไพเลอร์ JVM แปลงรหัสก่อนหน้าเป็นรหัสต่อไปนี้ :

วิธีที่คอมไพเลอร์แปลงรหัสของรูปที่ 1.a ระหว่างการคอมไพล์ (รูปที่ 1. b)

ที่นี่ การแปลง int primitive type เป็น Integer wrapper class ระหว่างการดำเนินการเพิ่มเรียกว่า Autoboxing

แกะกล่อง:

Unboxing เป็นคุณสมบัติใน java ที่แปลงวัตถุคลาส wrapper เป็นประเภทข้อมูลดั้งเดิมที่สอดคล้องกันโดยอัตโนมัติ ตัวอย่างเช่น การแปลง Integer เป็น int, Double เป็น double เป็นต้น

Unboxing เป็นกระบวนการย้อนกลับของ Autoboxing

สิ่งนี้จะมีประโยชน์ที่ไหนระหว่างการฝึกเขียนโค้ด

การแกะกล่องช่วยโปรแกรมเมอร์ เนื่องจากจะทำให้การดำเนินการบางอย่าง เช่น การดำเนินการทางคณิตศาสตร์บนโครงสร้างข้อมูลที่จัดเก็บวัตถุคลาส wrapper เช่น รายการ เป็นเรื่องง่าย ตัวอย่างเช่น:

อธิบายการแกะกล่อง (รูปที่ 2. ก)

แม้ว่าค่าที่เก็บอยู่ภายในรายการ (arr) จะเป็นประเภทจำนวนเต็ม ในขณะที่เรากำลังเพิ่มค่าเหล่านั้นให้กับผลรวมของตัวแปรประเภท int ค่าจำนวนเต็มจะถูกแปลงเป็น int โดยอัตโนมัติ ซึ่งจะทำให้โปรแกรมเมอร์สามารถดำเนินการทางคณิตศาสตร์ได้ง่าย

โค้ดคอมไพล์สำเร็จและไม่สร้างข้อผิดพลาดในการคอมไพล์ เนื่องจากคอมไพเลอร์ JVM แปลงรหัสก่อนหน้าเป็นรหัสต่อไปนี้ :

คอมไพเลอร์แปลงรหัสของรูปที่ 2.a ระหว่างการคอมไพล์อย่างไร (รูปที่ 2. b)

ที่นี่ การแปลง int (ประเภทดั้งเดิม) เป็น Integer (วัตถุคลาส Wrapper) เรียกว่า Unboxing

ตารางต่อไปนี้มีประโยชน์เนื่องจากแสดงประเภทข้อมูลดั้งเดิมพร้อมคลาสของ wrapper ที่สอดคล้องกัน

ตารางความสัมพันธ์ระหว่างประเภทดั้งเดิมและคลาสของ wrapper