重复将一个对象实例添加到集合中,但让集合存储多个实例

时间:2013-10-19 13:38:09

标签: 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 = "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);
    }

以下是我在上面使用的Item类的实现。

public class Item {

    public String Name=null;
    public String Price=null;
    public String Des=null;
    public String image=null;
}

我得到的输出:

pinto
pinto

期望的输出:

maclean 
pinto

以上是我想要做的简单版本。


你好忘了早些提到。我不能每次都创建一个新实例。任何人都可以建议一个建议,这样我就不需要每次都创建一个新实例。我想知道是否有一些结构可以存储整个对象而不是指向对象的指针。

是否有任何结构随时可用,我可以用于我的要求。或者应该创建一个新的类对象数组。

5 个答案:

答案 0 :(得分:2)

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

因此,您在Vector实例中最终得到的是对同一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);
}

在Java中使用new关键字时,您需要在堆上为对象保留空间。在这里,您没有使用new来创建Item类型的新对象。所以你仍然在堆上引用Item的相同实例,因此为什么要修改该对象。有关使用Java创建对象的更多信息,请参阅here

根据您的修改

  

你好忘了早些提到。我不能每次都创建一个新实例。

通过创建一个内部复制您添加到其中的对象的集合,有一种方法可以“解决”这个问题。

所以这是一个名为CopyCollection的特殊集合,我刚才写道:

public class CopyCollection {

    private List<Item> list = new ArrayList();

    public void add(Item item)
    {
        Item newItem = new Item();
        newItem.Name = item.Name;
        newItem.Price = item.Price;
        newItem.Des = item.Des;
        newItem.image = item.image;

        list.add(newItem);
    }

    public Item get(int index)
    {
        return list.get(index);
    }

    public int size()
    {
        return list.size();
    }   
}

你会像这样使用它:

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使用了包含ArrayList类型对象的Item - 这也消除了以后投射的需要。每当您将单个Item对象的另一个配置添加到此集合时,此集合的add方法将创建Item的新实例,其中包含传递给Item对象的当前配置它

答案 1 :(得分:2)

每次都创建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);

这可以解决您的问题。

严重的矢量被Collection框架破坏/取代。

我建议您使用List<Item>代替Vector

有用的链接:


修改:

  

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

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

答案 2 :(得分:1)

对于每个新项目,您需要“new Item();”。在您的代码中,您只需将新值替换为新值,并将2个引用放入Vector中的相同项目。

还要考虑使用ArrayList而不是Vector。 Vector是一个有点过时的类。

答案 3 :(得分:1)

您必须创建单独的实例以放入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<>();

答案 4 :(得分:1)

如果您希望每个条目都有Item,则每个条目都需要一个项目。这没有神奇的方法。您可以做的是在添加项目时创建副本

// 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.

BTW除非必须,否则不使用Vector,它在1998年被ArrayList取代。

您的代码中似乎有一个错误,您无法轻松解决此问题。在某些时候修复错误是正确的答案。

  

是否有任何结构随时可用,我可以用于我的要求。

这不是Java集合的工作方式。

  

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

我看不出这会有什么帮助。