-1

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

这是我的代码:

    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

以上是我正在尝试做的简单版本。


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

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

4

5 回答 5

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);
}

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

根据您的编辑:

嗨忘记提早了。我不能每次都创建一个新实例。

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

所以这是我刚刚写的一个特殊的集合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

于 2013-10-19T13:40:10.230 回答
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

于 2013-10-19T13:40:28.503 回答
1

对于每个新项目,您需要有“new Item();”。在您的代码中,您只是用新值替换了早期的值,并在 Vector 中放置了对同一项目的 2 个引用。

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

于 2013-10-19T13:39:51.767 回答
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<>();
于 2013-10-19T13:42:57.287 回答
1

如果您希望Item每个条目都有一个,则每个条目都需要一个 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.

顺便说一句,除非必须,否则不使用 Vector,它在 1998 年被 ArrayList 取代。

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

是否有任何现成的结构可以用于我的要求。

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

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

我不明白这会有什么帮助。

于 2013-10-19T15:48:09.623 回答