Ответ 1
get()
вернет ссылку на объект, а не копию. Любая модификация, которую вы делаете по возвращенной ссылке, будет сделана на самом объекте
Скажем, у меня есть ArrayList myArray. Я хочу изменить объект, вызвав его функцию. Если я сделаю так, изменится ли исходный объект или нет?
myArray.get(0).myModyfyingFunction();
Чтобы пояснить далее - я обеспокоен тем, что get() фактически возвращает ссылку на мой исходный объект или возвращает только копию моего исходного объекта.
get()
вернет ссылку на объект, а не копию. Любая модификация, которую вы делаете по возвращенной ссылке, будет сделана на самом объекте
Если вы сохраняете какой-либо объект в 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.
Java никогда не возвращает копии объектов, а копирует только ссылки на объекты. Таким образом, метод определенно изменит объект на индекс 0.
Вы можете получить "копию" объекта, если метод создаст его, например. используя return object.clone();
, если это возможно, но фактически возвращается ссылка на копию, которая все еще была создана в методе. Таким образом, вы можете получить "копию" объекта в более широком смысле, но ArrayList#get(...)
этого не сделает - и по соглашению ни геттер не должен этого делать, если явно не указано.
Это зависит от того, какой объект вы сохранили в своем ArrayList.
Например, если они java.lang.String
s, вызовы ничего не изменят.
В противном случае, да, он изменит ваш объект, хранящийся в индексе 0.
Он дает вам ссылку на объект, поэтому, если ваша функция выполняет любую модификацию в своем состоянии, ваш объект будет изменен.
То же самое происходит, когда вы это делаете:
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
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;
}
for(User user: Users){
user.setName( user.getName() + " New Name");
}
for(User user: Users){
System.out.println( user.getName());
}