เวลาทำงานกับอาร์เรย์ใน Java อาจต้องการสร้าง copy ของอาร์เรย์ เช่น ร้านกาแฟสร้างเมนูตามฤดูกาล ต้องการ copy เมนูเดิมมาแก้ไข
ใน Java มีหลายวิธี copy array บทช่วยสอนนี้สำรวจ 4 วิธีทั่วไป อธิบายบรรทัดต่อบรรทัด จบแล้วคุณจะ master การ copy array ใน Java
อาร์เรย์ใน Java
อาร์เรย์ใน Java = container เก็บค่าชนิดเดียว เช่น รายชื่อหนังสือ หรือคะแนนผู้เล่นดาร์ท
อาร์เรย์มีประโยชน์ตอนทำงานกับค่าคล้ายกันเยอะ เพราะเก็บรวมใน collection เดียว ทำให้โค้ดกระชับ และรันเมธอดเดียวกับค่าหลายตัวพร้อมกัน
ตัวอย่างอาร์เรย์เมนูกาแฟ:
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
อาร์เรย์ coffees เก็บ String 6 ค่า แต่ละ item มี index เริ่ม 0 ใช้อ้างอิงแต่ละรายการได้
1. คัดลอกด้วย Assignment Operator (Shallow Copy)
วิธีทั่วไป: ใช้ assignment operator (=) กำหนดค่าอาร์เรย์เดิมให้ตัวแปรใหม่ -> สร้าง copy
กลับไปร้านกาแฟ: copy อาร์เรย์ coffees เป็น summer_coffees สำหรับเมนูฤดูร้อน
class CopyAssignment {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = coffees;
for (String c: summer_coffees) {
System.out.print(c + ",");
}
}
}
ผลลัพธ์: Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White,
อธิบาย: ประกาศ coffees แล้ว summer_coffees = coffees (assignment) for-each พิมพ์ summer_coffees
ข้อจำกัด: สร้าง Shallow Copy ทั้ง 2 ตัวแปรอ้างอิง object เดียวกัน เปลี่ยนค่าในอันหนึ่ง -> อันอื่นเปลี่ยนตาม (เช่นเปลี่ยน Latte -> Summer Latte ใน summer_coffees จะเปลี่ยนใน coffees ด้วย)
2. คัดลอกด้วย For Loop (Deep Copy)
วิธีแรกสร้าง shallow copy เพราะ assign object เดียวกัน ต้องการ Deep Copy = copy ค่า สร้าง object ใหม่ แยกจากเดิม เปลี่ยน array ใหม่ไม่กระทบเดิม
วิธีหนึ่ง: ใช้ for loop วนอ่านค่าเดิม สร้าง array ใหม่
copy coffees -> summer_coffees แบบ deep copy (จะแก้ไขเมนูฤดูร้อน)
import java.util.Arrays;
class LoopCopy {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = new String[6];
for (int i = 0; i < coffees.length; ++i) {
summer_coffees[i] = coffees[i];
}
System.out.println(Arrays.toString(summer_coffees));
}
}
ผลลัพธ์: [Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
ขั้นตอน: 1) import Arrays (toString) 2) ประกาศ coffees 3) สร้าง summer_coffees ขนาด 6 4) for loop วน coffees.length ครั้ง 5) summer_coffees[i] = coffees[i] copy ค่าแต่ละ index 6) toString() พิมพ์
3. ใช้ copyOfRange() Method
Arrays.copyOfRange() ใน java.util.Arrays คัดลอกช่วงของอาร์เรย์
ไวยากรณ์:
import java.util.Arrays; DataType[] newArray = Arrays.copyOfRange(oldArray, indexPos, length);
พารามิเตอร์:
- DataType: ชนิดข้อมูล array ใหม่
- newArray: ชื่อ array ใหม่
- oldArray: array ต้นทาง
- indexPos: เริ่ม copy ที่ index นี้ใน oldArray
- length: จำนวนค่าที่จะ copy
ตัวอย่าง: copy ทั้งอาร์เรย์
import java.util.Arrays;
class CopyUsingRange {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = Arrays.copyOfRange(coffees, 0, coffees.length);
System.out.println("Summer coffees: " + Arrays.toString(summer_coffees));
}
}
ผลลัพธ์: Summer coffees: [Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
อธิบาย: import Arrays copyOfRange(coffees, 0, coffees.length) = copy จาก index 0 จนครบ length ทั้งอาร์เรย์
4. ใช้ arraycopy() Method
System.arraycopy() ในคลาส System คัดลอกข้อมูลจาก array ไป array อีกอัน มี options ปรับแต่งได้มาก
ไวยากรณ์:
System.arraycopy(sourceArray, startingPos, newArray, newArrayStartingPos, length);
5 พารามิเตอร์:
- sourceArray: array ต้นทาง
- startingPos: index เริ่ม copy ใน source
- newArray: array ปลายทาง
- newArrayStartingPos: index เริ่มวางใน newArray
- length: จำนวน elements ที่ copy
ตัวอย่าง: copy ทั้งอาร์เรย์
import java.util.Arrays;
class ArrayCopyMethod {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = new String[6];
System.arraycopy(coffees, 0, summer_coffees, 0, coffees.length);
System.out.println("Summer coffees: " + Arrays.toString(summer_coffees));
}
}
ผลลัพธ์: Summer coffees: [Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
ขั้นตอน: 1) import Arrays 2) ประกาศ coffees 3) summer_coffees new String[6] 4) arraycopy(coffees, 0, summer_coffees, 0, coffees.length) copy ทั้งหมด 5) พิมพ์ผลลัพธ์
สรุป
การ copy array เป็น operation ทั่วไป บทช่วยสอนนี้ครอบคลุม 4 วิธี:
- Assignment operator - Shallow copy (อ้างอิง object เดียวกัน)
- For loop - Deep copy (สร้าง object ใหม่ copy ค่า)
- Arrays.copyOfRange() - Copy ช่วงที่กำหนด
- System.arraycopy() - Copy แบบ low-level ปรับแต่งได้ละเอียด
ตอนนี้คุณพร้อม copy arrays ใน Java อย่างมืออาชีพแล้ว!