在 List 類的檔案中:
/*
The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list, and vice-versa.
*/
List<E> subList(int fromIndex, int toIndex);
子串列的結構變化可以反映在JAVA中的原始串列中嗎?我做了一個實驗,它告訴我答案是“可以”,但我不確定。我的實驗代碼如下:
public class Main {
public static void main(String[] args) {
ArrayList<Student> a=new ArrayList<>();
a.add(new Student("Lily",16));
a.add(new Student("Sam",16));
a.add(new Student("Tom",16));
a.add(new Student("Mary",16));
a.add(new Student("Mark",16));
a.add(new Student("John",16));
List<Student> suba=a.subList(2,5);
System.out.println("Firstly,suba:");
printall(suba);
System.out.println("Change the structure:");
suba.remove(0);
System.out.println("suba:");
printall(suba);
System.out.println("a:");
printall(a);
}
public static void printall(List<Student> list){
for (Student a : list){
System.out.print(a "\t");
}
System.out.println();
}
}
class Student{
public String name;
public int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void hello(){
System.out.println("hello");
}
@Override
public String toString() {
return "name :" this.name "age :" this.age;
}
}
結果是:
Firstly,suba:
name :Tomage :16 name :Maryage :16 name :Markage :16
Change the structure:
suba:
name :Maryage :16 name :Markage :16
a:
name :Lilyage :16 name :Samage :16 name :Maryage :16 name :Markage :16 name :Johnage :16
節點 Tom 被洗掉,ArrayList 的結構發生了變化。我的假設是否正確?
uj5u.com熱心網友回復:
呼叫subList
會回傳原始串列的“視圖”。任何通過子串列訪問串列的方法都有效index offset
。
JavaDoc繼續宣告(強調我的):
如果后備串列(即此串列)以除通過回傳串列之外的任何方式進行結構修改,則此方法回傳的串列的語意將變為未定義。(結構修改是改變這個串列的大小,或者以其他方式擾亂它,使得正在進行的迭代可能會產生不正確的結果。)
這意味著如果您從原始串列中洗掉或添加元素,訪問子串列可能會引發例外,因為您正在訪問串列之外的專案。或者您可能會訪問與預期不同的元素,因為原始串列中的元素已經移動(并且子串列只是為每個索引操作添加偏移量)。
換句話說:在當前的實作中,原始串列的一些結構修改反映在子串列中,但不能保證它們是。也不能保證您的子串列將繼續有效。也許會,也許不會。也許它會成為一個例外,或者它可能不是。也許它稍后會拋出例外或訪問錯誤的元素。也許不是。TLDR:不要依賴未定義的行為。
請注意,除了 之外,還有其他串列實作ArrayList
,例如LinkedList
,在子串列時可能表現不同(至少有兩個子串列實作:RandomAccessSubList
和SubList
)。
您可以在 OpenJDK 源代碼中找到子串列包裝器的來源:https ://hg.openjdk.java.net/jdk/jdk/file/default/src/java.base/share/classes/java /util/AbstractList.java
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512466.html
標籤:爪哇
上一篇:JUnit使用SpringSecurity測驗控制器視圖拋出java.lang.AssertionError:NoModelAndViewfoundafterHTTPStatus302