1. 程式人生 > >ArrayList的subList方法

ArrayList的subList方法

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方法