เมื่อเร็ว ๆ นี้ฉันใช้เวลาในการวิเคราะห์วิธีการ Aslist ของคลาสเครื่องมือ Java Arrays เรียงลำดับข้อมูลที่เกี่ยวข้องทางออนไลน์และบันทึกไว้หวังว่าจะช่วยผู้อ่าน!
คลาสเครื่องมืออาร์เรย์มีวิธีการ Aslist ซึ่งใช้วิธีนี้ เพื่อแปลงพารามิเตอร์ความยาวตัวแปรหรืออาร์เรย์ลงในรายการ
ซอร์สโค้ดมีดังนี้:
/*** ส่งคืนรายการขนาดคงที่ที่สำรองไว้โดยอาร์เรย์ที่ระบุ (การเปลี่ยนแปลงเป็น * รายการที่ส่งคืน "เขียนผ่าน" ไปยังอาร์เรย์) วิธีนี้ทำหน้าที่ * เป็นสะพานเชื่อมระหว่าง API ที่อาร์เรย์และอิงคอลเลกชันในการรวมกันด้วย {@link collection#toarray} รายการที่ส่งคืนคือ * serializable และใช้ {@link anweraccess} * * <p> วิธีนี้ยังมีวิธีที่สะดวกในการสร้างรายการขนาดคงที่ * เริ่มต้นเพื่อให้มีองค์ประกอบหลายอย่าง: * <pre> * รายการ <string> stands = array.aslist ("larry", "moe", "curly"); * </pre> * * @param a อาร์เรย์ที่รายการจะได้รับการสนับสนุน * @return มุมมองรายการของอาร์เรย์ที่ระบุ */ @safevarargs สาธารณะคงที่ <t> รายการ <t> aslist (t ... a) {ส่งคืนอาร์เรย์ใหม่ <> (a); -การค้นพบปัญหา
ขึ้นอยู่กับคำอธิบายของวิธีการข้างต้นให้เขียนตัวอย่างสองสามตัวอย่างก่อน:
/***@author Wangmengjun**/คลาสสาธารณะ ArrayExample {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {/** ใช้พารามิเตอร์ความยาวตัวแปร*/รายการ <string> array1 = array.aslist ("ยินดีต้อนรับ", "ถึง", "Java", "World"); System.out.println (Array1); / ** ใช้อาร์เรย์*/ รายการ <String> array2 = array.aslist (สตริงใหม่ [] {"ยินดีต้อนรับ", "ถึง", "java", "World"}); System.out.println (Array2); -เรียกใช้โปรแกรมด้านบนและส่งออกเนื้อหาต่อไปนี้
[ยินดีต้อนรับสู่, Java, World]
[ยินดีต้อนรับสู่, Java, World]
ในความตั้งใจฉันก็อยากจะเพิ่มสตริง "เจ๋ง ๆ ~~~" ลงในรายการที่สร้างขึ้นและไปหนึ่งรายการ
/ ** ใช้พารามิเตอร์ความยาวตัวแปร*/ รายการ <String> array1 = array.aslist ("ยินดีต้อนรับ", "ถึง", "Java", "World"); array1.add ("เย็น ~~~");เป็นผลให้พบการไม่ได้รับการตอบรับ: การรับรู้:
ข้อยกเว้นในด้าย "หลัก" java.lang.unsupportedoperationException ที่ java.util.abstractlist.add (แหล่งที่ไม่รู้จัก) ที่ java.util.abstractlist.add (แหล่งที่ไม่รู้จัก) ที่ test.arrayexample.main (arrayexample.java:36)
อย่างไม่น่าเชื่อรายการที่สร้างขึ้นโดย arraylist ใหม่ <> (a) พบปัญหาจริง
การค้นหาเหตุผล
คำถามคือเกิดอะไรขึ้นกันแน่? ด้วยคำถามตรวจสอบสิ่งที่ ArrayList ใช้ในอาร์เรย์ ASLIST ดูเหมือน?
ปรากฎว่าคลาส ArrayList ที่ใช้โดยวิธีการของอาร์เรย์เป็นคลาสที่กำหนดภายในไม่ใช่คลาส java.util.arraylist
ซอร์สโค้ดมีดังนี้:
/ ** * @Serial รวมถึง */ คลาสคงที่คลาสคงที่ arraylist <e> ขยายบทคัดย่อ <e> ใช้การสุ่มตัวอย่าง, java.io.serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -2764017481108945198L; ส่วนตัวสุดท้าย E [] A; arrayList (e [] array) {ถ้า (array == null) โยน nullpointerexception ใหม่ (); a = อาร์เรย์; } ขนาด int สาธารณะ () {return a.length; } วัตถุสาธารณะ [] toarray () {return a.clone (); } สาธารณะ <t> t [] toarray (t [] a) {size int = size (); if (A.Length <size) return array.copyof (this.a, size, (class <? ขยาย t []>) a.getClass ()); System.arrayCopy (this.a, 0, a, 0, ขนาด); if (A.Length> ขนาด) a [size] = null; กลับ A; } สาธารณะ e get (int index) {return a [index]; } Public E SET (INT INDEX, E Element) {e oldValue = a [ดัชนี]; A [ดัชนี] = องค์ประกอบ; กลับ OldValue; } public int indexof (Object o) {ถ้า (o == null) {สำหรับ (int i = 0; i <a.length; i ++) ถ้า (a [i] == null) กลับ i; } else {สำหรับ (int i = 0; i <a.length; i ++) ถ้า (o.equals (a [i])) return i; } return -1; } บูลีนสาธารณะประกอบด้วย (Object O) {return indexof (o)! = -1; -จากการใช้งานของ ArrayList คลาสภายในนี้จะเห็นได้ว่ามันสืบทอดคลาสนามธรรม Java.util.AbstractList <E> แต่วิธีการเพิ่มและลบไม่ได้ถูกแทนที่และไม่ได้รับการใช้งานเฉพาะ
อย่างไรก็ตามโดยค่าเริ่มต้นคลาส java.util.abstractlist จะโยน unsupportedoperationexception โดยตรงในการเพิ่ม, ตั้งค่าและลบวิธีการ ซอร์สโค้ดบางส่วนของ AbstractList มีดังนี้:
บทคัดย่อระดับสาธารณะบทคัดย่อบทคัดย่อ <e> ขยายบทคัดย่อ AbstractCollection <E> รายการดำเนินการ <E> { /*** ตัวสร้าง แต่เพียงผู้เดียว (สำหรับการเรียกร้องโดย constructors subclass โดยทั่วไป * โดยนัย) */ การป้องกัน AbstractList () {} public E Set (INT INDEX, E Element) {โยน unsupportedOperationException ใหม่ (); } /** * {@InherItDoc} * * <p> การใช้งานนี้จะโยน * {@code unsupportedOperationException} เสมอ * * @throws UnsupportedOperationException {@inheritdoc} * @throws classcastexception {@inheritdoc} * @throws nullpointerexception {@inheritdoc} * @throws ellegalargumentexception {@inheritdoc} {โยน unsupportedoperationException ใหม่ (); } /** * {@InherItDoc} * * <p> การใช้งานนี้จะโยน * {@code unsupportedOperationException} เสมอ * * @throws unsupportedOperationException {@inheritDoc} * @throws indexoutofboundsexception {@inheritdoc} */ สาธารณะ e ลบ (ดัชนี int) {โยน unsupportedoperationException ใหม่ (); -เป็นเพราะคลาส arraylist คลาสภายในของคลาส java.util.arrays ไม่ได้แทนที่วิธีการเพิ่มและลบดังนั้นเมื่อเราเรียกวิธีการเพิ่มของมันเราเรียกวิธีการเพิ่มของคลาส AbstractList
ในทำนองเดียวกันเมื่อเรียกวิธีการลบหรือเรียกใช้วิธีอื่นที่เกี่ยวข้องกับวิธีการเพิ่มและลบ (เช่น Addall) คุณจะได้พบกับข้อยกเว้นที่ไม่ได้รับการยกเว้น
ตัวอย่างของ Addall:
/***@author Wangmengjun**/คลาสสาธารณะ ArrayExample {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {/** ใช้พารามิเตอร์ความยาวตัวแปร*/รายการ <string> array1 = array.aslist ("ยินดีต้อนรับ", "ถึง", "Java", "World"); array1.addall (arrays.aslist ("AAA", "BBB")); -ข้อยกเว้นในด้าย "หลัก" java.lang.unsupportedoperationException ที่ java.util.abstractlist.add (แหล่งที่ไม่รู้จัก) ที่ java.util.abstractlist.add (แหล่งที่ไม่รู้จัก) ที่ java.util.abstractcollection.addall (ไม่รู้จักแหล่งที่มา
ตัวอย่างของชุด:
/***@author Wangmengjun**/คลาสสาธารณะ ArrayExample {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {/** ใช้พารามิเตอร์ความยาวตัวแปร*/รายการ <string> array1 = array.aslist ("ยินดีต้อนรับ", "ถึง", "Java", "World"); System.out.println (Array1); // แทนที่ java ด้วย hello array1.set (2, "hello"); System.out.println (Array1); -มันเป็นเพราะ ArrayList คลาสภายในของอาร์เรย์เขียนวิธีการตั้งค่าใหม่ดังนั้นโปรแกรมข้างต้นสามารถทำงานได้ตามปกติและจะไม่โยนข้อยกเว้นที่ไม่ได้รับการยกเว้น
ผลลัพธ์มีดังนี้:
[ยินดีต้อนรับสู่, Java, World]
[ยินดีต้อนรับ, สวัสดี, World]
ใช้สถานการณ์
ตัดสินจากตัวอย่างข้างต้นและการวิเคราะห์อย่างง่ายคลาสเครื่องมืออาร์เรย์ให้วิธีการ Aslist ซึ่งสามารถแปลงพารามิเตอร์ความยาวตัวแปรหรืออาร์เรย์เป็นรายการ
อย่างไรก็ตามความยาวของรายการที่สร้างได้รับการแก้ไข มันสามารถดำเนินการปรับเปลี่ยน (เช่นการปรับเปลี่ยนองค์ประกอบในตำแหน่งที่แน่นอน); ไม่สามารถดำเนินการที่มีผลต่อความยาว (เช่นเพิ่มลบ ฯลฯ ) ข้อยกเว้นที่ไม่ได้รับการตอบรับจะถูกโยนลงไป
array.aslist เหมาะสำหรับสถานการณ์ที่มีข้อมูลอาร์เรย์อยู่แล้วหรือองค์ประกอบบางอย่าง แต่จำเป็นต้องสร้างรายการอย่างรวดเร็วซึ่งใช้สำหรับการดำเนินการอ่านเท่านั้นและไม่ได้ดำเนินการเพิ่มหรือลบการดำเนินงาน
หากคุณต้องการรับรายการของรายการที่สามารถเพิ่มลบแก้ไขและตรวจสอบได้อย่างรวดเร็วตามข้อมูลอาร์เรย์ที่รู้จักวิธีที่ค่อนข้างง่ายมีดังนี้:
นำ java.util.arraylist กลับมาใช้ใหม่เพื่อห่อเลเยอร์
/***@author Wangmengjun**/คลาสสาธารณะ ArrayExample {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {/** ใช้พารามิเตอร์ความยาวตัวแปร*/รายการ <string> array1 = New ArrayList <> (array.aslist ("ยินดีต้อนรับ" System.out.println (Array1); array1.add ("เย็น ~~~"); System.out.println (Array1); -ผลลัพธ์มีดังนี้:
[ยินดีต้อนรับสู่, Java, World]
[ยินดีต้อนรับไปยัง Java, World, Cool ~~~]
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!