1. 程式人生 > >List的contains()和remove()方法探討

List的contains()和remove()方法探討

       作為常用的資料結構,List經常被我們用到,以ArrayList為例,本文主要介紹其contains()和remove()方法。
       假設有以下資料結構:

class Int {
  private int id;
  public Int(int id) {
    this.id = id;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String toString(){
    return this
.id + ""; } } List<Int> aList = new ArrayList(); aList.add(new Int(10)); aList.add(new Int(11)); aList.add(new Int(3)); List<Integer> bList = new ArrayList(); bList.add(2); bList.add(11); bList.add(31);

       現在需要將aList中id等於bList的資料同時從aList和bList中刪除,可使用下面方法

for (int i = 0;i < aList.size();i++) {
if (bList.contains(aList.get(i).getId())) { bList.remove(new Integer(aList.get(i).getId())); aList.remove(i--); } } System.out.println("aList : " + aList); System.out.println("bList : " + bList);

       輸出結果為:
       aList : [10, 3]
       bList : [2, 31]

       在上例中,使用到了List的contians()和remove()方法

       在ArrayList的api中,contains()方法定義如下:

public boolean contains(Object o) {
    return indexOf(o) >= 0;
}
public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

       從api中可以看出,contains()方法是將入參迴圈呼叫Object的equals()方法,在上文的例子中,由於int可自動裝箱為Integer型別,而Integer的equals()已經重寫,如果相比較的兩個Integer物件的int的值相等則返回true,所以可用bList.contains(aList.get(i).getId())的方式來判斷aList中的int型別值是否在bList中。

       remove()方法定義如下:

public E remove(int index) {
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}
public boolean remove(Object o) {
    if (o == null) {
        for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                fastRemove(index);
                return true;
            }
    } else {
        for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
    }
    return false;
}

       remove()使用了過載,既可以通過Object引數來刪除,也可以通過ArrayList的下標來刪除,所以在呼叫時需要注意,如果入參為int型別時,會造成呼叫remove(int index)方法而不是remove(Object o)導致無法自動裝箱出錯,可能會造成集合的引用越界問題,因此需要使用bList.remove(new Integer(aList.get(i).getId()))而不是bList.remove(aList.get(i).getId())

相關推薦

List的contains()remove()方法探討

       作為常用的資料結構,List經常被我們用到,以ArrayList為例,本文主要介紹其contains()和remove()方法。        假設有以下資料結構: class Int { private int id; public

jquery的empty()remove()方法

html ive 效果 span -c cnblogs empty con ace jquery之empty()與remove()區別 要用到移除指定元素的時候,發現empty()與remove([expr])都可以用來實現。可仔細觀察效果的話就可以發現。empty(

Arrays.asList 使用add remove方法 出現java.lang.UnsupportedOperationException

陣列轉化集合 陣列轉化為集合時 Java有提供相應的工具類方法 Arrays.asList()方法 但是當使用Arrays.asList()方法,會可能出現一些操作問題。 先分析一下該方法原始碼: @SafeVarargs public static <

Datatable刪除行的DeleteRemove方法

在C#中,如果要刪除DataTable中的某一行,大約有以下幾種辦法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index);可以直接刪除行 2,datatable.Rows[i].Delete()。Delete()之後需要

為什麼Java裡的Arrays.asList不能用addremove方法

在平時的開發過程中,我們知道可以將一個Array的物件轉化為List。這樣的操作,我們只要採用Arrays.asList這個方法就行了。筆者前段時間一直用這個方法,有一天,我發現通過Arrays.asList得到的List無法進行add和remove等操作。 下面是一段很簡

ArrayListLinkedList addremove方法的比較

ArrayList 是一種可增長的陣列的實現。 使用ArrayList的優點在於 對 get和set的呼叫是花費常數時間。缺點就是有新的項插入,和現有的項刪除代價昂貴,除非變動是 在ArrayList的末端進行。 使用LinkedList的優點在於新的項的插入和現有的項的

Datatable刪除行的DeleteRemove方法的區別介紹

1、在C#中,如果要刪除DataTable中的某一行,大約有以下幾種辦法: •使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(index);可以直接刪除行 •datatable.Rows[i].Del

為什麽使用 Arrays.asList()得到的集合,使用remove( ) add( )方法會拋出unsupportedoperationexception(不支持操作異常)

操作 err move lan 16px exceptio operation amp span  這是由於:    Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。 Arrays$ArrayList

JDK原始碼-HashMap-remove方法(JDK7JDK8)

remove方法原始碼相應簡單很多 測試程式碼 /** * 測試remove操作的區別 */ @Test public void remove(){ HashMap<String, String> map = new HashMap();

Queue介面分析:addoffer區別,removepoll方法到底啥區別

往佇列中新增元素有兩個方法,分佈是add和offer方法,兩者的入參和返回值都一樣,或許很多同學都奇怪,為什麼,要有這兩個功能類似(都是新增元素),但方法名不一樣的方法,看看原始碼的註釋 以下為Queue介面中方法定義: ``` public interface Queue<E

java對hashCode()equals()方法探討

我們經常聽說過如果我們重寫的equals()方法,那麼我們必須重新hashCode()方法,那麼為什麼要這麼做呢,其實其中還是有原因的 我們可以舉一個例子,可以利用HashSet來檢驗,我們知道HashSet中定義了一個HashMap的變數和一個final型別的Object

list中刪除元素的方法:pop(x)remove(x)

簡單總結一下: list.remove(x)中的引數是列表中元素,即刪除某個元素;list.pop([i])中的i是列表中元素的索引值,這個i用放括號包裹起來,意味著還可以不寫任何索引值,如上面操作結果,就是刪除列表的最後一個。 給看官留下一個思考題,如果要像前面那樣,能

list執行removeadd方法時,報java.util.ConcurrentModificationException的原因

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { //AbstractCollection和List都繼承了Collection protect

Python中列表的方法:append()extend()的區別還有pop()remove()的區別

1、 append()和extend()的區別append 和extend都是列表的方法之一,共同點都是在列表的左後新增列表的元素,區別在於append()是將要新增的物件作為一個整體新增到列表中,被新增的物件最終做為原列表的一個元素,extend()方法則是將一個可迭代物件

python:remove,popdel方法的區別

這三種方法都是list的刪除方法,其中remove是針對可變列表的元素進行搜尋刪除,而pop和del是針對可變列表的下標進行搜尋刪除。具體區別如下: 1. remove remove(item)方法是直接對可變序中的元素進行檢索刪除,返回的是刪除後的列表,不

Java中父類子類中的方法呼叫引數傳遞探討

有這樣一段程式,看看它會輸出什麼結果 public class Test { public static void main(String [] args){ System.out.println(new B().getVa

集合類的remove(obj)iterator的remove方法差別

工作中碰到個ConcurrentModificationException。程式碼如下:List list = ...; for(Iterator iter = list.iterator(); iter.hasNext();) {     Object obj = it

web測試中的測試點測試方法總結

動態 小數 圖片尺寸 提示信息 方便 margin style 容錯性 字符型 測試是一種思維,包括情感思維和智力思維,情感思維主要體現在一句俗語:思想決定行動上(要懷疑一切),智力思維主要體現在測試用例的設計上。具有了這樣的思想,就會找出更多的bug。 一、輸入框

函數中的私有變量特權方法

getc 單例 隱藏數據 需要 接口 返回對象 div 外部 his 定義   【1】【私有變量】  任何在函數中定義的變量,都可以認為是私有變量,因為不能在函數外部訪問這些變量。私有變量包括函數的參數、局部變量和在函數內部定義的其他函數   【2】【特權方法】  如果在函

[C#學習筆記之異步編程模式2]BeginInvokeEndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,