في الآونة الأخيرة ، أخذت الوقت الكافي لتحليل طريقة aslist لفئة أدوات صفائف Java ، وفرز المعلومات ذات الصلة عبر الإنترنت ، وتسجيلها ، على أمل مساعدة القراء!
توفر فئة أداة المصفوفات طريقة aslist ، والتي تستخدم هذه الطريقة لتحويل معلمة أو صفيف طول متغير إلى قائمة.
رمز المصدر كما يلي:
/*** إرجاع قائمة بحجم ثابت مدعوم من الصفيف المحدد. (التغييرات على * القائمة التي تم إرجاعها "اكتب من خلال" إلى الصفيف.) تعمل هذه الطريقة * كجسر بين واجهات برمجة التطبيقات المستندة إلى المجموعة ، في * مزيج مع {link collection#tararray}. القائمة التي تم إرجاعها * Serializable وتنفذ {link RandomAccess}. * * <p> توفر هذه الطريقة أيضًا طريقة مريحة لإنشاء قائمة ذات حجم ثابت تم تهيئتها لاحتواء عدة عناصر: * <pre> * List <String> stands = arrays.aslist ("Larry" ، "Moe" ، "Curly") ؛ * </pre> * * param a الصفيف الذي سيتم من خلاله دعم القائمة * return عرض قائمة للمجموعة المحددة */ safevarargs static static <T> القائمة <T> aslist (t ... a) {return new ArrayList <> (a) ؛ }اكتشاف المشكلة
بناءً على وصف الطريقة أعلاه ، دعنا أولاً نكتب بعض الأمثلة:
/***Author wangmengjun**/public class arryexample {public static void main (string [] args) {/** استخدم معلمات طول متغير*/list <string> array1 = arrays.aslist ("مرحبًا" ، "،" ، "java" ، "World") ؛ System.out.println (Array1) ؛ / ** استخدم Array*/ List <Tring> Array2 = Arrays.aslist (سلسلة جديدة [] {"مرحبًا" ، "إلى" ، "Java" ، "World"}) ؛ System.out.println (Array2) ؛ }}قم بتشغيل البرنامج أعلاه وإخراج المحتوى التالي.
[مرحبًا ، في جافا ، العالم]
[مرحبًا ، في جافا ، العالم]
على نزوة ، أردت فجأة إضافة سلسلة "Cool ~~~" إلى القائمة التي تم إنشاؤها وذهبت واحدة.
/ ** استخدم معلمات الطول المتغير*/ list <string> Array1 = Arrays.aslist ("مرحبًا" ، "إلى" ، "Java" ، "World") ؛ Array1.Add ("Cool ~~~") ؛ونتيجة لذلك ، تمت مواجهة عدم دعمه:
استثناء في الموضوع "الرئيسي" java.lang.unsupportedOperationException في java.util.abstractlist.add (مصدر غير معروف) على java.util.abstractlist.add (مصدر غير معروف) في test.arrayexample.main (ArrayExample.java:36)
بشكل لا يصدق ، واجهت القائمة التي تم إنشاؤها بواسطة New ArrayList <> (أ) مشكلة بالفعل.
بحث العقل
لذا فإن السؤال هو ، ماذا حدث بالضبط؟ مع الأسئلة ، تحقق من شكل arraylist المستخدمة في المصفوفات. aslist تبدو؟
اتضح أن فئة ArrayList التي تستخدمها طريقة Aslist of Arrays هي فئة محددة داخليًا ، وليس فئة java.util.arraylist.
رمز المصدر كما يلي:
/ ** * serial تشمل */ private static class arraylist <e> يمتد مجردة القائمة <e> الأطراف العشوائية ، java.io.serializable {private static final long serialversionuid = -2764017481108945198l ؛ النهائي الخاص e [] a ؛ ArrayList (e [] array) {if (array == null) رمي nullpointerxception () جديدة ؛ A = صفيف ؛ } size int public () {return A.Length ؛ } الكائن العام [] tararray () {return A.Clone () ؛ } public <t> t [] tararray (t [] a) {int size = size () ؛ if (A.Length <size) return arrays.copyof (this.a ، size ، (class <؟ extens t t []>) a.getClass ()) ؛ System.ArrayCopy (this.a ، 0 ، a ، 0 ، size) ؛ if (A.Length> size) a [size] = null ؛ إرجاع أ ؛ } public e get (int index) {return a [index] ؛ } مجموعة E العامة (int index ، e element) {e oldvalue = a [index] ؛ A [index] = element ؛ إرجاع Oldvalue ؛ } public int indexof (object o) {if (o == null) {for (int i = 0 ؛ i <a.length ؛ i ++) if (a [i] == null) return i ؛ } آخر {for (int i = 0 ؛ i <a.length ؛ i ++) if (o.equals (a [i])) return i ؛ } العودة -1 ؛ } يحتوي Boolean العام على (كائن O) {return indexof (o)! = -1 ؛ }}من تنفيذ قائمة ArrayList الداخلية هذه ، يمكن ملاحظة أنه يرث الفئة المجردة java.util.abstractlist <e> ، ولكن لا يتم تجاوز الأساليب الإضافة والإزالة ، ولا يتم إعطاء التنفيذ المحدد.
ومع ذلك ، بشكل افتراضي ، ستقوم فئة java.util.abstractlist مباشرة بإلقاء الأساليب غير الداعمة في الأساليب إضافة وتعيين وإزالة. بعض رموز المصدر لـ AbstractList هي كما يلي:
Public Class Class Abstractlist <E> يمتد AbstractCollection <e> قائمة الأدوات <e> { /*** مُنشئ وحيد. (للاستدعاء من قبل منشئات الفئة الفرعية ، عادةً * ضمنيًا.) *// محمي abstractlist () {} set public e set (int index ، e element) {refl new UnsupportedOperationException () ؛ } /** * {inheritdoc} * * <p> يلقي هذا التنفيذ دائمًا * {Code UnsupportedOperationException}. * * Throws UnsupportedOperationException {inheritdoc} * throws classcastException {inheritdoc} * throws nullpointerexception {inheritdoc} العنصر) {رمي جديد UnsupportedOperationException () ؛ } /** * {inheritdoc} * * <p> يلقي هذا التنفيذ دائمًا * {Code UnsupportedOperationException}. * * Throws UnsupportedOperationException {inheritdoc} * throws indexoutofBoundSexception {inheritdoc} */ public e remove (int index) {thraw new UnsupportedOperationException () ؛ }}وذلك على وجه التحديد لأن فئة ArrayList الداخلية من Java.Util.Arrays لا تتجاوز الأساليب والإزالة ، لذلك عندما نسمي طريقة إضافةها ، فإننا ندعو فعليًا إلى طريقة إضافة فئة القائمة التجريدية ، والنتيجة هي أن يتم إلقاؤها بشكل مباشر.
وبالمثل ، عند استدعاء طريقة إزالة ، أو استدعاء الطرق الأخرى المرتبطة بالطرق إضافة وإزالة (مثل addall) ، ستواجه أيضًا استثناء غير مدعوم.
مثال على addall:
/***Author wangmengjun**/public class arryexample {public static void main (string [] args) {/** استخدم معلمات طول متغير*/list <string> array1 = arrays.aslist ("مرحبًا" ، "،" ، "java" ، "World") ؛ Array1.Addall (Arrays.aslist ("AAA" ، "BBB")) ؛ }}استثناء في الموضوع "الرئيسي" java.lang.unsupportedOperationException في java.util.abstractlist.add (مصدر غير معروف) في java.util.abstractlist.add (مصدر غير معروف) في java.util.abstractcollection.addall (مصدر غير معروف) في test.arrayexample.main
مثال على المجموعة:
/***Author wangmengjun**/public class arryexample {public static void main (string [] args) {/** استخدم معلمات طول متغير*/list <string> array1 = arrays.aslist ("مرحبًا" ، "،" ، "java" ، "World") ؛ System.out.println (Array1) ؛ // استبدل Java بـ Hello Array1.set (2 ، "Hello") ؛ System.out.println (Array1) ؛ }}وذلك على وجه التحديد لأن الفئة الداخلية للصفائف الداخلية يعيد كتابة طريقة المجموعة ، بحيث يمكن للبرنامج أعلاه تشغيل بشكل طبيعي ولن يلقي استثناء غير مدعوم.
النتائج كما يلي:
[مرحبًا ، في جافا ، العالم]
[مرحبًا بك ، مرحبًا ، العالم]
استخدم السيناريوهات
انطلاقًا من الأمثلة المذكورة أعلاه والتحليل البسيط ، توفر فئة أدوات المصفوفات طريقة Aslist ، والتي يمكنها تحويل معلمة أو صفيف طول متغير إلى قائمة.
ومع ذلك ، فإن طول القائمة التي تم إنشاؤها ثابت ؛ يمكنه إجراء عمليات التعديل (مثل تعديل العناصر في موضع معين) ؛ لا يمكن إجراء عمليات تؤثر على الطول (مثل الإضافة ، إزالة ، إلخ). سيتم طرح استثناء غير مدعوم.
Arrays.Aslist أكثر ملاءمة للسيناريوهات حيث توجد بالفعل بيانات صفيف أو بعض العناصر ، ولكن من الضروري إنشاء قائمة بسرعة ، والتي يتم استخدامها فقط لعمليات القراءة ، ولا تؤدي عمليات إضافة أو حذف.
إذا كنت ترغب في الحصول على قائمة بالقوائم التي يمكن إضافتها بسرعة وحذفها وتعديلها والتحقق منها بناءً على بيانات الصفيف المعروفة ، فإن طريقة بسيطة نسبيًا هي كما يلي:
إعادة استخدام java.util.arraylist لالتفاف طبقة.
/***author wangmengjun**/public class ArrayExample {public static void main (string [] args) {/** استخدم معلمات الطول المتغير*/list <string> array1 = new ArrayList <> (Arrays.aslist ("مرحبًا" ، "إلى" ، "،" ، "العالم")) ؛ System.out.println (Array1) ؛ Array1.Add ("Cool ~~~") ؛ System.out.println (Array1) ؛ }}النتائج كما يلي:
[مرحبًا ، في جافا ، العالم]
[مرحبًا ، في ، Java ، World ، Cool ~~~]
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!