我正在尝试将类的对象添加到向量中。但是在添加第二个对象时,第一个对象将被第二个对象替换。
这是我的代码:
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
以上是我想要做的简单版本。
是否有任何结构随时可用,我可以用于我的要求。或者应该创建一个新的类对象数组。
答案 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集合的工作方式。
或者应该创建一个新的类对象数组。
我看不出这会有什么帮助。