java容器到底存放的是什么,不是引用吗???

eyeseaJason 2004-09-24 03:05:55
java容器存放的是引用,我一直这么认为,下面这个程序有什么问题?怎么和我想的不一样呢?
import java.util.*;

public class test{
public static void main(String[] args){
String s = new String("this is a String");
Vector v1 = new Vector();
v1.add(s);
v1.add(s);
s = new String("this is a new String");
System.out.println(v1.get(0));
System.out.println(v1.get(1));

}
}
我预想的是v1存放两个引用s,但s指向同一个String对象,现在我把s指向另一个String对象
由于v1存放的是引用,这时候我打印的话应该是打印新的String对象"this is a new String"
但运行结果是两个"this is a String"我的理解哪里有错误,谢谢谢谢
...全文
481 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
eyeseaJason 2004-09-24
  • 打赏
  • 举报
回复
jxc1999()
liudongbaollz()
zealVampire(蚊子+鹤舞白沙)
我认同以上三位的解释,尤其是jxc1999() 我觉得就是标准答案了:)
zealVampire 2004-09-24
  • 打赏
  • 举报
回复

import java.util.*;

public class test {
public static void main(String[] argv)throws Exception{
Vector v=new Vector();
A a=new A();
v.add(a);//=99
a.a=100;
A a2=(A)v.get(0);
System.out.println(a2.a);//=100
}
}
class A{
public int a=99;
}
//////////////////////////////////////////////
而s = new String("this is a new String");或s="this is a new String";
都是把 s指向了新的内容,不影响vetor.








}



}

class A{
public int a=99;
}
liudongbaollz 2004-09-24
  • 打赏
  • 举报
回复
不好意思,上述说法不太准确,应该是这样理解
String tmp1 = new String("this is a String");
s=tmp1;
v1.add(s);
v1.add(s); 相当于保存tmp1;

String tmp2 = new String("this is a new String");
s=tmp2;
v1 中的引用还是tmp1,没有改变。
zealVampire 2004-09-24
  • 打赏
  • 举报
回复
还是那句话 ,String 是比较特殊的
无论你是s = new String("this is a new String");
或者是 s="this is a new String";

打印的结果应该还是
this is a String
this is a String
jxc1999 2004-09-24
  • 打赏
  • 举报
回复
我认为:
首先Vector里存放的是引用,s也是引用
v1.add(s)的作用是在v1中插入一个引用,这个引用指向“this is a String”(注意:不是指向s)
在执行s = new String("this is a new String")后,s已指向"this is a new String",而Vector中的两个引用仍然指向“this is a String”
输出当然是两个“this is a String”了
narilee 2004-09-24
  • 打赏
  • 举报
回复
drugon(personal)说的好,也给偶好好上了一课!
drugon 2004-09-24
  • 打赏
  • 举报
回复
不管你的第二个s怎么改,输出结果是不会变的,首先你先创建一个String,JVM就给它分配一块内存,然后你再创建一个Vector,JVM又分一块内存给Vector,而你向Vector中增加元素的时候,Vector会动态的动申请一块内存来存放新增的数据,所以这些变量的值全在不同的内存块中,不会因为你改变了一个,别的就会改变的。不要和C++搞混了。
liudongbaollz 2004-09-24
  • 打赏
  • 举报
回复
String对象的值是常量,不能修改,如果重新赋值的话,实际上重新产生了另一个对象
而原来的对象引用只存在Vector中,所以会出现这种情况,如果是StringBuffer对象则
会与楼住想象的结果一样
weepp 2004-09-24
  • 打赏
  • 举报
回复
你的是“new String”
了解??!!!
weepp 2004-09-24
  • 打赏
  • 举报
回复
我看你的理解有误!
dlglmf 2004-09-24
  • 打赏
  • 举报
回复
JAVA容器存放的是JAVA对象的reference,但是在java中,你的前后两个S确实上两个不同的java对象,是存放在heap 里不同区域的,所以他们的reference也是不同的,如果你改成s="";这样也许结果就不一样了,如果他们就是同一个reference了,

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧