List.copyOf
➙ 不可修改的列表
你问道:
没有其他方法可以分配一个列表的副本吗?
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 ) ;
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ;
“不可修改”是指列表中的元素数量和每个元素作为对象引用所持有的对象是固定的。您无法添加、删除或替换元素。但是,每个元素持有的对象引用可能是
可变的或不可变的。
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
请查看 在IdeOne.com上运行的代码。
dates.toString(): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString(): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString(): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
你问到了对象引用。就像其他人所说,如果你创建一个列表并将其分配给两个引用变量(指针),你仍然只有一个列表。两个指针都指向同一个列表。如果你使用其中一个指针来修改列表,那么两个指针后来都会看到更改,因为内存中只有一个列表。
所以你需要复制列表。如果你想要这个副本是不可修改的,可以使用List.copyOf
方法,如此回答中所讨论的那样。通过这种方法,你最终得到了两个独立的列表,每个列表都有元素,这些元素持有对相同内容对象的引用。例如,在我们上面的示例中,使用String
对象表示颜色,颜色对象在内存中漂浮。这两个列表持有指向相同颜色对象的指针。下面是一个图示。
![enter image description here](https://istack.dev59.com/m7L5q.webp)
第一个列表
colors
是可修改的。这意味着像上面的代码中所看到的那样,一些元素可以被删除,我们删除了原始的第三个元素
Chartreuse
(索引为2 = 序数3)。元素可以添加。并且可以将元素更改为指向其他
String
,例如
OliveDrab
或
CornflowerBlue
。
相反,
masterColors
的四个元素是固定的。不能删除、添加或替换其他颜色。该
List
实现是不可修改的。
List.subList
来获取原始列表的“视图”以查看其某个部分。 - Jon Skeet(ArrayList<ArrayList<Object>>)
,那么会递归地创建所有子 ArrayList 对象的副本吗? - Cat