JDK中,List接口有一個實例方法List<E> subList(int fromIndex, int toIndex),
其作用是返回一個以fromIndex為起始索引(包含),以toIndex為終止索引(不包含)的子列表(List)。
但值得注意的是,返回的這個子列表的幕后其實還是原列表;
也就是說,修改這個子列表,將導致原列表也發生改變;反之 父的list改變會影響子的list失效,報錯
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
System.out.println(list.size());
List<String> list1 = new ArrayList<>(list);
System.out.println(list1.size());
List<String> list2 = list.subList(0, list.size());
list2.add("b");
System.out.println(list2.size());
System.out.println(list.size());
System.out.println(list.equals(list1));
System.out.println(list.equals(list2));
list.add("c");
System.out.println(list.size());
System.out.println(list2.size());
System.out.println(list.equals(list1));
System.out.println(list.equals(list2));
}
打印結果當父list改變時候子list卻是報錯了
1
1
2
2
false
true
3
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1231)
at java.util.ArrayList$SubList.size(ArrayList.java:1040)
at top.coolook.contentgather.aaa.A.main(A.java:24)
下面是一段實例代碼:
- import java.util.ArrayList;
- import java.util.List;
- public class TestSubList {
- public static void main(String[] args) {
- List<Integer> test = new ArrayList<Integer>();
- //init list
- for (int i = 0; i < 5; i++) {
- test.add(i); //auto boxing
- }
- //display the list
- System.out.print("the orginal list: ");
- for (int i = 0; i < test.size(); i++) {
- System.out.print(test.get(i) + " ");
- }
- System.out.println();
- //sub list
- List<Integer> sub = test.subList(1, 3); //sub list contains elements: 1, 2
- sub.remove(1); //remove element “2” from sub list
- //display the list again
- System.out.print("the orginal list after sublist modified: ");
- for (int i = 0; i < test.size(); i++) {
- System.out.print(test.get(i) + " ");
- }
- System.out.println();
- }
- }
程序運行結果:
the orginal list: 0 1 2 3 4
the orginal list after sublist modified: 0 1 3 4
在這段代碼中,我們並沒有改變原始列表“test”其中的元素。然而,當刪除由subList方法得到的子列表中的元素時,原始列表中的該元素也被刪除了。
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
for(int i=0;i<5;i++){
list.add(i);
}
System.out.println(list);
List<Integer> list01=list.subList(1, 4);
list01.add(6);
System.out.println(list01);
System.out.println(list.toString());
System.out.println(list);
}
結果:
[0, 1, 2, 3, 4]
[1, 2, 3, 6]
[0, 1, 2, 3, 6, 4]
[0, 1, 2, 3, 6, 4]