import java.util.*;public class TestArrayList{
public static void main(String args[]){
List<String> li=new ArrayList<String>();
String s="hello";
li.add(s);
s="world";
li.add(s);
for(int i=0;i<li.size();i++){
System.out.println(li.get(i));
}
}
}
s指向的内容改变,容器里面保存的是引用,为什么不跟着改变?怎么输出还是“hello”、“world”?
为什么不是“world”、“world”?
li.add(s);
s="world"; 这个s 已经是一个新对象了!
li.add(s);
第二次加的是world的地址,和变量的名字无关
这句话,s的指向发生了变化,原来指向"hello",被add之后,s和li内都存在一个引用指向"hello",然后s又指向了"world",而li内的引用并不是s,而是s的一个拷贝而已,不会随之变化,之后的事情,我相信你已经能够理解了
这句话,s的指向发生了变化,原来指向"hello",被add之后,s和li内都存在一个引用指向"hello",然后s 又指向了"world",而li内的引用并不是s,而是s的一个拷贝而已,不会随之变化,之后的事情,我相信你已经能够理解了
你的代码就相当于下面的代码:import java.util.*;public class TestArrayList{
public static void main(String args[]){
List<String> li=new ArrayList<String>();
String s=new String("hello");
System.out.println(s.hashCode());
li.add(s);
s=new String("world");
System.out.println(s.hashCode());
li.add(s);
for(int i=0;i<li.size();i++){
System.out.println(li.get(i));
}
}
}
建议 lz 查阅 String 的"不可变性"的相关知识点
[/Quote这个和String的变不变关系不大,换做是任何一种其它对象还是这种结果
class User {
String name;
}
List<User> users = new ArrayList<User>();
User user = new User("jack");
users.add(user);
user.setName("divided");
user.add(user);
for(int i=0;i<2;i++){
System.out.println(users.get(i).getName())
}
没错,所谓引用,可以想象成地址你第一次加入了一个地址到容器
第二次又加入了一个地址到容器
你get的时候容器根据你放的两个地址去找对象,有什么问题?!
如果你要添加到的话。一定要new