ArrayList的subList方法
李說:
ArrayList的subList方法獲取到的是ArrayList的一段list,只是其中的一段視圖。所以修改subList ,ArrayList同時會修改,因為本來就是同一個東西。
jdk文檔中是這樣說的:
List<E> | subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間的部分視圖。 |
補充參考網上資料是這樣說的:
1,該方法返回的是父list的一個視圖,從fromIndex(包含),到toIndex(不包含)。fromIndex=toIndex 表示子list為空
2,父子list做的非結構性修改(non-structural changes)都會影響到彼此:所謂的“非結構性修改”,是指不涉及到list的大小改變的修改。相反,結構性修改,指改變了list大小的修改。
3,對於結構性修改,子list的所有操作都會反映到父list上。但父list的修改將會導致返回的子list失效。
4,tips:如何刪除list中的某段數據:
list.subList(from, to).clear();
示例代碼:
來自【Java每日一題】20170105,就是看到這個題目才讓我知道list的這個方法我沒有接觸過
package ques; import java.util.ArrayList; import java.util.List; public class Ques0105 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("a"); // 使用構造器創建一個包含list的列表list1 List<String> list1 = new ArrayList<String>(list); // 使用subList生成與list相同的列表list2 List<String> list2 = list.subList(0, list.size()); list2.add("b"); System.out.println(list.equals(list1)); System.out.println(list.equals(list2)); } }
返回結果如下:
可以發現,list2為list的子list,當list2發生結構性修改(list2.add("b"))後,list也發生相應改變,所以返回結果為false和true
註意:
引自《阿裏巴巴Java開發手冊》
【強制】 ArrayList 的 subList 結果不可強轉成 ArrayList ,否則會拋出 ClassCastException
異常: java . util . RandomAccessSubList cannot be cast to java . util . ArrayList ;
說明: subList 返回的是 ArrayList 的內部類 SubList ,並不是 ArrayList ,而是
ArrayList 的一個視圖,對於 SubList 子列表的所有操作最終會反映到原列表上。
本文出自 “JianBo” 博客,請務必保留此出處http://jianboli.blog.51cto.com/12075002/1971145
ArrayList的subList方法