A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱新根 初级黑马   /  2012-3-30 17:10  /  2228 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1="abc";
String s2=new String("abc");
String s3="abc";
问题1:为什么说String s2=new String("abc")是创立了两个对象?
问题2:s1==s3结果为true?

3 个回复

倒序浏览
问题2:"=="比较的是该字符串的地址值。也就是。S1与S3所指向的是一个地址值,因为你先定义的S1.当内存中存在"abc'这个字符串时。S3则不再创建新的地址。而是直接指向了S1那个。所以为真。
问题1:S2="abc"是一个对象,当你New一个的时候也是一个对象,所以是两个对象。
回复 使用道具 举报
String为引用数据类型,这种数据类型在声明变量时会在堆中开辟空间用来保存变量的值,而在栈中保存所开辟空间的首地址!所以在这个地方s1,s2和s3都是指向保存变量的地址值!(1)s2=“abc”为一个对象,而new的时候又产生了一个对象;(2)s1=s3,是把s1的地址值赋给了s3,用“==”来比较的是他们具体的值,因此返回值为true。而用equals()方法来比较的话就是比较s1,s2,s3所指向的对象的值!例如s1.equals(s2),此时返回的是true!
回复 使用道具 举报
java5.0以后出现了一个对象池的概念,Java虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象,String str = "abc"这样写是从对象池中取abc的对象,如果对象池中已经有了abc这个对象,那么就不会从新给它分配新的空间了,如果这样写String s2 = new String("abc");就会分配新的空间 ,就是两个对象了。s1==s3指向的是同一地址 所以为true。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马