我的代码中有一个字符串列表。我正在将该字符串列表传递给一个函数并对其进行修改。(我正在从列表中添加/删除一些元素)。但我不希望这些更改反映在调用者函数中。更改应仅反映在被调用函数中。但是因为对象是通过引用传递的,我认为这些变化都反映在这两个函数中。我怎样才能避免这种情况。请帮忙
问问题
2640 次
6 回答
2
在该方法中,您可以显式地制作列表的副本:
private void method(ArrayList<String> list) {
ArrayList<String> copy = new ArrayList<String>(list);
// Rest of the method
}
于 2013-03-26T05:12:59.647 回答
1
You have to create new list from old list manually using looping and need to pass to that method. i.e.
List<String> list=new ArrayList<>();
list.add("first");
list.add("last");
List<String>list2 =new ArrayList<String>();
for(String value:list)
{
list2.add(new String(value));
}
System.out.println("list2-->"+list2);
Because new ArrayList<String>(list);
is give a new reference of list but the object still have a same reference.
Edit:
public class ArrayCopy {
public static void main(String[] args) {
ArrayCopy arrayCopy=new ArrayCopy();
arrayCopy.copyData();
}
public void copyData()
{
List<Test> oldList=new ArrayList<Test>();
oldList.add(new Test("1",10));
oldList.add(new Test("2",45));
List<Test> newList =new ArrayList<Test>(oldList);
System.out.println("newList-->"+newList);
/**
* New Copy of Data
*/
List<Test> newList1 =new ArrayList<Test>();
for(Test test:newList)
{
newList1.add(copyProperty(test));
}
System.out.println("newList-->"+newList1);
}
private Test copyProperty(Test test)
{
Test newTest=new Test(test.getId(), test.getNumber());
return newTest;
}
class Test{
String id;
int number;
public Test(String id,int number) {
this.id=id;
this.number=number;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
}
于 2013-03-26T05:32:39.847 回答
1
在将对象传递给函数之前,您必须对其进行复制。
于 2013-03-26T05:11:23.587 回答
1
在 sub 方法中使用原始数组列表的新 ArrayList。
于 2013-03-26T05:12:39.817 回答
1
你可以使用Clone
方法。
caller(ArrayList<String> a)
{
callee((List<String>)a.clone());
}
callee(List<String> aCloned)
{
}
于 2013-03-26T05:13:13.997 回答
1
通常clone
不推荐该方法。看到这个clone(): ArrayList.clone() 我认为做了一个浅拷贝
不过你可以试试这个方法
public void doOperation(List<String> list){
List<String> duplicateList = new ArrayList(list);
// add, or delete stuff on duplicateList
}
在这里,您使用 的构造函数为ArrayList
您提供传入列表的新副本。
于 2013-03-26T05:17:19.237 回答