Java String赋值和构造函数有什么区别?
Strings="abc"Strings=newString();有人是这样解释的,第二种方法实际上创建了两个对象,一个在堆,一个在String常量池。谢谢!...
String s = "abc"
String s = new String();
有人是这样解释的,第二种方法实际上创建了两个对象,一个在堆,一个在String常量池。
谢谢! 展开
String s = new String();
有人是这样解释的,第二种方法实际上创建了两个对象,一个在堆,一个在String常量池。
谢谢! 展开
5个回答
展开全部
从执行过程出发:
String s="abc"
执行时,编译器会先去String常量池是寻找,如果在常量池中找到了"abc",则把abc引用赋给s;
eg: String s="abc"; String s1="abc"; 则s==s1;
String s=new String()
执行时,不管常量池中有没有,都会在堆内存中开辟一个新地址,再把地址引用赋给s;
eg: String s=new String("abc"); String s1="abc"; 但其实s!=s1;
String s="abc"
执行时,编译器会先去String常量池是寻找,如果在常量池中找到了"abc",则把abc引用赋给s;
eg: String s="abc"; String s1="abc"; 则s==s1;
String s=new String()
执行时,不管常量池中有没有,都会在堆内存中开辟一个新地址,再把地址引用赋给s;
eg: String s=new String("abc"); String s1="abc"; 但其实s!=s1;
追问
请问假如String常量池没有任何对象,执行String s=new String("abc"),除了在堆中新建一个对象之外,是不是还会在常量池生成一个对象?
追答
不会。
if在常量池中生成了abc,那么会有如下结果
String s=new String("abc");
String s1="abc";
System.out.print(s==s1); //结果为true,这显然是错误的;
new时在堆内,不在常量池内;
直接赋值,则在常量池内;
展开全部
String s 中的s 是一个引用,引用也是一个对象
new String 创建了一个真正的String对象
new String 创建了一个真正的String对象
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
引用瞬风Q无迹的回答:
从执行过程出发:
String s="abc"
执行时,编译器会先去String常量池是寻找,如果在常量池中找到了"abc",则把abc引用赋给s;
eg: String s="abc"; String s1="abc"; 则s==s1;
String s=new String()
执行时,不管常量池中有没有,都会在堆内存中开辟一个新地址,再把地址引用赋给s;
eg: String s=new String("abc"); String s1="abc"; 但其实s!=s1;
从执行过程出发:
String s="abc"
执行时,编译器会先去String常量池是寻找,如果在常量池中找到了"abc",则把abc引用赋给s;
eg: String s="abc"; String s1="abc"; 则s==s1;
String s=new String()
执行时,不管常量池中有没有,都会在堆内存中开辟一个新地址,再把地址引用赋给s;
eg: String s=new String("abc"); String s1="abc"; 但其实s!=s1;
展开全部
什么是字符串常量池:JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池
工作原理:当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
实现前提:字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。
假如String常量池没有任何对象,执行String s=new String("abc"),除了在堆中新建一个对象之外,还会在常量池生成一个对象。
工作原理:当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
实现前提:字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。
假如String常量池没有任何对象,执行String s=new String("abc"),除了在堆中新建一个对象之外,还会在常量池生成一个对象。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都是在堆上创建字符串对象,字符串本身是不可改变的final型数据。2个的内容不同。
创建时也都会查找内存中之前是否已有这个串,没有才创建,存在就只引用。
String s = "abc" ; //字符串的内容为"abc“
=======
String s = new String(); //内容为空字符串"";
s="new text";//当指向新的字符串时,会垃圾化之前的空字符串后抛弃待回收。而不是在空字符串中填新字符串。
创建时也都会查找内存中之前是否已有这个串,没有才创建,存在就只引用。
String s = "abc" ; //字符串的内容为"abc“
=======
String s = new String(); //内容为空字符串"";
s="new text";//当指向新的字符串时,会垃圾化之前的空字符串后抛弃待回收。而不是在空字符串中填新字符串。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第二种创建一个新对象在堆,第一种是同一个对象改变值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询