假设我们有一个ArrayList myArray。我想通过调用它的函数来修改一个对象。如果我这样做,原始对象是否会被更改?
myArray.get(0).myModyfyingFunction();
进一步澄清 - 我担心get()实际上是否返回对原始对象的引用,或者只返回原始对象的副本。
答案 0 :(得分:59)
get()
将返回对象的引用,而不是副本。您对返回的引用所做的任何修改都将在对象本身上进行
答案 1 :(得分:7)
如果在ArrayList中存储任何对象,则不会复制Object,并且对象中的任何更改都应反映在对象本身中。
例如我们有类NewClass
public class NewClass {
private String mystring="";
/**
* @return the mystring
*/
public String getMystring() {
return mystring;
}
/**
* @param mystring the mystring to set
*/
public void setMystring(String mystring) {
this.mystring = mystring;
}
}
这里是任何其他类的主要方法中的代码
List<NewClass> newclasses = new ArrayList<NewClass>();
NewClass class1 = new NewClass();
class1.setMystring("before1");
NewClass class2 = new NewClass();
class2.setMystring("before2");
newclasses.add(class1);
newclasses.add(class2);
newclasses.get(0).setMystring("after1");
System.out.println(class1.getMystring());
这将输出after1。
答案 2 :(得分:2)
这取决于您在ArrayList中存储的对象类型。
例如,如果它们是java.lang.String
s,则调用不会修改任何内容。
否则,是的,它将修改存储在索引0的对象。
答案 3 :(得分:1)
Java永远不会返回对象的副本,只会复制到对象的引用。因此,该方法肯定会改变索引0处的对象。
如果方法会创建一个对象,则可以获得对象的“副本”,例如如果可能的话,使用return object.clone();
,但实际返回的内容是对仍在方法中创建的副本的引用。所以你可以在更广泛的意义上得到一个对象的“副本”,但是ArrayList#get(...)
不会这样做 - 按照惯例,除非明确说明,否则getter都不应该这样做。
答案 4 :(得分:1)
它为您提供对象的引用,因此如果您的函数在其状态中执行任何修改,您的对象将被修改。
执行此操作时也会发生相同的情况:
ArrayList myArray = new ArrayList();
MyObject obj = new MyObject();
myArray.add(obj);
obj.myModifyingFunction();
myArray.get(0).equals(obj); // returns true
myArray.get(0) == obj; // returns true as well
答案 5 :(得分:0)
这是一个例子。修改List中的Test类对象。
public class ModifyArrayList {
public static void main (String [] args) {
List<Test> tests = new ArrayList<Test>();
Test firstTest = new Test();
firstTest.setId(100);
firstTest.setName("John");
tests.add(firstTest);
Test secondTest = new Test();
secondTest.setId(101);
secondTest.setName("Tracy");
tests.add(secondTest);
Test thirdTest = new Test();
thirdTest.setId(102);
thirdTest.setName("Ryan");
tests.add(thirdTest);
ListIterator<Test> testIterator = tests.listIterator();
while(testIterator.hasNext()) {
Test test = testIterator.next();
if (test.getName().equals("Ryan")) {
test.setId(300);
}
testIterator.remove();
testIterator.add(test);
}
for (Test test : tests) {
System.out.println("Test #" + test.getId() + " name=" + test.getName());
}
}
}
Test.java
class Test {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
答案 6 :(得分:0)
更新列表中的对象:
for (User user: Users) {
user.setName( user.getName() + " New Name");
}
显示更新的对象
for (User user: Users) {
System.out.println( user.getName());
}