最简单的代码看看你能答对吗?

freecodenow 2016-03-01 10:28:54
加精
public class Test1 {
public static void main(String[] args) {
String s1 = "ab" + "c";
String s2 = "abc";

System.out.println(s1 == s2 + " : " + s1.equals(s2));
}
}
...全文
9341 81 打赏 收藏 转发到动态 举报
写回复
用AI写文章
81 条回复
切换为时间正序
请发表友善的回复…
发表回复
AtomDCM 2020-01-15
  • 打赏
  • 举报
回复
掉优先级的坑,嘛哩嘛哩哄
zzzzzzzzzzzw___ 2019-12-27
  • 打赏
  • 举报
回复
AT152S 2019-11-11
  • 打赏
  • 举报
回复
原来是坑
余生不知年 2019-03-22
  • 打赏
  • 举报
回复
引用 4 楼 pipistar2016 的回复:
由于运算符的优先级问题,System.out.println(s1 == s2 + " : " + s1.equals(s2))等价于System.out.println(s1 ==( s2 + " : " + s1.equals(s2)));也就是“==”优先级低于“+”,所以输出false。
如果将(s1 == s2)加括号就是两个true(String用常量初始化的常量池作用)。





同意这位道友的观点。
我运行了一下结果是false
古月清凨 2018-12-12
  • 打赏
  • 举报
回复
j 简直6翻了
RUA好多鱼~ 2018-12-06
  • 打赏
  • 举报
回复
牛逼,学习了
先休息111 2018-09-10
  • 打赏
  • 举报
回复
以为讨论String 最后居然是优先级的坑
多年以后1234 2018-07-31
  • 打赏
  • 举报
回复
引用 3 楼 hemowolf 的回复:
[quote=引用 2 楼 jsjdtb356 的回复:]
只输出false
首先判断s1==s2,“==”的意思是引用类型的变量指向堆内存中的同一个对象,s1=“ab”+“c”;堆内存中应该是一块放的ab字符,一块放的是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 的值是在运行时得到的,它会重新构造字符串对象
[/quote]正解
jian_j_z 2018-04-23
  • 打赏
  • 举报
回复
编译器优化,常量池,运算符优先级,这些都是知识点。对编程的实际帮助就是具体使用的时候需要注意运算符的优先级,一般正常写的时候应该是这样的: System.out.println((s1 == s2) + ":" + s1.equals(s2)); 为了避免遇到运算符优先级的坑,还是多使用括号吧,是有点费事,不过易懂还不容易出错。
通大小强 2018-04-11
  • 打赏
  • 举报
回复
flase 涉及到运算符的优先级问题
紫恋月 2018-04-11
  • 打赏
  • 举报
回复
受教受教~本来以为很简单,没想到有个坑,呆萌新人。
linyuanshan 2018-03-23
  • 打赏
  • 举报
回复
引用 4 楼 pipistar2016的回复:
由于运算符的优先级问题,System.out.println(s1 == s2 + " : " + s1.equals(s2))等价于System.out.println(s1 ==( s2 + " : " + s1.equals(s2)));也就是“==”优先级低于“+”,所以输出false。 如果将(s1 == s2)加括号就是两个true(String用常量初始化的常量池作用)。
大神,很难注意到这个细节
GeekGray 2018-03-15
  • 打赏
  • 举报
回复
搞事情的吧!!!
male_001 2018-03-15
  • 打赏
  • 举报
回复 1

UTF_2018 2018-02-28
  • 打赏
  • 举报
回复
引用 4楼pipistar2016 的回复:
由于运算符的优先级问题,System.out.println(s1 == s2 + " : " + s1.equals(s2))等价于System.out.println(s1 ==( s2 + " : " + s1.equals(s2)));也就是“==”优先级低于“+”,所以输出false。 如果将(s1 == s2)加括号就是两个true(String用常量初始化的常量池作用)。
受教
wcf_developer 2017-10-21
  • 打赏
  • 举报
回复
受教了,掉优先级的坑里了
Jasen3 2017-10-18
  • 打赏
  • 举报
回复
4L好厉害
mr_haoliuyang 2017-09-09
  • 打赏
  • 举报
回复
应该考虑==和+号的优先级,四楼正解
荒野村夫 2017-08-10
  • 打赏
  • 举报
回复
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));
LYLXXSEA 2017-07-19
  • 打赏
  • 举报
回复
在堆内[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 两者都是比较值; +操作符的优先级大于==
加载更多回复(61)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧