返回结果:
返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。 参考链接
上述陈述是绝对正确的,但我们必须注意非结构性更改。我想举两个例子来证明以上声明。
示例1: 在列表中执行非结构性更改。
public static void main(String[] args) {
List<String> listArr = new ArrayList<>();
listArr.add("Delhi");
listArr.add("Bangalore");
listArr.add("New York");
listArr.add("London");
List<String> listArrSub = listArr.subList(1, 3);
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
Collections.swap(listArr, 0, 1);
System.out.println("\nAfter Non-Structural Change...\n");
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
}
输出结果-:
List-: [Delhi, Bangalore, New York, London]
Sub List-: [Bangalore, New York]
After Non-Structural Change...
List-: [Bangalore, Delhi, New York, London]
Sub List-: [Delhi, New York]
根据Oracle的文档说明,交换操作在两个列表中都会反映。
示例2:在子列表中执行非结构性更改。
public static void main(String[] args) {
List<String> listArr = new ArrayList<>();
listArr.add("Delhi");
listArr.add("Bangalore");
listArr.add("New York");
listArr.add("London");
List<String> listArrSub = listArr.subList(1, 3);
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
Collections.swap(listArrSub, 0, 1);
System.out.println("\nAfter Non-Structural Change...\n");
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
}
输出-:
List-: [Delhi, Bangalore, New York, London]
Sub List-: [Bangalore, New York]
After Non-Structural Change...
List-: [Delhi, New York, Bangalore, London]
Sub List-: [New York, Bangalore]
根据Oracle的文档,交换操作反映在两个列表中,但是它是在子列表上执行的。
我们已经看到了上述两个示例中的非结构性更改。现在让我们来看看结构性更改,如下所述,在Oracle的文档中给出。
如果通过返回的列表以外的任何方式对支持列表(即该列表)进行结构修改,则此方法返回的列表的语义将变得不确定。(结构修改是指改变该列表的大小或以其他方式扰动它,以使正在进行的迭代可能产生不正确的结果。)
示例3:在列表中执行结构性更改。
public static void main(String[] args) {
List<String> listArr = new ArrayList<>();
listArr.add("Delhi");
listArr.add("Bangalore");
listArr.add("New York");
listArr.add("London");
List<String> listArrSub = listArr.subList(1, 3);
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
listArr.add("Mumbai");
System.out.println("\nAfter Structural Change...\n");
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
}
输出-:
List-: [Delhi, Bangalore, New York, London]
Sub List-: [Bangalore, New York]
After Structural Change...
List-: [Delhi, Bangalore, New York, London, Mumbai]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
at java.util.ArrayList$SubList.listIterator(ArrayList.java:1091)
at java.util.AbstractList.listIterator(AbstractList.java:299)
at java.util.ArrayList$SubList.iterator(ArrayList.java:1087)
at java.util.AbstractCollection.toString(AbstractCollection.java:454)
at java.lang.String.valueOf(String.java:2982)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at infosys.Research.main(Research.java:26)
根据Oracle文档所述,结构修改操作在除通过返回的列表之外以任何方式对后备列表(即此列表)进行结构修改时,将抛出java.util.ConcurrentModificationException异常。此方法返回的列表语义如果未通过返回的列表进行修改,则变为未定义状态。
示例4:在子列表中进行结构更改。
public static void main(String[] args) {
List<String> listArr = new ArrayList<>();
listArr.add("Delhi");
listArr.add("Bangalore");
listArr.add("New York");
listArr.add("London");
List<String> listArrSub = listArr.subList(1, 3);
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
listArrSub.add("Mumbai");
System.out.println("\nAfter Structural Change...\n");
System.out.println("List-: " + listArr);
System.out.println("Sub List-: " + listArrSub);
}
输出-:
List-: [Delhi, Bangalore, New York, London]
Sub List-: [Bangalore, New York]
After Structural Change...
List-: [Delhi, Bangalore, New York, Mumbai, London]
Sub List-: [Bangalore, New York, Mumbai]
结构修改 对返回的列表进行的修改已经有效地反映在整个列表中。