List.copyOf
list รายการที่เปลี่ยนแปลงไม่ได้
คุณถาม:
ไม่มีวิธีอื่นในการกำหนดสำเนาของรายการ
Java 9 นำList.of
วิธีการสำหรับการใช้ตัวอักษรเพื่อสร้างList
คลาสที่ไม่รู้จักที่ไม่สามารถแยกแยะได้
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
List.copyOf
พร้อมกับที่เรายังมี วิธีการนี้จะส่งกลับค่าที่ไม่สามารถแก้ไขได้List
ของคลาสคอนกรีตที่ไม่รู้จัก
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
โดย“ ไม่สามารถเปลี่ยนแปลงได้” เราหมายถึงจำนวนองค์ประกอบในรายการและการอ้างอิงวัตถุที่ถือในแต่ละช่องเป็นองค์ประกอบได้รับการแก้ไข คุณไม่สามารถเพิ่มวางหรือแทนที่องค์ประกอบได้ แต่อ้างอิงวัตถุที่จัดขึ้นในแต่ละองค์ประกอบอาจหรือไม่อาจจะไม่แน่นอน
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
ดูนี้ใช้รหัสสดที่ IdeOne.com
date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
คุณถามถึงการอ้างอิงวัตถุ อย่างที่คนอื่นพูดถ้าคุณสร้างหนึ่งรายการและกำหนดให้กับตัวแปรอ้างอิงสองตัว (พอยน์เตอร์) คุณยังมีเพียงหนึ่งรายการ ทั้งสองชี้ไปที่รายการเดียวกัน หากคุณใช้ตัวชี้อย่างใดอย่างหนึ่งเพื่อปรับเปลี่ยนรายการตัวชี้ทั้งสองจะเห็นการเปลี่ยนแปลงในภายหลังเนื่องจากมีเพียงหนึ่งรายการในหน่วยความจำ
ดังนั้นคุณต้องทำสำเนาของรายการ หากคุณต้องการให้สำเนานั้นไม่สามารถแก้ไขได้ให้ใช้List.copyOf
วิธีการตามที่อธิบายไว้ในคำตอบนี้ ในวิธีการนี้คุณจะมีสองรายการแยกกันแต่ละรายการมีองค์ประกอบที่อ้างอิงถึงวัตถุเนื้อหาเดียวกัน ตัวอย่างเช่นในตัวอย่างของเราด้านบนการใช้String
วัตถุเพื่อแสดงสีวัตถุสีจะลอยไปมาในหน่วยความจำที่ไหนซักแห่ง รายการทั้งสองถือตัวชี้ไปยังวัตถุสีเดียวกัน นี่คือแผนภาพ
รายการแรกcolors
สามารถแก้ไขได้ ซึ่งหมายความว่าองค์ประกอบบางอย่างสามารถลบออกได้ตามที่เห็นในโค้ดด้านบนซึ่งเราลบองค์ประกอบที่ 3 ดั้งเดิมChartreuse
(ดัชนี 2 = ลำดับ 3) และสามารถเพิ่มองค์ประกอบ และองค์ประกอบสามารถเปลี่ยนเป็นชี้ไปที่อื่น ๆString
เช่นOliveDrab
หรือCornflowerBlue
หรือ
ในทางตรงกันข้ามองค์ประกอบทั้งสี่ของmasterColors
ได้รับการแก้ไข ไม่มีการลบไม่เพิ่มและไม่มีการแทนที่สีอื่น ว่าList
การดำเนินการเป็น unmodifiable