String类直接赋值的问题

直接赋值是在方法区的字符串常量池中去找,有就返回该字符串的指针,
没有找到就创建该字符串并返回指针
..
String s1,s2,s3,s4;

s1 = "hello";
s2 = "world";

s3 = s1 + s2;

/*
* 这里s1和s2两个变量做拼接,我拿s3去接收
*那么s3得到的指针肯定指向一个字符串"helloworld"
*/

s4 = "helloworld";
//我这里直接给s4赋值
//那么s4是在字串符常量池去找的"helloworld"

(s3 == s4) //false
//这里两个指针不相等
//是说明s3指向的"helloworld"不在方法区的字符串常量池吗?
//还是说s3和字符串常量池中的"helloworld"之间还有一个中间参数

这个是我改过来的
原来的是:

String s1,s2,s3;
s1 = "hello";
s2 = "world";

syso(s3 == s1 + s2);//false

我省略了一些主干,用了些eclispe的快捷键
主要的问题还是这个s1 + s2究竟发生了什么
具体的内存中的变化是什么啊

上面的少了个
s3 = "helloworld";

http://blog.csdn.net/Gohead_/article/details/47373157?locationNum=14

java文件中,判断两字符串是否相等,要用equals()来进行比较,即为:
String s1,s2,s3,s4;
s1 = "hello";
s2 = "world";
s3 = s1 + s2;
s4 = "helloworld";
s3.equals(s4) //true

只有字面量常量拼接才不会创建新的对象,引用变量相加会创建新的对象,虽然内容相同,但是指针不同

"=="比较的是地址与值,equals比较的是值,当String类型被创建后是不能再次更改的,地址不会发生变化,因此无论是S1 S2还是S4地址是无法被修改的,无论怎么赋值形式,地址始终有区别,S3=S1+S2相当于将S1与S2值做字符串拼接赋值给S3所在地址,值一样但是地址却不一样,同理S4直接被赋值,地址也是不一样的,此时2个helloworld 实际上是有两处地址了,(s3 == s4) //false“==”为false“equals”则为true 如果是StringBuilder 同一个地址改值,结果又会不一样!^_^!

s3和s4指向的是内存中不同的地址,但他们的值是相同的,所以s3==s4:false,比较的是地址,而s3.equal(s4):true,比较的是值

s3 = s1 + s2
两个String类型的实例对象相加,在底层的实现是new StringBuilder(s1).append(s2).toString(Java 1.5以上)。
所以,s3指向堆而不是常量池,如果想指向常量池,s3.intern(),此时s3 == s4返回true