黑马程序员技术交流社区
标题:
关于String对象的问题
[打印本页]
作者:
821728010
时间:
2013-5-26 23:16
标题:
关于String对象的问题
本帖最后由 821728010 于 2013-5-29 17:35 编辑
public class Demo14 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1="haha";
String s2="haha";
String s3=new String("haha");
System.out.println(s1==s2);
System.out.println(s1==s3);
}
}
代码的输出结果是:
true
false
String对象引用变量 s1和s2怎么指向同一个对象?
作者:
谢孔营
时间:
2013-5-26 23:22
其实String s1="haha";这个对象“haha”是放在了常量池中的,
当执行 String s2 = "haha"时,先去常量池中找是否有该对象
如果有,则直接共享,即s2也指向该对象。
这样s2,s1就指向了同一个对象了。
作者:
王溢君
时间:
2013-5-26 23:23
常量池的问题。已经有了.就直接指向了。好好看基础视频啊哥们。
作者:
刘兆华
时间:
2013-5-26 23:58
s1==s2 是因为他们两个的引用同一个内存地址,栈不同堆内存值相同。而s3是用new String()实例化的,是在内存中又开辟了一个新的地址存haha的。 所以s1与s3的比较为false
作者:
廖志强
时间:
2013-5-29 08:40
String s1="haha"; String s2="haha"; 都在内存的常量池里面,比较的是,但第一"haha"在常量池里存在是,等第二"haha",不会再创建一个"haha",而是把第一个“haha”的地址给了s2,而s1和s2比较其实就是比较在常量池的地址值,地址值都是同一个,当然是true;但是假如跟s3比较,是拿s3在堆内存的地址值跟s1或s2比较,地址值肯定不一样,所以为False.
作者:
吴刚—heima
时间:
2013-5-29 09:00
java程序运行的时候从main方法开始加载代码块,其中整个内存空间可以被分为,变量区【堆区】,代码区,栈区。你前面的两个String 初始化后其实就是一个String的常量,存放在变量区中,这样两个String对象的引用就指向了同一个常量的引用,但是如果你是实例化一个对象,那么它必须从新分配一个内存地址,这就好比,你如果拿出两个苹果,标上1号2号,他还是同一个苹果,但是你实例化一个苹果,它就可能不是指向同一个苹果了。
这是我个人的理解,你仔细看一下毕老师的视频吧。
作者:
廖志强
时间:
2013-5-29 10:23
自己画的内存图,绝对强悍,肯定能懂
QQ图片20130529074644.jpg
(80.16 KB, 下载次数: 0)
下载附件
2013-5-29 10:22 上传
String内存图
作者:
廖志强
时间:
2013-5-29 10:25
强悍!!!
作者:
逝者轨迹
时间:
2013-5-29 10:39
当String s1="haha"时,haha就已经被放入常量池,String s2也是一个常量,直接寻找haha的地址就可以,而s3是new一个String对象,所以需要另外分配内存地址
作者:
袁梦希
时间:
2013-5-29 17:07
如果问题已经解决,请把帖子的类型改为已经解决,如果不会解决请看我的个性签名。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2