มีความแตกต่างหลักสามประการระหว่างอาร์เรย์ JAVA และคลาสคอนเทนเนอร์: ประสิทธิภาพ ประเภท และความสามารถในการบันทึกประเภทพื้นฐาน ใน JAVA อาร์เรย์เป็นวิธีที่มีประสิทธิภาพที่สุดในการจัดเก็บและเข้าถึงลำดับการอ้างอิงอ็อบเจ็กต์แบบสุ่ม อาร์เรย์เป็นลำดับเชิงเส้นอย่างง่าย ซึ่งทำให้การเข้าถึงองค์ประกอบรวดเร็วมาก แต่ราคาที่จ่ายไปคือขนาดของอาเรย์ได้รับการแก้ไขแล้วและไม่สามารถเปลี่ยนแปลงได้ตลอดอายุการใช้งาน
ต้องขอบคุณกลไกการบรรจุภัณฑ์แบบทั่วไปและแบบอัตโนมัติ ทำให้ตอนนี้คอนเทนเนอร์สามารถนำไปใช้กับประเภทดั้งเดิมได้เกือบจะง่ายดายเหมือนกับอาร์เรย์ ทั้งอาร์เรย์และคอนเทนเนอร์สามารถป้องกันไม่ให้คุณใช้งานในทางที่ผิดได้ในระดับหนึ่ง หากสิ่งเหล่านั้นอยู่นอกขอบเขต คุณจะได้รับ RuntimeException ข้อได้เปรียบที่เหลืออยู่เพียงอย่างเดียวของอาร์เรย์คือประสิทธิภาพ อย่างไรก็ตาม หากคุณต้องการแก้ไขปัญหาทั่วไป อาร์เรย์อาจมีข้อจำกัดมากเกินไป ดังนั้นในกรณีนี้คนส่วนใหญ่จะยังคงเลือกคอนเทนเนอร์
ดังนั้น หากคุณใช้ Java เวอร์ชันล่าสุด คุณควรเลือกใช้คอนเทนเนอร์มากกว่าอาร์เรย์ โปรแกรมควรได้รับการปรับโครงสร้างใหม่เป็นอาร์เรย์ก็ต่อเมื่อประสิทธิภาพได้รับการพิสูจน์แล้วว่าเป็นปัญหาและการเปลี่ยนไปใช้อาร์เรย์ช่วยปรับปรุงประสิทธิภาพ
【การเริ่มต้น】
JAVA มีกฎระเบียบที่เข้มงวดมากเกี่ยวกับการเริ่มต้นอาร์เรย์ ซึ่งสามารถป้องกันการใช้อาร์เรย์ในทางที่ผิดได้อย่างมีประสิทธิภาพ หากมีข้อผิดพลาดในการเริ่มต้น คุณจะได้รับ CompileException แทน RuntimeException โดยตรง ไม่สามารถทำอะไรกับการอ้างอิงอาเรย์นี้ได้จนกว่าอาเรย์จะเริ่มต้นได้อย่างถูกต้อง
คำจำกัดความของอาร์เรย์ประกอบด้วย int[] array และ int array[] โดยทั่วไปแล้ว สไตล์แรกจะใช้เพื่อแยกประเภทออกจากชื่อตัวแปร
มีสองวิธีในการเริ่มต้นอาร์เรย์ การเริ่มต้นแบบคงที่ และการเริ่มต้นแบบไดนามิก ต้องระบุความยาวในระหว่างการเริ่มต้น ความยาวของมิติแรกของอาร์เรย์หลายมิติจะต้องชี้ให้เห็น และจะต้องกำหนดจากมิติสูงไปต่ำ การดำเนินการเริ่มต้นสามารถอยู่ที่ใดก็ได้ในโค้ด แต่เมธอด {} จะปรากฏเฉพาะตำแหน่งที่สร้างอาร์เรย์เท่านั้น ดูโปรแกรมสำหรับวิธีการเริ่มต้นเฉพาะ:
arrayA = new int[10]; //การเริ่มต้นแบบไดนามิก
System.out.println("ความยาว arrayA: " + arrayA.length);
int[] arrayC = ใหม่ int[]{1,2,3,4};
System.out.println("ความยาว arrayC: " + arrayC.length);
//int[] arrayD = new int[1]{1}; // ไม่สามารถกำหนดค่าเริ่มต้น ขนาด และค่าเริ่มต้นไม่ถูกต้องได้ในเวลาเดียวกัน
int[][] arrayE = ใหม่ int[1][];
System.out.println("ความยาว arrayE: " + arrayE.length);
//int[][] arrayF = new int[][2]; //ควรระบุความยาวของมิติสูงก่อน
int[][] arrayG = ใหม่ int[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
System.out.println("ความยาว arrayG: " + arrayG.length);
int[][][] arrayH = ใหม่ int[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12} }};
System.out.println("ความยาว arrayH: " + arrayH.length);
dummyArray[] arrayI = {new dummyArray(),new dummyArray()}; // ประเภทอาร์เรย์ที่กำหนดเอง
System.out.println("ความยาว arrayI: " + arrayI.length);
System.out.println("arrayI[1]: " + arrayI[1].getValue());
dummyArray[] arrayK = dummyArray ใหม่ [5];
System.out.println("arrayK[0]: " + arrayK[0]); //null
สำหรับ (int i = 0; i < arrayK.length; i++){
arrayK[i] = dummyArray ใหม่();
-
System.out.println("arrayK[0]: " + arrayK[0].getValue()); //2
-
-
คลาสจำลอง Array{
อุณหภูมิ int คงที่ส่วนตัว
int arrayValue สุดท้ายส่วนตัว = temp ++;
สาธารณะ int getValue () {
กลับค่าอาร์เรย์;
-
-
เอาท์พุท:
ความยาวอาร์เรย์ B: 5
ความยาวอาร์เรย์A: 10
ความยาวอาร์เรย์ C: 4
ความยาวอาร์เรย์E: 1
ความยาว arrayG: 3
ความยาวอาร์เรย์H: 1
ความยาวอาร์เรย์ฉัน: 2
อาร์เรย์I[1]: 1
arrayK[0]: โมฆะ
อาร์เรย์K[0]: 2
int[][] arrayB = ใหม่ int[10][];
System.out.println("ความยาว arrayB: " + arrayB.length);
int[][] arrayC = ใหม่ int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,};//ใส่เครื่องหมายจุลภาคตามหลัง
System.out.println("ความยาว arrayC: " + arrayC.length);
int[][] arrayD = ใหม่ int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,{}};
System.out.println("ความยาว arrayD: " + arrayD.length);
-
-
เอาท์พุท:
ความยาวอาร์เรย์A: 15
ความยาวอาร์เรย์ B: 10
ความยาวอาร์เรย์ C: 3
ความยาวอาร์เรย์D: 4
[การมอบหมายและการอ้างอิง]
เมื่ออาร์เรย์ JAVA ถูกเตรียมใช้งาน จะมีเพียงการอ้างอิงถึงอาร์เรย์เท่านั้น และไม่มีการจัดสรรพื้นที่เก็บข้อมูลให้กับอาร์เรย์ ดังนั้นการคัดลอกระหว่างอาร์เรย์จึงไม่สามารถใช้การกำหนด "=" เพียงอย่างเดียวได้ เนื่องจากมีการดำเนินการกับอ็อบเจ็กต์เดียวกัน ขั้นตอนต่อไปนี้:
-
-
เอาท์พุท:
ฉัน testA ฉันไม่มีการเปลี่ยนแปลง:testA
ฉันชื่อ arrayA ฉันไม่เปลี่ยนแปลง:arrayB มีการเปลี่ยนแปลง
[สำเนาอาร์เรย์]
วิธีคัดลอกอาร์เรย์ใน Java:
1. ใช้ FOR loop เพื่อคัดลอกองค์ประกอบทั้งหมดหรือที่ระบุซึ่งมีประสิทธิภาพน้อยกว่า
2. ใช้วิธีโคลนเพื่อรับค่าของอาร์เรย์แทนการอ้างอิง อย่างไรก็ตาม โคลนไม่สามารถคัดลอกองค์ประกอบที่ระบุได้และมีความยืดหยุ่นต่ำ
3. ใช้เมธอด System.arraycopy(src, srcPos, dest, destPos, length) ไลบรารีคลาสมาตรฐานของ Java มีเมธอดคงที่ System.arraycopy() การใช้มันเพื่อคัดลอกอาร์เรย์จะเร็วกว่าระบบ for loop มาก .arraycopy() มีไว้สำหรับทุกประเภทที่มีการโอเวอร์โหลด ทั้งอาร์เรย์ประเภทพื้นฐานและอาร์เรย์วัตถุสามารถคัดลอกได้โดยใช้ System.arraycopy() แต่อาร์เรย์วัตถุจะคัดลอกการอ้างอิงเท่านั้น และจะไม่มีสำเนาของวัตถุสองชุด สิ่งนี้เรียกว่าสำเนาตื้น
src: อาร์เรย์ต้นทาง;
srcPos: ตำแหน่งเริ่มต้นของอาร์เรย์ต้นทางที่จะคัดลอก
ปลายทาง: อาร์เรย์ปลายทาง;
destPos: ตำแหน่งเริ่มต้นที่วางอาร์เรย์ปลายทาง
length: ความยาวของสำเนา
หมายเหตุ: System.arraycopy() จะไม่ทำการบรรจุภัณฑ์อัตโนมัติและการแตกบรรจุภัณฑ์อัตโนมัติ ดังนั้น อาร์เรย์ทั้งสองต้องเป็นประเภทเดียวกันหรือสามารถแปลงเป็นอาร์เรย์ประเภทเดียวกันได้ ในเวลาเดียวกัน สามารถใช้วิธีนี้เพื่อคัดลอกอาร์เรย์ได้ด้วย
การทดสอบ int [] = {0,1,2,3,4,5,6};
System.arraycopy(ทดสอบ,0,ทดสอบ,3,3);
ผลลัพธ์คือ: {0,1,2,0,1,2,6};
ขั้นตอนการทดสอบมีดังนี้:
// วิธีการโคลน
int[] arrayB = ใหม่ int[9];
arrayB = array.clone();
//ทดสอบ
อาร์เรย์B[1] = 19;
สำหรับ (int i = 0; i < arrayB.length; i++){
System.out.print(อาร์เรย์B[i] + ",");
-
System.out.println("");
สำหรับ (int i = 0; i < array.length; i++){
System.out.print(อาร์เรย์[i] + ",");
-
System.out.println("");
//System.arrayCopy วิธีการ
int[] arrayC = ใหม่ int[9];
System.arraycopy(อาร์เรย์, 0, arrayC, 0, arrayC.length);
//ทดสอบ
อาร์เรย์C[1] = 19;
สำหรับ (int i = 0; i < arrayC.length; i++){
System.out.print(arrayC[i] + ",");
-
System.out.println("");
สำหรับ (int i = 0; i < array.length; i++){
System.out.print(อาร์เรย์[i] + ",");
-
-
-
สตริง[][] arrayD = {{"a","b" ค็อกเทลc","d"}};
สตริง[][] arrayE = {{"a","b" ค็อกเทลc","d"}};
System.out.println(Arrays.deepEquals(arrayD, arrayE));
-
-
[ส่งคืนอาร์เรย์]
C และ C++ ไม่สามารถส่งคืนอาร์เรย์ได้ มีเพียงตัวชี้ไปยังอาร์เรย์เท่านั้น เนื่องจากการส่งคืนอาร์เรย์ทำให้ยากต่อการควบคุมวงจรชีวิตของอาร์เรย์ และอาจทำให้หน่วยความจำรั่วได้ง่าย Java อนุญาตให้ส่งคืนอาร์เรย์ได้โดยตรง และสามารถนำกลับมาใช้ใหม่ได้ด้วยกลไกการรวบรวมขยะ
[การแปลงอาร์เรย์และคอนเทนเนอร์] [ไม่สามารถแปลงอาร์เรย์ประเภทพื้นฐานได้]
แปลงอาร์เรย์เป็นรายการ:
int[] arrayB = {1,2,3};
รายการ listB = java.util.Arrays.asList(arrayB);
System.out.println("listB: " + listB);
จำนวนเต็ม[] arrayC = {1,2,3};
รายการ listC = java.util.Arrays.asList(arrayC);
System.out.println("listC: " + listC);
-
-
เอาท์พุท:
รายการ A: [ก, ข, ค]
listB: [[I@de6ced]
รายการ C: [1, 2, 3]
แปลงรายการเป็นอาร์เรย์
สตริง [] strings = สตริงใหม่ [list.size()];
array = list.toArray (สตริง);
สำหรับ(int i = 0, j = array.length; i < j; i++){
System.out.print(อาร์เรย์[i] + ",");
-
-
-
ผลลัพธ์คือ:
รายการ: [testA, testB, testC]
ทดสอบA,ทดสอบB,ทดสอบC
สาธารณะสตริงคงที่ [] arrayUnique (สตริง [] อาร์เรย์) {
รายการ <String> รายการ = ArrayList ใหม่ <String>();
สำหรับ(int i = 0, j = array.length; i < j; i++){
ถ้า(!list.contains(อาร์เรย์[i])){
list.add(อาร์เรย์[i]);
-
-
สตริง [] strings = สตริงใหม่ [list.size()];
สตริง [] arrayUnique = list.toArray (สตริง);
กลับ arrayUnique;
-
-
Double[] arrayB = ใหม่ Double[1000000];
สำหรับ (int i = 0, j = arrayB.length; i < j; i++){
arrayB[i] = Math.ceil(Math.random()*1000);
-
System.out.println("เริ่มต้น");
startTime ยาว = System.currentTimeMillis();
arrayUnique (อาร์เรย์);
endTime ยาว = System.currentTimeMillis();
System.out.println("เวลารันอาร์เรย์ที่ไม่ซ้ำกัน: " +(endTime - startTime) +"ms");
startTimeB ยาว = System.currentTimeMillis();
arrayUnique (อาร์เรย์ B);
endTimeB ยาว = System.currentTimeMillis();
System.out.println("เวลารันที่ไม่ซ้ำกันของ arrayB: " +(endTimeB - startTimeB) +"ms");
-
สาธารณะคงที่ Double[] arrayUnique (อาร์เรย์ Double []) {
รายการ <Double> รายการ = ArrayList ใหม่ <Double>();
สำหรับ(int i = 0, j = array.length; i < j; i++){
ถ้า(!list.contains(อาร์เรย์[i])){
list.add(อาร์เรย์[i]);
-
-
Double[] doubles = ใหม่ Double[list.size()];
Double[] arrayUnique = list.toArray(คู่);
กลับ arrayUnique;
-
-
เอาท์พุท:
เริ่ม
เวลาทำงานที่ไม่ซ้ำกันของอาเรย์: 577ms
เวลารันที่ไม่ซ้ำกันของ arrayB: 5663ms