List接口作爲Java集合框架中的一員,對數據的操做和處理比數組方便許多。在數組中插入一個元素要從數組的最後一個元素到當前插入的位置依次向後移動一位,而後爲插入的位置進行賦值。在數組刪除一個元素要從刪除元素的下一個元素位置到數組最後一個元素依次向前移動一位。java
今天學習python的時候看到python
list = [1,1,1,2,3,4] for i in range(len(list)): if list[i] == 1: del list[i]
這樣是會報錯的,而後我就想Java中的List如何刪除重複的元素呢?因而作了一下嘗試:數組
List<String> list = new ArrayList<String>(); list.add("a"); list.add("a"); list.add("a"); list.add("c"); //wrong way,每次刪除index位置的元素,後邊的index+1元素會向前移動到index的位置。下次遍歷到Index+1其實是index+2位置的元素,這樣總會有一些元素沒有辦法遍歷到。有一種解決方法是每刪除一個元素,index-- for(int i=0;i<list.size();i++){ if(list.get(i).equals("a")) list.remove(i); } //wrong way,這樣操做會報錯ConcurrentModificationException。此類的iterator和listIterator方法返回的迭代器是快速失敗的:在建立迭代器以後,除非經過迭代器自身的remove或add方法從結構上對列表進行修改,不然在任什麼時候間以任何方式對列表進行修改,迭代器都會拋出 ConcurrentModificationException。所以,面對併發的修改,迭代器很快就會徹底失敗,而不是冒着在未來某個不肯定時間發生任意不肯定行爲的風險。 for(String li:list){ if(li.equals("a")) list.remove(li); } //wrong way,建立迭代器以後,只能經過迭代器自身的remove或add方法從結構上對列表進行修改 Iterator it = list.iterator(); while(it.hasNext()){ String element = (String) it.next(); if(element.equals("a")) list.remove(element); } //right,刪除元素後下標會向前移動一個位置,因此由後向前刪除就沒有問題了。 for(int i=list.size()-1;i>-1;i--){ if(list.get(i).equals("a")) list.remove(i); } //right,針對迭代器進行remove()也沒有問題 Iterator iterator = list.iterator(); while(iterator.hasNext()){ if(iterator.next().equals("a")) iterator.remove(); } //right use set,一種最簡單的方法是用set去除重複的元素。 Set<String> sets = new HashSet<String>(); sets.addAll(list); System.err.println(sets);