ArrayList и модифицирующие объекты, включенные в него

Скажем, у меня есть ArrayList myArray. Я хочу изменить объект, вызвав его функцию. Если я сделаю так, изменится ли исходный объект или нет?

myArray.get(0).myModyfyingFunction();

Чтобы пояснить далее - я обеспокоен тем, что get() фактически возвращает ссылку на мой исходный объект или возвращает только копию моего исходного объекта.

Ответы

Ответ 1

get() вернет ссылку на объект, а не копию. Любая модификация, которую вы делаете по возвращенной ссылке, будет сделана на самом объекте

Ответ 2

Если вы сохраняете какой-либо объект в ArrayList, объект не реплицируется, и любое изменение объекта должно отражаться в самом объекте.

например, у нас есть класс 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());

Это будет выводиться после 1.

Ответ 3

Java никогда не возвращает копии объектов, а копирует только ссылки на объекты. Таким образом, метод определенно изменит объект на индекс 0.

Вы можете получить "копию" объекта, если метод создаст его, например. используя return object.clone();, если это возможно, но фактически возвращается ссылка на копию, которая все еще была создана в методе. Таким образом, вы можете получить "копию" объекта в более широком смысле, но ArrayList#get(...) этого не сделает - и по соглашению ни геттер не должен этого делать, если явно не указано.

Ответ 4

Это зависит от того, какой объект вы сохранили в своем ArrayList. Например, если они java.lang.String s, вызовы ничего не изменят. В противном случае, да, он изменит ваш объект, хранящийся в индексе 0.

Ответ 5

Он дает вам ссылку на объект, поэтому, если ваша функция выполняет любую модификацию в своем состоянии, ваш объект будет изменен.

То же самое происходит, когда вы это делаете:

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

Ответ 6

  Here is an barebone example. Modify an object of Test class in the List.

    public class ModifyArrayList{


    public static void main(String [] args){    
          List<Test> l = new ArrayList<Test>();
     Test t1 = gettest();
     t1.setStr("John");
     t1.setInte(100);
     t1.setAno("Smith");
     l.add(t1);
     t1 = new Test();
     t1.setStr("Tracy");
     t1.setInte(100);
     t1.setAno("Pinto");
     l.add(t1);
    t1 = new Test();
     t1.setStr("Ryan");
     t1.setInte(100);
     t1.setAno("SmithPinto");
     l.add(t1);
     t1 = new Test();
     t1.setStr("Someone");
     t1.setInte(100);
     t1.setAno("Else");
     l.add(t1);



     ListIterator<Test> ti = l.listIterator(); 

     while(ti.hasNext())
     {
         Test t = ti.next();
         if(t.getAno().equals("SmithPinto"))
         {
             t.setInte(200);
                         }
         //ti.set(t);
         ti.remove();
         ti.add(t);
     }
           for (Test t:l)
     {
         System.out.println("TEST: " + t.getInte());
     }
           }
   }


  //Test Class below:

   public class Test {

    private String str;
    private int inte;
      public String getStr() {
     return str;
      }
              public void setStr(String str) {
                  this.str = str;
                                  }
public int getInte() {
    return inte;
}
public void setInte(int inte) {
    this.inte = inte;
}
public String getAno() {
    return ano;
}
public void setAno(String ano) {
    this.ano = ano;
}
private String ano;

}

Ответ 7

for(User user: Users){

user.setName( user.getName() + " New Name");

}

for(User user: Users){

System.out.println( user.getName());

}