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
实现是不可修改的。