new String()
String str1=new String("something"); //1
String str2="something"; //2
疑问:在1中new String("something")是调用了 String(String xxx)这个构造方法,意思是"something”已经是String类的实例对象了?那么2中的String str2="something"; 其实是表示让str2指向了已存在的"something"的地址?如果上面的观点是正确的,“something”这个实例化过程又是调用了哪些方法?
正在回答
1、
同学你好,能理解同学的问题,老师翻阅了很多资料,也咨询的很多的老师,但说法不一。但这个问题无法被验证,也没有明确的官方说明。
说法一:
如果是第一次new,会创建两个对象。一个放在常量池中,一个在堆中。第二次new相同的字符的时候就不会在常量池中创建一个了。直接在堆中创建一个。和同学的观点一致
说法二:
同学说的参数“***”在编译的时候,就会进入一个运行时常量池中,而不是到字符串常量池中。new的时候并不会先在字符串常量池中创建。而是直接在堆中创建一个。
但老师无法进行验证。不过同学不用纠结。因为,如果是在十几年前,可能会非常有用,因为设备跟不上,我们要研究底层,但现在不会了,随着机器设备的优化,如何写好程序才是最应该思考的。不用过多的研究底层。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学你好,这里老师根据同学的说法来验证一下,例如:
public class Test01 { public static void main(String[] args){ String a = new String("abc"); String b=a.intern(); System.out.println(b==a); String c ="abc"; String d=c.intern(); System.out.println(d==c); } }
运行结果如下:
这里 intern方法返回字符串常量池中的唯一对象。所以这里老师来通过这个方法验证常量池中是否有这个字符串,根据运行结果可知,String类型的对象a在常量池中并没有这个字符串,所以运行结果为false!
intern方法的返回值是一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。所以这里同学不用纠结,记住就可以了哦,它的具体原理老师也无法深究,但是提供了这个intern方法,只能为同学验证一下!
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
同学你好,这里关于str2指向了已存在的str1的"something"的地址这里理解有错哦!
1、(1)、String str2="something"; 这也是创建了一个对象,可以理解为简化了创建对象的过程。
(2)、因为String类型比较特殊,它使用的时候可以像基本数据类型一样使用,但是它实际上是类,所以它是会创建对象的。
(3)、特殊的地方在于,String str2="something";这条语句中,字符串的内容是存储在常量池中的,
如果常量池中存在“something”的字符串,那么不创建新的对象,直接使用常量池中已存在的对象,然后将引用str2指向该对象。
如果常量池中不存在“something”的字符串,则先在常量池中创建一个新的字符串对象“something”,然后将引用str2指向阿三中创建的新对象。
也就是字符串的引用str2指向常量池中的内容。
2、但是使用new String()这种方式去创建,就会存储在堆中。String str1=new String("something");就是在堆中创建一个内容为"something"的对象,str1指向堆中的这个对象!
综上所述,不论哪种方式都创建了对象,只是数据存放的位置不同。
如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星