你能答对最简单的代码吗?
public
class
Test1 {
public
static
void
main(String[] args) {
String s1 =
"ab"
+
"c"
;
String s2 =
"abc"
;
System.out.println(s1 == s2 +
" : "
+ s1.equals(s2));
}
}
false:true,string类是不可变对象,指向的内存地址都不一样的
只输出false
首先判断s1==s2,“==”的意思是引用类型的变量指向堆内存中的同一个对象,s1=“ab”+“c”;堆内存中应该是一块放的ab字符99LRC歌词,一块放的是c字符,而s2=“abc”指向的应该是一块方有abc的内存,所以不相等。(字符串常量可能放在常量区)
再判断s1.equals(s2),string类的equals方法是经过重写的,规则定义的是只要字符串内容相等则返回true
最后,System.out.println(s1==s2.....)调用的是println(boolean x)方法,只能返回一个true或者false,想全返回在s1==s2外面加括号,使println调用println(String x)
全部输出 true
字符串常量池的原则是,在编译期间可以确定内容的字符串,直接放到常量池
String s1 = "ab" + "c";
这条语言在编译时,可以确定 s1 = "abc",因此它与 s2 = "abc" 指向同一对象
如果把 s1 的赋值改为:
String s1 = args[0] + args[1]
运行后执行:java Test1 ab c
则输出 false true,因为这时 s1 的值是在运行时得到的,它会重新构造字符串对象
由于运算符的优先级问题,System.out.println(s1 == s2 + " : " + s1.equals(s2))等价于 System.out.println(s1 ==( s2 + " : " + s1.equals(s2)));也就是“==”优先级低于“+”,所 以输出false。
如果将(s1 == s2)加括号就是两个true(String用常量初始化的常量池作用)。
后边还有个运算优先级的坑..
正解!
都是牛人,新人受教了.
原来是个坑啊!
你们可能都很厉害,但是你们没有动手试一下,结果确实是false;
System.out.println(s1 == s2); ------结果为true
System.out.println(s1.equals(s2)); ----------结果为true
System.out.println(s1 == s2 + ":" + s1.equals(s2));的原因就是因为优先级,括号内的内容相当于s1 == (s2 + ":" + s1.equals(s2))
所以就是一个false。
哈哈,我又掉坑里了。。
一不小心就要掉坑啊,四楼正确,够仔细
掉优先级的坑里去了
全部输出true,我印象中至少JDK1.5以后是这样。
关键是楼主的写法存在问题(或者是故意为之),如果正确加上括号,这个问题还有一些讨论的价值,否则也只不过是一个抖机灵的段子式的东西了。
不喜欢在技术讨论区抖机灵。
略微调整了一下后做了验证:
|
执行结果:
|
具体原因,请参考3楼的解释。
是呀,都去讨论优先级了
唉 抖机灵 赚分的节奏啊 坑货
牛逼了,掉坑了
把新人吓到了,就是个字符串是否相等,什么内存地址都上来了!
昨天刚复习了常量池,结果还有个优先级。
学习了,还没看到常量池
好阴险的一题~!
好多坑,经典!!!
只懂优先级,地址取放正在学
够仔细,受教了!
太坑了,如果单独输出肯定是true,一起输出就是false,原来是优先级的问题,好大的坑
楼主你发这个帖子的意义在哪里?讨论的这么激烈竟然不出来解释一下,让新人找不到点,虽然我不是老鸟
如果这是脑筋急转弯,那2/4楼都正解,
如果这是技术讨论,那你这个题目就错了 ,应该按照三楼说的一样
真厉害,新人表示受教了
public class Sub extends Super {
public static void main(String[] args) {
String s1 = "ab" + "c";
String s2 = "abc";
System.out.println(s1 == s2?"true":"false" + " : " + (s1.equals(s2)));
System.out.println(s1 != s2?"true":"false" + " : " + (s1.equals(s2)));
}
}
难度升级
false:true
false:true
true:true
受教了.... 都考虑到堆和栈的问题了..
应该是只有一个false,由于运算符优先级的原因
回答错的只能说是学艺不精,虽然我迟疑了下
都是大哥 ,,, 服了 新人求大哥带我飞
厉害 这种细节我是搞不来 都是牛人
在堆内[u]存中,字符串常量可以放在常量区,而字符串常量池的原则,在编译期间可以确定内容的字符串,直接放在常量池中。
string s1 = "ab"+"c"; string s2 = "abc" ;
s1 == s2; true.
== 和 Equals 的区别
1. == 是一个运算符。
2.Equals则是string对象的方法,可以.(点)出来。
我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较
1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;
需注意几点:
1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;
+操作符的优先级大于==
System.out.println(s1 == s2); ------结果为true
System.out.println(s1.equals(s2)); ----------结果为true
System.out.println(s1 == s2 + ":" + s1.equals(s2));的原因就是因为优先级,括号内的内容相当于s1 == (s2 + ":" + s1.equals(s2))
所以就是一个false。
如果想要做s1==s2和s1.equals(s2)只有在s1==s2外加括号,结果输出为: true :true 如下:
System.out.println((s1==s2) + ":" + s1.equals(s2));
应该考虑==和+号的优先级,四楼正解
搞事情的吧!!!
由于运算符的优先级问 题,System.out.println(s1 == s2 + " : " + s1.equals(s2))等价于 System.out.println(s1 ==( s2 + " : " + s1.equals(s2)));也就是“==”优先级低于“+”,所 以输出false。
如果将(s1 == s2)加括号就是两个true(String用常量初始化的常量池作用)。
大神,很难注意到这个细节
flase
涉及到运算符的优先级问题
受教受教~本来以为很简单,没想到有个坑,呆萌新人。
编译器优化,常量池,运算符优先级,这些都是知识点。对编程的实际帮助就是具体使用的时候需要注意运算符的优先级,一般正常写的时候应该是这样的:
System.out.println((s1 == s2) + ":" + s1.equals(s2));
为了避免遇到运算符优先级的坑,还是多使用括号吧,是有点费事,不过易懂还不容易出错。
以为讨论String 最后居然是优先级的坑
同意这位道友的观点。
我运行了一下结果是false