هناك ثلاثة اختلافات رئيسية بين صفائف JAVA وفئات الحاويات: الكفاءة والنوع والقدرة على حفظ الأنواع الأساسية . في JAVA، المصفوفات هي الطريقة الأكثر فعالية لتخزين سلسلة من مراجع الكائنات والوصول إليها بشكل عشوائي. المصفوفة عبارة عن تسلسل خطي بسيط، مما يجعل الوصول إلى العناصر سريعًا جدًا. لكن الثمن المدفوع مقابل ذلك هو أن حجم المصفوفة ثابت ولا يمكن تغييره خلال فترة حياته.
بفضل الأدوية العامة وآليات التعبئة التلقائية، يمكن الآن استخدام الحاويات مع الأنواع البدائية بنفس سهولة استخدام المصفوفات. يمكن لكل من المصفوفات والحاويات منعك من إساءة استخدامها إلى حد ما. إذا تجاوزت الحدود، فستحصل على RuntimeException. الميزة الوحيدة المتبقية للمصفوفات هي الكفاءة، ومع ذلك، إذا كنت تريد حل مشاكل أكثر عمومية، فقد تكون المصفوفات مقيدة للغاية، لذلك في هذه الحالة سيظل معظم الأشخاص يختارون الحاويات.
لذلك، إذا كنت تستخدم إصدارات JAVA حديثة، فيجب أن تفضل الحاويات على المصفوفات. يجب أن تتم إعادة هيكلة البرامج إلى المصفوفات فقط إذا ثبت أن الأداء يمثل مشكلة وأن التبديل إلى المصفوفات يؤدي إلى تحسين الأداء.
[التهيئة]
لدى JAVA لوائح صارمة للغاية بشأن تهيئة المصفوفة، والتي يمكن أن تمنع بشكل فعال إساءة استخدام المصفوفات. إذا كان هناك خطأ في التهيئة، فسوف تحصل على CompileException بدلاً من RuntimeException مباشرة. لا يمكن فعل أي شيء باستخدام مرجع الصفيف هذا حتى تتم تهيئة الصفيف بشكل صحيح.
تتضمن تعريفات المصفوفة صفيف int[] وصفيف int[]. بشكل عام، يتم استخدام النمط الأول لفصل النوع عن اسم المتغير.
هناك طريقتان لتهيئة المصفوفة، التهيئة الثابتة والتهيئة الديناميكية. يجب تحديد الطول أثناء التهيئة ويجب الإشارة إلى طول البعد الأول للمصفوفة متعددة الأبعاد، ويجب تحديده من الأبعاد الأعلى إلى الأبعاد المنخفضة. يمكن أن يكون إجراء التهيئة في أي مكان في الكود، ولكن يمكن أن يظهر الأسلوب {} فقط في المكان الذي تم إنشاء المصفوفة فيه. راجع البرنامج لمعرفة طرق التهيئة المحددة:
arrayA = new int[10]; // التهيئة الديناميكية
System.out.println("طول المصفوفة:" + arrayA.length);
int[] arrayC = new int[]{1,2,3,4};
System.out.println("طول المصفوفة:" + arrayC.length);
//int[] arrayD = new int[1]{1}; // لا يمكن تحديد التهيئة والأبعاد وقيم التهيئة الخاطئة في نفس الوقت
int[][] arrayE = new int[1][];
System.out.println("طول المصفوفة:" + arrayE.length);
//int[][] arrayF = new int[][2]; // يجب تحديد طول البعد العالي أولاً
int[][] arrayG = new int[][]{{1,2,3,4},{5,6,7},{7,24,23,24}};
System.out.println("طول المصفوفة:" + arrayG.length);
int[][][] arrayH = new int[][][]{{{1,2,3},{4,5,6},{7,8,9},{10,11,12} }};
System.out.println("طول المصفوفة:" + arrayH.length);
dummyArray[] arrayI = {new dummyArray(),new dummyArray()}; // نوع المصفوفة المخصصة
System.out.println("طول المصفوفة:" + arrayI.length);
System.out.println("arrayI[1]: " + arrayI[1].getValue());
dummyArray[] arrayK = new dummyArray[5];
System.out.println("arrayK[0]: " + arrayK[0]); //null
for(int i = 0; i < arrayK.length; i++){
arrayK[i] = new dummyArray();
}
System.out.println("arrayK[0]: " + arrayK[0].getValue()); //2
}
}
فئة الدمية{
درجة حرارة ثابتة خاصة؛
الخاص النهائي int arrayValue = temp++;
كثافة العمليات العامة getValue(){
قيمة صفيف الإرجاع؛
}
}
الإخراج:
طول المصفوفة ب: 5
طول المصفوفة: 10
طول المصفوفة C: 4
طول المصفوفة: 1
طول المصفوفة: 3
طول المصفوفة: 1
طول المصفوفة: 2
المصفوفة [1]: 1
المصفوفةK[0]: فارغة
المصفوفةK[0]: 2
int[][] arrayB = new int[10][];
System.out.println("طول المصفوفة:" + arrayB.length);
int[][] arrayC = new int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,};// انتبه للفاصلة بعد
System.out.println("طول المصفوفة:" + arrayC.length);
int[][] arrayD = new int[][]{{1,1,1,2,},{1,1,2,3,4,5},{4,5,6,7,7} ,{}};
System.out.println("طول المصفوفة:" + arrayD.length);
}
}
الإخراج:
طول المصفوفة: 15
طول المصفوفة ب: 10
طول المصفوفة C: 3
طول المصفوفة: 4
[التخصيص والمرجع]
عند تهيئة مصفوفة JAVA، فإنها تحتوي فقط على مرجع للمصفوفة، ولا يتم تخصيص مساحة تخزين للمصفوفة. لذلك، لا يمكن للنسخ بين المصفوفات استخدام المهمة "=" ببساطة، لأنه يتم تشغيل نفس الكائن. الإجراء التالي:
}
}
الإخراج:
أنا testA، لم أتغير:testA
أنا arrayA، لم أتغير: لقد تغيرت arrayB
[نسخة صفيف]
كيفية نسخ مصفوفة في جافا:
1. استخدم حلقة FOR لنسخ كل العناصر أو العناصر المحددة، وهي أقل كفاءة.
2. استخدم طريقة الاستنساخ للحصول على قيمة المصفوفة بدلاً من المرجع. ومع ذلك، لا يمكن للاستنساخ نسخ عناصر محددة ويتمتع بمرونة منخفضة.
3. استخدم طريقة System.arraycopy(src, srcPos, dest, destPos, length). توفر مكتبة فئة Java القياسية الطريقة الثابتة System.arraycopy(). يعد استخدامها لنسخ المصفوفة أسرع بكثير من نظام الحلقة .arraycopy() مخصص لجميع الأنواع التي يتم تحميلها بشكل زائد. يمكن نسخ كل من مصفوفات النوع الأساسي ومصفوفات الكائنات باستخدام System.arraycopy()، لكن مصفوفات الكائنات تنسخ المراجع فقط، ولن يكون هناك نسختان من الكائنات. وهذا ما يسمى نسخة ضحلة.
src: صفيف المصدر؛
srcPos: موضع البداية للمصفوفة المصدر المراد نسخها؛
الوجهة: صفيف الوجهة؛
destPos: موضع البداية حيث يتم وضع مصفوفة الوجهة؛
الطول: طول النسخة.
ملاحظة: لا يقوم System.arraycopy() بالتعبئة التلقائية والتفريغ التلقائي، لذلك يجب أن يكون المصفوفتان من نفس النوع أو يمكن تحويلهما إلى صفائف من نفس النوع. وفي الوقت نفسه، يمكن أيضًا استخدام هذه الطريقة لنسخ المصفوفة نفسها.
int[] test ={0,1,2,3,4,5,6};
System.arraycopy(test,0,test,3,3);
والنتيجة هي: {0,1,2,0,1,2,6};
إجراءات الاختبار هي كما يلي:
// طريقة الاستنساخ
int[] arrayB = new int[9];
arrayB = array.clone();
//امتحان
المصفوفةB[1] = 19;
for(int i = 0; i < arrayB.length; i++){
System.out.print(arrayB[i] + ""،");
}
System.out.println("");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + ""،");
}
System.out.println("");
// طريقة System.arrayCopy
int[] arrayC = new int[9];
System.arraycopy(array, 0, arrayC, 0, arrayC.length);
//امتحان
المصفوفةC[1] = 19;
for(int i = 0; i < arrayC.length; i++){
System.out.print(arrayC[i] + ""،");
}
System.out.println("");
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + ""،");
}
}
}
String[][] arrayD = {{"a"، "b"}،{"c"، "d"}}؛
String[][] arrayE = {{"a"، "b"}، {"c"، "d"}}؛
System.out.println(Arrays.deepEquals(arrayD, arrayE));
}
}
[مصفوفة العودة]
لا يمكن لـ C وC++ إرجاع مصفوفة، بل مجرد مؤشر للمصفوفة، لأن إرجاع مصفوفة يجعل من الصعب التحكم في دورة حياة المصفوفة ويمكن أن يتسبب بسهولة في تسرب الذاكرة. تسمح Java بإرجاع المصفوفة مباشرةً، ويمكن إعادة تدويرها بواسطة آلية جمع البيانات المهملة.
[تحويل المصفوفة والحاوية] [غير قادر على تحويل مصفوفة النوع الأساسي]
تحويل المصفوفة إلى قائمة:
int[] arrayB = {1,2,3};
List listB = java.util.Arrays.asList(arrayB);
System.out.println("listB:" + listB);
عدد صحيح[] arrayC = {1,2,3};
List listC = java.util.Arrays.asList(arrayC);
System.out.println("listC:" + listC);
}
}
الإخراج:
القائمة أ: [أ، ب، ج]
القائمة ب: [[I@de6ced]
القائمة ج: [1، 2، 3]
تحويل القائمة إلى صفيف
String[] strings = new String[list.size()];
array = list.toArray(strings);
for(int i = 0, j = array.length; i < j; i++){
System.out.print(array[i] + ""،");
}
}
}
الإخراج هو:
القائمة: [testA، testB، testC]
اختبار أ، اختبار ب، اختبار ج
سلسلة ثابتة عامة[] arrayUnique(String[] array){
List<String> list = new ArrayList<String>();
for(int i = 0, j = array.length; i < j; i++){
إذا(!list.contains(array[i])){
list.add(array[i]);
}
}
String[] strings = new String[list.size()];
String[] arrayUnique = list.toArray(strings);
return arrayUnique;
}
}
Double[] arrayB = new Double[1000000];
for(int i = 0, j = arrayB. length; i < j; i++){
arrayB[i] = Math.ceil(Math.random()*1000);
}
System.out.println("ابدأ");
وقت البدء الطويل = System.currentTimeMillis();
arrayUnique(array);
long endTime = System.currentTimeMillis();
System.out.println("وقت التشغيل الفريد للمصفوفة: "+(endTime - startTime) +"ms");
long startTimeB = System.currentTimeMillis();
arrayUnique(arrayB);
long endTimeB = System.currentTimeMillis();
System.out.println("وقت التشغيل الفريد لصفيف B: " +(endTimeB - startTimeB) +"ms");
}
عام ثابت Double[] arrayUnique(Double[] array){
List<Double> list = new ArrayList<Double>();
for(int i = 0, j = array.length; i < j; i++){
إذا(!list.contains(array[i])){
list.add(array[i]);
}
}
Double[] doubles = new Double[list.size()];
Double[] arrayUnique = list.toArray(doubles);
return arrayUnique;
}
}
الإخراج:
يبدأ
وقت التشغيل الفريد للمصفوفة: 577 مللي ثانية
وقت التشغيل الفريد لـ arrayB: 5663 مللي ثانية