在不知道元素的索引的情况下,我可以从哪个java容器中更容易地删除元素?

在不知道元素的索引的情况下,我可以从哪个java容器中更容易地删除元素?,java,containers,Java,Containers,有没有java容器有两个方法,add和remove,它们只接受元素(而不是索引) 我想这样做: MagicContainer<Foo> mc = MagicContainer<Foo>(); mc.add(new Foo()); mc.add(someFoo1=new Foo()); mc.add(new Foo()); mc.add(someFoo2=new Foo()); mc.remove(someFoo1); mc.remove(someFoo2); Mag

有没有java容器有两个方法,add和remove,它们只接受元素(而不是索引)

我想这样做:

MagicContainer<Foo> mc = MagicContainer<Foo>();

mc.add(new Foo());
mc.add(someFoo1=new Foo());
mc.add(new Foo());
mc.add(someFoo2=new Foo());

mc.remove(someFoo1);
mc.remove(someFoo2);
MagicContainer mc=MagicContainer();
mc.add(新的Foo());
mc.add(someFoo1=newfoo());
mc.add(新的Foo());
mc.add(someFoo2=newfoo());
mc.移除(1);
mc.移除(2);

任何集合实现都应该工作。

任何集合实现都应该工作。

每个Java都有一个和一个方法来实现您想要的功能

由于
Collection
是一个接口,因此您需要选择其中一个实现(通常也是or实现)。这是一个相当普遍的选择

A是另一个可能的候选人

Colllection<Foo> mc = new ArrayList<Foo>();

mc.add(new Foo());
mc.add(someFoo1=new Foo());
mc.add(new Foo());
mc.add(someFoo2=new Foo());

mc.remove(someFoo1);
mc.remove(someFoo2);
collection mc=newarraylist();
mc.add(新的Foo());
mc.add(someFoo1=newfoo());
mc.add(新的Foo());
mc.add(someFoo2=newfoo());
mc.移除(1);
mc.移除(2);
您想要哪种特定的实现,将取决于您想要的其他属性

如果要保持已定义的顺序并按索引访问对象,则需要一个
列表
实现。“默认”
列表是
ArrayList
。如果您经常在末尾以外的任何位置删除/添加元素,则
LinkedList
将提供更好的性能(但大多数情况下您不会注意到差异)

如果要避免重复对象,则需要
Set
实现。“default”
Set
HashSet
,但偶尔也会使用a,提供了定义顺序的额外好处(但它要求您提供a或确保所有元素都是)。每个Java都有一个和一个方法来做您想做的事情

由于
Collection
是一个接口,因此您需要选择其中一个实现(通常也是or实现)。这是一个相当普遍的选择

A是另一个可能的候选人

Colllection<Foo> mc = new ArrayList<Foo>();

mc.add(new Foo());
mc.add(someFoo1=new Foo());
mc.add(new Foo());
mc.add(someFoo2=new Foo());

mc.remove(someFoo1);
mc.remove(someFoo2);
collection mc=newarraylist();
mc.add(新的Foo());
mc.add(someFoo1=newfoo());
mc.add(新的Foo());
mc.add(someFoo2=newfoo());
mc.移除(1);
mc.移除(2);
您想要哪种特定的实现,将取决于您想要的其他属性

如果要保持已定义的顺序并按索引访问对象,则需要一个
列表
实现。“默认”
列表是
ArrayList
。如果您经常在末尾以外的任何位置删除/添加元素,则
LinkedList
将提供更好的性能(但大多数情况下您不会注意到差异)


如果要避免重复对象,则需要
Set
实现。“default”
Set
HashSet
,但偶尔也会使用a,提供了定义顺序的额外好处(但它要求您提供a或确保所有元素都是)。

如响应所述,它是java.util.Set。如果你想使用Set,你必须在Foo类中实现equals和hashCode。@维克托:如果
对象的默认行为(即每个对象只等于自身)是可接受的,你可以使用
HashSet
&co而不重写
hashCode()
equals()
@约阿希姆:是的,当然,就像回答说的,是java.util.Set。如果你想使用Set,你必须在Foo类中实现equals和hashCode。@维克托:如果
对象的默认行为(即每个对象只等于自身)是可接受的,你可以使用
HashSet
&co而不重写
hashCode()
equals()
@Joachim:是的,当然,据我所知,我需要知道索引编号才能从ArrayList中删除某些内容,所以只有实现Set接口的集合看起来是可以的。@Noised remove可以接受对象引用,并且在所有列表实现中都可用。不需要索引。@noised:
remove()
实际上在
列表上重载。有一个将索引作为
int
,还有一个(链接在上面)将要删除的对象作为索引(这是由
集合
接口继承的。据我所知,我需要知道索引编号才能从ArrayList中删除某些内容,因此只有实现Set接口的集合看起来是可以的。@Noised remove可以接受对象引用,并且在所有列表实现中都可用。不需要索引。@Noised:
remove()
实际上是在
列表上重载的。有一个将索引作为
int
的,还有一个(链接在上面)将对象移除(那一个是由
集合
接口继承的。虽然不是严格的false,但这不是整个存储。因此,
集合
不必是
集合
就可以了!虽然不是严格的false,但这不是整个存储。因此,
集合
不必是
集合
就可以了可能!