5

为一个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 还是不返回?

该类TaskSerializable这样的比较将基于字段值对吗?

4

3 回答 3

11

行为取决于Task类是否覆盖equals方法。根据equals方法的逻辑,这两个任务may/may not是相等的。

来自阻塞队列的 Java 文档

布尔包含(对象o)

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

如果该equals方法没有被覆盖,那么 Java 将使用for 相等检查equals方法Object(检查对象引用是否相等)。

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

由于这是两个不同的对象,所以对象引用 id 会不同,因此contains会返回false.

于 2013-02-18T06:35:55.040 回答
1

由于 BlockingQueue 只是一个接口,根据 Java 规范,这应该返回 true 还是不返回?

这是一个奇怪的问题。只要对象被创建,它就应该按照它的 interface( )queue所承诺的行为。BlockingQueue

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

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

于 2013-02-18T06:37:26.727 回答
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;
    }
};
于 2013-02-18T06:37:39.320 回答