2013-02-18 192 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; 
    } 
}; 
相关问题