黑马程序员技术交流社区
标题:
String中的一个问题,求解答?
[打印本页]
作者:
目标
时间:
2014-3-17 21:22
标题:
String中的一个问题,求解答?
public class StringText {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "黑马";
String s2 = "程序员";
String s3 = s1 + s2;
String s4 = "黑马程序员";
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
}
}
复制代码
结果是:
true
false
但不知道为什么?该怎么理解?
作者:
luoanjade
时间:
2014-3-17 21:30
这就是字符串中“==”和equals的区别,你就简单理解为:equals比较的是值,“==”比较的是对象,就能明白了。值得强调的是,String不是基本数据类型。你上面s3和s4指向的是两个不同的字符串对象,所以为false。但是他们的值是相等的,所以equals为true。
作者:
等你的季节
时间:
2014-3-17 21:32
Strinhg中的equals()方法比较的是字符串的内容,内容相同返回true,不同则返回false。而“=“比较的是地址,地址不同则为false
作者:
duanyoujiji
时间:
2014-3-17 21:35
本帖最后由 duanyoujiji 于 2014-3-17 22:54 编辑
equals 比较的是内容,你的疑问应该是为什么输出false吧。
== 比较的是地址。
s1+s2是字符串的串联操作, 通过Builder或者Buffer类及其 append 方法实现的,创建了一个实例对象s3,这么说你就该明白了:就是new String ()道理一样。对象不一样地址也就不一样了。
所以输出结果是false 。如果改成s3="黑马"+"程序员" ;s3==s4 结果就是true了。
作者:
nicholyx
时间:
2014-3-17 22:06
本帖最后由 nicholyx 于 2014-3-17 22:14 编辑
//增加了一点小知识,楼主瞧瞧吧
public class StringText {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "黑马";
String s2 = "程序员";
String s3 = s1 + s2;
String s4 = "黑马程序员";
String s5 = "黑马" + "程序员"; //和s4一样,都是指向同一个字符串常量,下面有解释
System.out.println(s3.equals(s4)); //true
System.out.println(s3 == s4); //false
System.out.println(s4 == s5); //true
}
}
/*
输出结果:
true
false
true
解释:
至于 == 与 equals 的用法上面说的很清楚了,我说下我自己加进去的这个。
因为s4是字符串常量"黑马程序员",而字符串常量在编译期就被确定了,而s5中"黑马"和"程序员"也都是字符串常量,当一个字符串由多个字符串常量连
接而成时,它自己肯定也是字符串常量,所以s5也同样在编译期就被解析为一个字符串常量,由于s4和s5这两个字符串常量的字面值一样,
所以s4 和 s5 指向常量池中同一个字符串常量"黑马程序员"。
所以 s4 == s5 --> true;
*/
复制代码
作者:
刘一博
时间:
2014-3-17 23:12
equals方法只比较两个String的值,不比较地址
使用==号实际比较地址与值都相同
使用jad反编译代码如下:
String s3 = (new StringBuilder(String.valueOf(s1))).append(s2).toString();
复制代码
观察s3,发现当进行加法时,实际是先new了stringBuilder对象,将s3指向它,所以当比较s3与s4时,会返回false
作者:
王浩龙
时间:
2014-3-18 11:38
public class Test07 {
public static void main(String[] args) {
String s1 = "黑马";
String s2 = "程序员";
String s3 = s1 + s2;
String s4 = "黑马程序员";
/*Object 类的 equals (x.eauals(y))
* 方法实现对象上差别可能性最大的相等关系;
* 即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,
* 此方法才返回 true(x == y 具有值 true)。
* 但是String类复写了次方法
* 如果给定对象表示的 String 与此 String 相等,
* 则返回 true;否则返回 false。
* 所以s3.equals(s4)为true,但是又是两个对象所以s3 == s4为false
*/
System.out.println(s3.equals(s4));
System.out.println(s3 == s4);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2