String s0="abc";
String s1="a"+"b"+"c ";
System.out.println( s0==s1 );
结果:ture
---------------------------------------------------------------
疑惑如下:
在java编程思想里看到,运算符"+"被重载,编译器创建了一个StringBuilder对象,并为每个字符串调用一次StringBuilder的append()方法,最后调用toString()方法生成结果;
那岂不就是String s1="a"+"b"+"c ";
等同于String s1=new String("abc");
照这样下去String s0="abc";
String s1=new String("abc");
System.out.println( s0==s1 );
结果:falseStringBuilder的toString方法如下: public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
写着// Create a copy, don't share the array,为何结果为true,求大神解答
String s1="a"+"b"+"c ";
System.out.println( s0==s1 );
结果:ture
---------------------------------------------------------------
疑惑如下:
在java编程思想里看到,运算符"+"被重载,编译器创建了一个StringBuilder对象,并为每个字符串调用一次StringBuilder的append()方法,最后调用toString()方法生成结果;
那岂不就是String s1="a"+"b"+"c ";
等同于String s1=new String("abc");
照这样下去String s0="abc";
String s1=new String("abc");
System.out.println( s0==s1 );
结果:falseStringBuilder的toString方法如下: public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
写着// Create a copy, don't share the array,为何结果为true,求大神解答
解决方案 »
- 跪求高手!把文件中的数据读取之后放到list中出现的问题诡异悬疑
- JDBC将得到的String加入到Object数组中
- 一个枚举考试题的输出,大家 不要执行的情况下,能看出来的吗?
- J2EE Web 新手,请教个问题
- Runnable 回答后快速给分!
- System.in,System.out,System.err既然是final static的,为什么还有setIn(),setOut(),setErr()呢?
- 快帮忙
- 问下JPanel
- 如何以某个字符为标记(如“;”)来读入一个文件?每次读入两个";"号中间的一段内容?
- 当你神经紧张时,就不用脑子去狂点鼠标,看看你15秒内能点几下鼠标,事先声明,鼠标坏了可别找我啊
- JPanel被set不可见后又设为可见,构造方法中的键盘监听还能监听吗?
- 关于正则表达式
String s1=new String("abc"); //创建两个对象,一个在字符串池里,另个在堆里(new操作符)。
所以地址不一样。
String s1="a"+"b"+"c ";
System.out.println( s0==s1 );
String s1 = "abc";//表示String类型变量s1指向了串池中的常量"abc"
String s2 = new String("abc");//表示String类型变量s2指向了堆区的new String(),而堆区的new String()又指向了串池中的常量"abc",两者的最终指向一致,但是如果比较:
s1==s2结果必为false,s1的地址为串池中的"abc",而s2的地址为堆区的new String()在java的源代码中关于比较两个字符串是否相等重写了equals()方法,其实现其实很特别:
public boolean equals(String str){
if(this==str)return true;//如果两者的地址一致,那么两者所表示的字符串肯定相同
if(this!=str){//如果地址不同,就是上面两种不同的声明方式的情况
//比较底层的value[]数组,该数组为char[],如果每个位置的char相同,且长度一致,返回 true
}
}