Java栈堆池

[复制链接]
查看11 | 回复2 | 2010-5-20 14:53:48 | 显示全部楼层 |阅读模式
String ss1 = "abc";
String ss3 = "abcd";
String ss4 = ss1+"d";
String ss5 = "abc"+"d";
System.out.println(ss3 == ss4);//f
System.out.println(ss3 == ss5);//t
谁知道为什么有这个结果啦
详细点,不要到网上粘贴啊
我知道栈是存放引用的,那么ss4到底是指向堆还是池呢,ss1和”d“是拼接在一起放在哪了吗?

回复

使用道具 举报

千问 | 2010-5-20 14:53:48 | 显示全部楼层
这里面的‘abc’'abcd''d'都是在常量池中的~ss1,ss2,ss3,ss4,ss5都只是引用。ssX == ssX其实就是比较的他们的内存地址指针位置ss5是指向由2个常量组成的另一个常量,最后指针指向的是‘abcd’ss3是指向‘abcd’ss4则是由一个引用+一个常量组成。虽然打印结果也是‘abcd’但是指针位置不一样~
回复

使用道具 举报

千问 | 2010-5-20 14:53:48 | 显示全部楼层
我只简单说一下,首先Java虚拟机为了提高性能,内设有一个字符串池,这个池使用了享元模式(不懂可以上网查查),即同一内容的字符串(仅限于通过String a = "a";方式声明的字符串。String a = new String("a");的方式不适用。)在同一JVM中,只有一个实例。所以ss5就自动匹配到ss3上了("abc"+"d" = "abcd")
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行