
JAVA 中直接赋值和new创建有什么不同(请高人解答)
publicclassStudent{publicStudent(){}publicstaticmain(String[]age){Stringx="bv";String...
public class Student{
public Student(){}
public static main(String[] age){
String x="bv";
String v=new String("bv");
}
}
例题中,x和v的效果是一样的。
我想问的是他们的作用域也是一样的吗?
垃圾回收器,怎样回收它们?
它们有什么区别!
void 展开
public Student(){}
public static main(String[] age){
String x="bv";
String v=new String("bv");
}
}
例题中,x和v的效果是一样的。
我想问的是他们的作用域也是一样的吗?
垃圾回收器,怎样回收它们?
它们有什么区别!
void 展开
展开全部
我个人的理解
String x="bv";这个是在栈中创建的,栈中的数据具有不可更改性,就是说你再创建一个String y="bv";它会先在栈中寻找字面值为bv的地址,如果存在这样的地址就指向它(否则就在栈中新开辟一个字面值为bv的内存地址) 因此这儿x==y 因为他们指向同一块内存地址 无论== equals结果都是true
String v=new String("bv"); 通过new的方式在堆创建一个对象,new是在堆中开辟一个新的处女地,因此即便你再String vvv=new String("bv");v和vvv也不可能相等。
当然你题目中的x v 分别处于栈、堆中 也不可能相等
String x="bv";这个是在栈中创建的,栈中的数据具有不可更改性,就是说你再创建一个String y="bv";它会先在栈中寻找字面值为bv的地址,如果存在这样的地址就指向它(否则就在栈中新开辟一个字面值为bv的内存地址) 因此这儿x==y 因为他们指向同一块内存地址 无论== equals结果都是true
String v=new String("bv"); 通过new的方式在堆创建一个对象,new是在堆中开辟一个新的处女地,因此即便你再String vvv=new String("bv");v和vvv也不可能相等。
当然你题目中的x v 分别处于栈、堆中 也不可能相等
展开全部
简单的问题,就用简单的方式回答吧:
String x="bv";只创建了一个对象,这个字符串对象“bv”保存在堆中。
String v=new String("bv");实际上创建了两个对象,一个是在堆中的对象"bv",另一个是单独的字符串对象,并且在适当的时候前者会回收,而后者不会。这种情况应避免出现,因为会造成不必要的内存和时间开销。
另外,如果后面紧跟一句String y="bv";同样会创建一个对象,但不会在堆中重复创建,只是生成一个新的引用。
String x="bv";只创建了一个对象,这个字符串对象“bv”保存在堆中。
String v=new String("bv");实际上创建了两个对象,一个是在堆中的对象"bv",另一个是单独的字符串对象,并且在适当的时候前者会回收,而后者不会。这种情况应避免出现,因为会造成不必要的内存和时间开销。
另外,如果后面紧跟一句String y="bv";同样会创建一个对象,但不会在堆中重复创建,只是生成一个新的引用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String x="bv"; 只是创建了一个指向对象"bv"的一个引用,在缓存中查找如果有直接指向,如果没有,会new出一个新的"bv"对象
String v=new String("bv"); 无论如何都直接new出一个新的"bv"对象
作用域一样,gc回收时如果是创建了新对象销毁,否则销毁引用
String v=new String("bv"); 无论如何都直接new出一个新的"bv"对象
作用域一样,gc回收时如果是创建了新对象销毁,否则销毁引用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给你打个比方就明白了,可以这样比方:
x和v就是一个遥控器,字符串"bv"就是一个机器人,一个遥控只能控制一个机器人;
String x="bv"; :就是把一个已经存在的机器人(bv)的控制权交给一个新制造的遥控器(x)
String v=new String("bv"); 就是在内存中新创造一个机器人(bv),并把它的控制权交给一个新制造的遥控器(x)
x和v就是一个遥控器,字符串"bv"就是一个机器人,一个遥控只能控制一个机器人;
String x="bv"; :就是把一个已经存在的机器人(bv)的控制权交给一个新制造的遥控器(x)
String v=new String("bv"); 就是在内存中新创造一个机器人(bv),并把它的控制权交给一个新制造的遥控器(x)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
效果是完全一样的。第一个。String x ="bv";是在文字池(pool of literal strings)中生成一个字符串对象。然后x引用这个对象。
第二个是在文字池中生成对象后。在堆中复制一个与前面一样的对象。然后v引用堆中的对象。
第二个是在文字池中生成对象后。在堆中复制一个与前面一样的对象。然后v引用堆中的对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询