检查队列是否包含对象

时间:2013-02-18 06:29:49

标签: java

对于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规范,它是否应该返回true?

Task类是Serializable所以比较将基于字段值吗?

3 个答案:

答案 0 :(得分:10)

行为取决于Task类是否覆盖equals方法。根据{{​​1}}方法的逻辑,这两个任务equals是相同的。

来自Java docs of Blocking queue

  

boolean contains(Object o)

     

如果此队列包含指定的元素,则返回true。更正式地说,当且仅当此队列包含至少一个元素e以便o.equals(e)时才返回true。

如果未覆盖may/may not方法,则Java将使用equals method of Object进行相等性检查(检查对象引用是否相等)。

equals

由于这些是两个不同的对象,因此对象引用ID将不同,因此 public boolean equals(Object obj) { return (this == obj); } 将返回contains

答案 1 :(得分:1)

  

由于BlockingQueue只是一个接口,因此遵循Java规范,   该回报是否真实?

这是一个奇怪的问题。只要创建了queue对象,它就应该按照其接口(BlockingQueue)的承诺行事。

接口是抽象的,因为它不能自己实例化,但它是由实现它的那些类创建的所有对象的通用契约。

至于您的concreate问题,queue.contains(task)返回true是否取决于班级Task如何定义其equals方法。

答案 2 :(得分:0)

这取决于您在contains()方法中编写的逻辑。当您尝试实例化BlockingQueue<Object>时,会强制您实现一些方法,contains()是其中的一部分。

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;
    }
};