我想弄清楚这里发生了什么,并希望得到任何帮助。我有一个循环,我在创建新对象,然后将它们添加到ArrayList。但似乎每次循环时新对象实际上也在改变以前创建的对象。我知道ArrayList实际上只包含对象的引用,但我想通过每次调用new来创建新实例,因此每个引用都是唯一的。
以下是代码:
void copyFields()
{
String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";
String[][] fruitArray = new String[5][];
String[] fruitPairs = fruitStr.split(",");
int r = 0;
for (String fruitPair : fruitPairs)
{
fruitArray[r++] = fruitPair.split(" ");
}
ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
for (String[] f : fruitArray)
{
Fruit fruitObj = new Fruit(f[0],f[1]);
fruitList.add(fruitObj);
}
}
所以最后,fruitList包含5个对象 - 所有对象都与fruitArray中的最后一个元素相同(葡萄紫色)。
你可以看到我试图从包含水果/颜色对列表的字符串到二维数组,再到Fruit对象的ArrayList。我可以验证每个步骤是否正常工作,直到我在调试器中观察,因为每次通过for循环都会填充fruitList,从而更改fruitList中的所有先前对象。
我在这里缺少什么?
答案 0 :(得分:2)
我已经测试了您的代码,它适用于经典的Fruit
实现:
public class Fruit {
private String name;
private String color;
public Fruit(String name, String color) {
this.color = color;
this.name = name;
}
}
所以我想这些字段是static
:
public class Fruit {
private static String name;
private static String color;
public Fruit(String name, String color) {
Fruit.color = color;
Fruit.name = name;
}
}
答案 1 :(得分:0)
如果您在应用中的其他位置不需要中间fruitArray
,则可以按照以下步骤简化代码:
String pairsStr = "apple red,banana yellow,orange orange,pear green,grape purple";
ArrayList<Fruit> fruits = new ArrayList<Fruit>();
String[] pairs = pairsStr.split(",");
for (String pairStr : pairs) {
String[] pair = pairStr.split(" ");
fruits.add(new Fruit(pair[0], pair[1]));
}
答案 2 :(得分:0)
我创建了以下示例并使用compileonline对其进行了测试,并且没有任何问题。问题可能在你的Fruid
课程中:
import java.util.ArrayList;
public class HelloWorld{
public static void main(String []args){
String fruitStr = "apple red,banana yellow,orange orange,pear green,grape purple";
String[][] fruitArray = new String[5][];
String[] fruitPairs = fruitStr.split(",");
int r = 0;
for (String fruitPair : fruitPairs)
{
fruitArray[r++] = fruitPair.split(" ");
}
ArrayList<String> testList = new ArrayList<String>();
for (String[] f : fruitArray)
{
String testString = f[0] + " + " + f[1];
System.out.println(testString);
testList.add(testString);
}
for (String s: testList) {
System.out.println(s);
}
}
}
结果:
apple + red
banana + yellow
orange + orange
pear + green
grape + purple
apple + red
banana + yellow
orange + orange
pear + green
grape + purple