对于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
所以比较将基于字段值吗?
答案 0 :(得分:10)
行为取决于Task
类是否覆盖equals
方法。根据{{1}}方法的逻辑,这两个任务equals
是相同的。
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;
}
};