关于字符串相加,比较public class StringTest {private static String aabcdef/** * @param args */pu
关于字符串相加,比较
public class StringTest {
private static String a="abcdef";
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1="abc"+"def";
String s2="abc";
String s3="def";
String s4="abcdef";
System.out.println(s1==a);
System.out.println(s1==s4);
System.out.println((s2+s3)==a);
System.out.println((s2+s3)==s4);
}
}
结果是什么:为什么
[解决办法]
true
true
false
false
[解决办法]
大概估計一下: 應該是true,true,false,false.
1.因為S1,a,S4都是指向堆棧中的“abcdef”,所以他們地址指向是一致的.所以前兩個為true。
2.s2和s3也是指向堆棧,但是他們合併時,會創建一個對象用來保存結果的,所以他們相加指向的並不是堆棧中的地址,而是內存當中的,所以後兩個為false。
[解决办法]
true
true
true
true
你输出一下就知道了
[解决办法]
[解决办法]
[解决办法]
[解决办法]
"abcdef"是在串池中(堆中),S1 a S4 都是指向该处 ,故前两个是true
s2 s3 是分别指向堆中某处,各自利用串池中的 "abc" 和 "def"创建了一个对象
当 s2 + s3 时返回的是新建的一个对象, 该对象利用串池的"abcdef"创建对象
但和串池中的那个并不是同一个
故后两个都是false
[解决办法]
全部为TRUE
这些应该叫编译时常量!运行前就已经被优化了!
[解决办法]
[解决办法]
操作符“+”会产生一个新的字符串:
详见帖子:
http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html
[解决办法]
路过酱油.......
[解决办法]
String类用到了不变模式,a、s1、s4都是"abcdefg",他们会指向同一个new ("abcdefg")对象
(s2+s3)是临时的变量
[解决办法]
[解决办法]
老生常谈了 这是 培训机构 或者 笔试题 经常见到的吧
[解决办法]
顶
[解决办法]
[解决办法]
竟然是:
true
true
false
false
我以为全是true!
看来,s2+s3 new 了新对象了!
[解决办法]
true
true
false
false
涉及到String常量池。通过String s = "abcdef" ; 来定义s时,在池中放入abcdef,是一个整体。
String s1 = "abc" ;
String s2 = "def" ;
String s3 = s1 + s2 ;
首先在池中会有s1和s2,定义s3时,s1和s2是变量,会在池中另辟内存给s3。
String s4 = "abc" + "def",首先计算右边的表达式,结果为temp,然后在池中找,如果有temp字符串,s3就指向temp(就是那个s);如果没有的话就和String s = "abcdef" ;是一样的效果。
[解决办法]
true
true
false
false
有关字符串池的内容,字符串池的定义是:在该字符串池中,具有相同的字符序列的字符串只对应一个字符串实例对象。a和s4是字符串直接变量,所以是指向的同一个实例对象。而s1虽然不是字符串直接变量,但是其是由有限个字符串通过“+”运算的结果,所以s1指向的字符串位于字符串池中,所以a和s1指向的字符串具有相同的字符序列。
对于((s2+s3) == a),虽然变量s2和s3指向的是一个字符串直接量,但变量s2和s3本身不是字符串直接变量,所以(s2+s3)不在字符串池中。
[解决办法]
学习
