列表。copyOf➙不可修改列表
你问:
是否没有其他方法分配列表的副本
Java 9带来了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上查看实时运行的代码。
日期:[2020-02-02,2020-02-03,2020-02-04]
颜色。
颜色大师。
您询问了对象引用。正如其他人所说,如果创建一个列表并将其分配给两个引用变量(指针),那么仍然只有一个列表。两者都指向同一个列表。如果使用其中一个指针来修改列表,两个指针稍后都会看到更改,因为内存中只有一个列表。
所以你需要复制一份清单。如果您希望该副本不可修改,请使用List。copyOf方法,在这个答案中讨论。在这种方法中,您最终会得到两个单独的列表,每个列表的元素都包含对相同内容对象的引用。例如,在上面使用String对象表示颜色的例子中,颜色对象漂浮在内存的某个地方。这两个列表包含指向相同颜色对象的指针。这是一个图表。
第一个列表颜色是可修改的。这意味着可以删除一些元素,如上面的代码所示,其中我们删除了原始的第3个元素Chartreuse(索引2 =序号3)。并且可以添加元素。元素可以改变为指向其他字符串,如OliveDrab或CornflowerBlue。
相比之下,masterColors的四个元素是固定的。不能去除,不能添加,也不能替换其他颜色。List实现是不可修改的。