Java List 集合的子列表

問:下面程序片段的輸出結果是什么玻褪?為什么?
        List<String> list = new ArrayList<>();
        list.add("android");
        list.add("java");
        
        List<String> list1 = new ArrayList<>(list);
        
        List<String> list2 = list.subList(0, list.size());
        list2.add("unix C");
        
        System.out.println(list.equals(list1));
        System.out.println(list.equals(list2));

答:輸出為 false公荧、true带射。
因為通過構造方法創(chuàng)建的 list1 實質上新的列表,其內(nèi)部實現(xiàn)是通過 copyof 動作生成的循狰,生成的列表與原列表沒有任何關系(雖然是淺拷貝窟社,但是由于元素是 String 類型,所以可以理解成是深拷貝)绪钥,所以當我們對 list 添加了元素后再與 list1 進行對比會發(fā)現(xiàn)沒有任何關系灿里,而依據(jù)集合的比較都是比較元素值,其實是因為 list2 添加了新元素程腹,導致原來的列表 list 的元素改變了匣吊,所以 list 與 list1 自然不相等。對于 list2 來說 subList 產(chǎn)生的集合列表只是一個視圖寸潦,所有的修改操作都會作用于原集合列表上色鸳,所以修改 list2 就相當于修改了 list 集合,可以去看 AbstractList 和 ArrayList 中 subList 的實現(xiàn)见转,雖然生成了新的 ArrayList public 內(nèi)部類 SubList 實例命雀,但是該實例中每個操作都傳遞操作了外部類 ArrayList 的對應操作,所以返回 true斩箫。

問:如何優(yōu)雅的刪除列表區(qū)間吏砂,譬如有一個 List 里面有 100 個元素,現(xiàn)在想刪除 30 到 50 之間的元素乘客,怎么寫代碼最優(yōu)雅狐血?

答:常見的刪除操作都是通過遍歷刪除區(qū)間的,譬如 index 索引從 30 開始到 50 結束易核,總之都得兩三句代碼氛雪,而問題提到了優(yōu)雅就是說美觀簡潔咯,下面的方式即可:

  list.subList(30, 50).clear();

所以說遇到類似場景還是使用這種優(yōu)雅方式吧耸成,一行代碼簡潔大方。

問:下面程序片段運行結果是什么浴鸿?為什么井氢?
       List<String> list = new ArrayList<>();
        list.add("android");
        list.add("java");
        
        List<String> sublist = list.subList(0, list.size());
        list.add("unix C");
        
        System.out.println("list size=" + list.size());
        System.out.println("sublist size=" + sublist.size());

答:這個程序運行會在 sublist.size() 處報錯 ConcurrentModificationException。因為 subList 取出的列表只是原列表的一個視圖岳链,原數(shù)據(jù)集合修改了后 subList 取出的子列表不會重新生成新的列表花竞,而 SubList 中每個方法都有修改計數(shù)檢測,后面再對子列表操作時就檢測到計數(shù)器與預期不相等了,所以拋出異常约急,切記通過 subList 生成子列表后不要再操作原列表零远。

問:下面程序有問題嗎?為什么厌蔽?
        ArrayList<String> list = new ArrayList<>();
        list.add("android");
        
        ArrayList<String> subList = (ArrayList<String>) list.subList(0, 1);
        subList.add("unix");

答:這個程序運行會拋出 java.lang.ClassCastException: java.util.ArrayList$SubList cannot be cast to java.util.ArrayList 異常牵辣。

因為 subList 返回的 List 是 ArrayList 內(nèi)部類 SubList(繼承自 AbstractList),看起來都是 List 的實現(xiàn)奴饮,但是不是同一個子類纬向,無法強轉為 ArrayList,修改方案為 subList 的返回接收聲明為 List<String> 類型即可戴卜。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逾条,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子投剥,更是在濱河造成了極大的恐慌师脂,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件江锨,死亡現(xiàn)場離奇詭異吃警,居然都是意外死亡,警方通過查閱死者的電腦和手機泳桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門汤徽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灸撰,你說我怎么就攤上這事谒府。” “怎么了浮毯?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵完疫,是天一觀的道長。 經(jīng)常有香客問我债蓝,道長壳鹤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任饰迹,我火速辦了婚禮芳誓,結果婚禮上毁欣,老公的妹妹穿的比我還像新娘钝吮。我一直安慰自己霍衫,他們只是感情好嫡秕,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布新蟆。 她就那樣靜靜地躺著浮定,像睡著了一般揽涮。 火紅的嫁衣襯著肌膚如雪狸窘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天烟号,我揣著相機與錄音绊谭,去河邊找鬼。 笑死汪拥,一個胖子當著我的面吹牛达传,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喷楣,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趟大,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铣焊?” 一聲冷哼從身側響起逊朽,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曲伊,沒想到半個月后叽讳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡坟募,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年岛蚤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懈糯。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涤妒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赚哗,到底是詐尸還是另有隱情她紫,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布屿储,位于F島的核電站贿讹,受9級特大地震影響,放射性物質發(fā)生泄漏够掠。R本人自食惡果不足惜民褂,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疯潭。 院中可真熱鬧赊堪,春花似錦、人聲如沸竖哩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽期丰。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钝荡,已是汗流浹背街立。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埠通,地道東北人赎离。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像端辱,于是被迫代替她去往敵國和親梁剔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容