Java 重复向集合添加对象的单个实例,但集合存储多个实例

Java 重复向集合添加对象的单个实例,但集合存储多个实例,java,class,collections,vector,reference,Java,Class,Collections,Vector,Reference,我试图将类的对象添加到向量中。但是在添加第二个对象时,第一个对象将被第二个对象替换 这是我的密码: Vector res = new Vector(); Item item = new Item(); item.Name = "maclean"; item.Des = "abcd"; item.Price = "RS 350"; item.image = "c.gif"; res.add(item); item.Name = "pi

我试图将类的对象添加到向量中。但是在添加第二个对象时,第一个对象将被第二个对象替换

这是我的密码:

    Vector res = new Vector();
    Item item = new Item();
    item.Name = "maclean";
    item.Des = "abcd";
    item.Price = "RS 350";
    item.image = "c.gif";
    res.add(item);
    item.Name = "pinto";
    item.Des = "gief";
    item.Price = "RS 450";
    item.image = "d.gif";
    res.add(item);
    for (int i = 0; i < res.size(); i++) {
        item = (Item) res.get(i);
        System.out.println(item.Name);
    }
我得到的输出:

pinto
pinto
期望输出:

maclean 
pinto
以上是我试图做的一个简单版本

他刚才忘记提了。我不能每次都创建一个新实例。任何人都可以提出建议,这样我就不必每次都创建一个新实例。我想知道除了向量之外,是否有其他结构可以存储整个对象,而不是指向对象的指针。
是否有现成的结构,我可以使用我的要求。或者应该创建一个新的类对象数组。

对于每个新项,您需要有新项;。在您的代码中,您只是用新值替换了先前的值,并在向量中放置了对同一项的两个引用


也考虑使用ARARYLIST而不是向量。Vector是一个有点过时的类。

您没有创建Item的新实例。您只是在更改项的原始实例的值

因此,在向量实例中,最终得到的是对同一个Item对象的两个引用

尝试将您的代码修改为:

Vector res = new Vector();
Item item = new Item();
item.Name = "maclean";
item.Des = "abcd";
item.Price = "RS 350";
item.image = "c.gif";
res.add(item);
Item item2 = new Item();
item2.Name = "pinto";
item2.Des = "gief";
item2.Price = "RS 450";
item2.image = "d.gif";
res.add(item2);
for (int i = 0; i < res.size(); i++) {
    item = (Item) res.get(i);
    System.out.println(item.Name);
}
你可以这样使用它:

public static void main(String[] args) {
    CopyCollection res = new CopyCollection();
    Item item = new Item();
    item.Name = "maclean";
    item.Des = "abcd";
    item.Price = "RS 350";
    item.image = "c.gif";
    res.add(item);
    item.Name = "pinto";
    item.Des = "gief";
    item.Price = "RS 450";
    item.image = "d.gif";
    res.add(item);
    for (int i = 0; i < res.size(); i++) {
        item = res.get(i);
        System.out.println(item.Name);
    }
}

因此,在后台,CopyCollection使用包含Item类型的对象的ArrayList,这也消除了以后强制转换的需要。每当您将单个项对象的另一个配置添加到此集合时,此集合的add方法将使用传递给它的项对象的当前配置创建项的新实例。

每次创建项的新实例

    Vector res = new Vector();
    Item item = new Item();
    item.Name = "maclean";
    item.Des = "abcd";
    item.Price = "RS 350";
    item.image = "c.gif";
    res.add(item);
    Item item2 = new Item();   <---
    item2.Name = "pinto";
    item2.Des = "gief";
    item2.Price = "RS 450";
    item2.image = "d.gif";
    res.add(item2);
这就解决了你的问题

严重的向量被收集框架所取代

我建议你用矢量代替

有用链接:

编辑:

我不能每次都创建一个新实例


不可能使用单个对象拥有多个数据副本。您必须创建一个新实例

您必须创建单独的实例以放置到向量中

您还可以向Vector实例添加类型,以避免在循环中执行强制转换:

Vector<Item> res = new Vector<>();
如果您希望每个条目都有一个条目,则每个条目都需要一个条目。这没有什么神奇的办法。您可以在添加项目时创建一个副本

// code which reuses the same object each time

list.add(item.clone()); // make the item Cloneable

list.add(new Item(item)); // use a copy constructor

Item item2 = new Item();
// copy fields from item to item2
list.add(item2); // add a copy.
顺便说一句,除非你不得不使用Vector,它在1998年被ArrayList取代

您的代码中似乎有一个bug,无法轻松解决这个问题。从某种意义上说,修复bug是正确的答案

是否有现成的结构,我可以使用我的要求

Java集合不是这样工作的

或者应该创建一个新的类对象数组


我不知道这会有什么帮助。

我失散已久的双胞胎兄弟,我们为第二项选择了相同的实例名称:You's edit几乎使前四个答案无效。这是一个非常关键的细节。我更新了我的答案,我相信这就是你所寻找的。嗨,我正在寻找新的存储类。此API的全部目的不是创建新的instance@MacleanPinto您的意思是将当前对象克隆到另一个对象并进行修改?你想要吗?每次我都会将数据添加到同一个对象。然后将其添加到存储向量中。现在,我要存储对象的克隆,而不是指向向量的指针。因此,当我更改或修改现有对象时,克隆应保持原样。然后在添加之前,克隆对象并将克隆对象添加到向量。就这样。不是原始对象。我已更新了答案,以提供实现此必需行为的集合。
Item item = new Item();
item.Name = "maclean";
item.Des = "abcd";
item.Price = "RS 350";
item.image = "c.gif";
res.add(item);
Item item2 = new Item();
item2.Name = "pinto";
item2.Des = "gief";
item2.Price = "RS 450";
item2.image = "d.gif";
res.add(item2);
Vector<Item> res = new Vector<>();
// code which reuses the same object each time

list.add(item.clone()); // make the item Cloneable

list.add(new Item(item)); // use a copy constructor

Item item2 = new Item();
// copy fields from item to item2
list.add(item2); // add a copy.