JAVA 中直接赋值和new创建有什么不同(请高人解答)

[复制链接]
查看11 | 回复5 | 2008-9-15 11:53:31 | 显示全部楼层 |阅读模式
public class Student{
public Student(){}
public static main(String[] age){

String x="bv";

String v=new String("bv");
}
}
例题中,x和v的效果是一样的。
我想问的是他们的作用域也是一样的吗?
垃圾回收器,怎样回收它们?
它们有什么区别!
void

回复

使用道具 举报

千问 | 2008-9-15 11:53:31 | 显示全部楼层
我个人的理解String x="bv";这个是在栈中创建的,栈中的数据具有不可更改性,就是说你再创建一个String y="bv";它会先在栈中寻找字面值为bv的地址,如果存在这样的地址就指向它(否则就在栈中新开辟一个字面值为bv的内存地址) 因此这儿x==y 因为他们指向同一块内存地址 无论== equals结果都是trueString v=new String("bv"); 通过new的方式在堆创建一个对象,new是在堆中开辟一个新的处女地,因此即便你再String vvv=new String("bv");v和vvv也不可能相等。当然你题目中的x v 分别处于栈、堆中 也不可能相等...
回复

使用道具 举报

千问 | 2008-9-15 11:53:31 | 显示全部楼层
简单的问题,就用简单的方式回答吧:String x="bv";只创建了一个对象,这个字符串对象“bv”保存在堆中。String v=new String("bv");实际上创建了两个对象,一个是在堆中的对象"bv",另一个是单独的字符串对象,并且在适当的时候前者会回收,而后者不会。这种情况应避免出现,因为会造成不必要的内存和时间开销。另外...
回复

使用道具 举报

千问 | 2008-9-15 11:53:31 | 显示全部楼层
String x="bv"; 只是创建了一个指向对象"bv"的一个引用,在缓存中查找如果有直接指向,如果没有,会new出一个新的"bv"对象String v=new String("bv"); 无论如何都直接new出一个新的"bv"对象作用域一样,gc回收时如果是创建了新对象销毁,否则销毁引用...
回复

使用道具 举报

千问 | 2008-9-15 11:53:31 | 显示全部楼层
给你打个比方就明白了,可以这样比方:x和v就是一个遥控器,字符串"bv"就是一个机器人,一个遥控只能控制一个机器人;String x="bv"; :就是把一个已经存在的机器人(bv)的控制权交给一个新制造的遥控器(x)String v=new String("bv"); 就是在内存中新创造一个机器人(bv),并把它的控制权交给一个新制造的遥控器(...
回复

使用道具 举报

千问 | 2008-9-15 11:53:31 | 显示全部楼层
效果是完全一样的。第一个。String x ="bv";是在文字池(pool of literal strings)中生成一个字符串对象。然后x引用这个对象。第二个是在文字池中生成对象后。在堆中复制一个与前面一样的对象。然后v引用堆中的对象。...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行