成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

阿里巴巴為什么這樣強制從List中刪除元素

開發 前端
這個方法利用了 Stream 的篩選功能,快速過濾所需要的元素,雖然不是進行集合刪除,但達到了同樣的目的,這種方法要更簡潔,看了上面的幾個例子,相信你熟悉了List刪除元素的用法了,希望你看了上面的例子,開發的時候不會再犯錯了。?

?還是先舉個例子,你侄女對天文知識感興趣,然后你就用程序寫了太陽系九大星系(水星、金星、地球、火星、木星、土星、天王星、海王星、冥王星)的運行軌跡圖,然后拿給侄女看。然后她說錯了錯了,你的知識太舊了,多了一顆星。根據2006年8月24日國際天文聯合大會召開,在會議上經過投票表決,冥王星被降級為矮行星,太陽系目前只剩下八顆行星。所以你需要刪除一顆星。這個時候你打開電腦開始刪除冥王星。

你從下面List中刪除一顆星。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"木星","土星","天王星","海王星","冥王星","冥王星");

怎么刪除List中的冥王星呢?[PS為了演示某些刪除方法不可靠,重復寫了冥王星] 。

先寫一段阿里規約:

【強制】不要再foreach循環里進行元素的remove/add操作,remove元素請使用Iterator方式,如果并發的操作,需要對Iterator對象加鎖。

好了,那就讓我們來寫所有可能刪除元素的方法

1:普通的for循環的刪除(不可靠)。

List<String> list = new ArrayList(tempList);
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
if ("冥王星".equals(str)) {
list.remove(i);
}
}
System.out.println(list);

運行結果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星, 海王星, 冥王星]

奇了怪了,沒刪除干凈?

問題出在 list.size(),因為 list.size() 和 i 都是動態變化的,i 的值一直在累加,list.size() 一直在減少,所以 list 就會早早結束了循環。所以這種方式雖然不會報錯,但存在隱患,并且不容易被察覺,不建議使用。

2:普通的for循環提取變量進行刪除(這個更不可靠,會報錯)。

List<String> list = new ArrayList(tempList);
int size = list.size();
for (int i = 0; i < size; i++) {
String result = list.get(i);
if ("冥王星".equals(result)) {
list.remove(i);
}
}
System.out.println(list);

結果如下:

這更不對了,一下子搞出個下標越界。

因為 size 變量是固定的,但 list 的實際大小是不斷減小的,而 i 的大小是不斷累加的,一旦 i >= list 的實際大小肯定就異常了。

3:普通的for循環倒敘刪除(這個用法可以,但也不推薦,倒敘看著很別扭,個人意見)。

for (int i = list.size() - 1; i > 0; i--) {
String result = list.get(i);
if ("冥王星".equals(result)) {
list.remove(i);
}
}
System.out.println(list);

運行結果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星, 海王星]

4:使用增強的for循環刪除(會拋出異常,不推薦,注意我這次為了演示效果,把行星的順序換一下),不少開發者喜歡用這種方式。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"冥王星","土星","天王星","海王星","冥王星","木星");
List<String> list = new ArrayList(tempList);
for (String item : list) {
if ("冥王星".equals(item)) {
list.remove(item);
}
}
System.out.println(list);

結果如下:

奇了怪了,又拋異常了。不過這次的異常和上面的下標異常不太一樣,這次是:

java.util.ConcurrentModificationException

這個是集合操作中很常見的異常之一,即并發修改異常!

增強的 for循環,其內部是調用的 Iterator 的方法,取下個元素的時候都會去判斷要修改的數量(modCount)和期待修改的數量(expectedModCount)是否一致,不一致則會報錯,而 ArrayList 中的 remove 方法并沒有同步期待修改的數量(expectedModCount)值,所以會拋異常了。

5、迭代器循環迭代器刪除(可靠,也是十分推薦的用法)。

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String item = iterator.next() ;
if ("冥王星".equals(item)){
iterator.remove();
}
}
System.out.println(list);

結果如下,十分完美和正確:

[水星, 金星, 地球, 火星, 土星, 天王星, 海王星, 木星]

這是因為迭代器中的 remove 方法將期待修改的數量(expectedModCount)值進行了同步。

6:迭代器循環集合刪除(這個可能很多開發者也會這樣寫,也可能會拋出異常的)。

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String item = iterator.next() ;
if ("冥王星".equals(item)){
list.remove(item);
}
}
System.out.println(list);

結果如下:

7:Stream filter 過濾(十分推薦,當然使用這個刪除需要JDK的環境在8及其8以上的版本)。

list = list.stream().filter(item -> !"冥王星".equals(item)).
collect(Collectors.toList());
System.out.println(list);

結果如下,十分完美和正確:

這個方法利用了 Stream 的篩選功能,快速過濾所需要的元素,雖然不是進行集合刪除,但達到了同樣的目的,這種方法要更簡潔

看了上面的幾個例子,相信你熟悉了List刪除元素的用法了,希望你看了上面的例子,開發的時候不會再犯錯了。?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-10-20 14:53:31

Foreach強制阿里巴巴

2021-10-11 09:32:40

包裝類型屬性

2018-10-16 15:34:17

阿里巴巴Apache Flin大數據

2013-08-22 09:26:38

去IOE王堅

2016-09-21 20:28:55

阿里巴巴IOE

2020-09-14 09:47:56

Java開發類型

2022-09-05 10:06:21

MySQL外循環內循環

2019-06-26 07:54:53

ArrayListsubList源碼

2021-08-04 17:20:30

阿里巴巴AsyncJava

2019-03-04 09:22:52

阿里巴巴foreach Java

2019-09-04 11:02:54

繼承層次組合

2019-09-02 15:20:28

Java開發繼承

2021-09-07 17:22:43

阿里巴巴辭職高薪

2010-06-28 10:43:47

2020-09-08 16:25:18

Apache BeancopyJava

2020-07-30 12:16:33

阿里巴巴Apache對象

2023-06-20 07:46:27

數據治理大數據建設

2013-08-22 09:41:52

阿里巴巴去IOE王堅

2022-03-14 09:41:10

POJO類型系統

2020-09-22 11:40:53

BigDecimalequalsJava
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999精品在线| 日韩精品一区二区三区 | 日韩a v在线免费观看 | 国产精品影视在线观看 | 精品国产乱码久久久久久闺蜜 | 久久一及片 | 91中文在线观看 | 国产精品福利久久久 | 高清黄色毛片 | 一区二区三区亚洲视频 | 久久成人免费 | 亚洲一区视频在线 | 香蕉视频91 | 激情五月婷婷综合 | 国产精品成人一区二区三区夜夜夜 | 免费观看av| 暴草美女| 每日在线更新av | 国产精品福利网站 | 国产精品永久免费视频 | 色综合一区二区三区 | 嫩草懂你的影院入口 | 国产成人精品一区二三区在线观看 | 久久com| 日韩成人影院在线观看 | 久久精品在线免费视频 | 免费观看成人性生生活片 | 精品国产18久久久久久二百 | 自拍偷拍亚洲一区 | 99re在线免费视频 | 国产成人影院 | 国产美女自拍视频 | 久久久青草婷婷精品综合日韩 | www.788.com色淫免费 | 欧美激情视频一区二区三区免费 | 免费国产精品久久久久久 | 请别相信他免费喜剧电影在线观看 | 天天操人人干 | 一级黄色在线 | 午夜久草 | 国产精品欧美一区二区三区不卡 |