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 ) ; // 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`.
“不可修改”是指列表中元素的数量,以及作为元素保存在每个槽中的对象引用是固定的。您不能添加、删除或替换元素。但是每个元素中保存的对象引用可能是也可能不是mutable。
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
看到这个code run live at 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 对象来表示颜色,颜色对象在内存中的某个地方浮动。这两个列表持有指向相同颜色对象的指针。这是一张图表。
第一个列表colors 是可修改的。这意味着可以删除一些元素,如上面的代码所示,我们删除了原始的第三个元素Chartreuse(索引 2 = 序数 3)。并且可以添加元素。并且可以将元素更改为指向其他一些String,例如OliveDrab 或CornflowerBlue。
相比之下,masterColors 的四个元素是固定的。没有去除,没有添加,也没有替代另一种颜色。 List 的实现是不可修改的。