2013-02-18 234 views
4

對於java.util.concurrent.BlockingQueue檢查,如果隊列包含對象

通過Java規範,對於一個方法contains(Object o)

如果我以前就像插入一個新的對象:

Task task = new Task("taskname", "somevalue"); 
queue.put(task); 

就可以了。後來又嘗試這樣做:

Task task = new Task("taskname", "somevalue"); 
queue.contains(task); 

由於BlockingQueue的只是一個接口,通過Java規範,這應該回真的還是假的?

Task類是Serializable所以比較將根據字段值的權利?

+0

什麼是「任務」? – 2013-02-18 06:33:38

回答

9

該行爲取決於Task類是否覆蓋equals方法。根據equals方法的邏輯,這兩個任務may/may not是相等的。

Java docs of Blocking queue

布爾含有(對象O)

返回true如果此隊列包含指定的元素。更正式地說,當且僅當此隊列至少包含一個元素e,使得o.equals(e)。

如果equals方法沒有重寫,那麼Java將使用equals method of Object爲相等性檢查(其檢查是否對象的引用是相等的)。

public boolean equals(Object obj) { 
    return (this == obj); 
} 

由於這些是兩個不同的對象,所以對象的引用ID將是不同的,因此contains將返回false

+0

要明確,'equals'是負責確定兩個對象是否相等的方法。許多數據結構要求'hashCode'在相等的對象中相等,但是具有相同哈希代碼的兩個對象可能不相等。 「equals」的默認實現不涉及散列代碼,而是涉及內部對象id,使得兩個對象只有在引用完全相同的對象實例時才相等。 – 2013-02-18 06:50:01

+0

@JeffBowman謝謝您指出我答案中的差異。我已經做了更正。 – ManojGumber 2013-02-18 07:30:46

1

由於BlockingQueue只是一個接口,按照Java規範, 應該返回true還是不是?

這是一個奇怪的問題。只要queue對象被創建,它應該按照其接口(BlockingQueue)承諾的那樣行事。

接口是抽象的,它不能被自身實例化,但它是由實現它的類所創建的所有對象的通用契約。

至於你concreate的問題,無論是queue.contains(task)返回true取決於類Task如何定義它equals方法。

+1

雖然其他答案關注'queue.contains'問題,但我認爲更大的問題是OP並不真正理解接口的概念。 – 2013-02-18 07:26:51

0

這取決於您在方法中編寫的邏輯是什麼。當你嘗試實例化BlockingQueue<Object>是迫使你實施幾個方法,並且是他們的ojne。

BlockingQueue<Object> a = new BlockingQueue<Object>() 
{ 

    @Override 
    public Object remove() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object poll() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object element() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object peek() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int size() 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean isEmpty() 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Iterator<Object> iterator() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object[] toArray() 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public <T> T[] toArray(T[] a) 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean containsAll(Collection<?> c) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean addAll(Collection< ? extends Object> c) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean removeAll(Collection<?> c) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean retainAll(Collection<?> c) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void clear() 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean add(Object e) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean offer(Object e) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void put(Object e) throws InterruptedException 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean offer(Object e, long timeout, TimeUnit unit) throws InterruptedException 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public Object take() throws InterruptedException 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Object poll(long timeout, TimeUnit unit) throws InterruptedException 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int remainingCapacity() 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean remove(Object o) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean contains(Object o) 
    { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public int drainTo(Collection< ? super Object> c) 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public int drainTo(Collection< ? super Object> c, int maxElements) 
    { 
     // TODO Auto-generated method stub 
     return 0; 
    } 
}; 
相關問題