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

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以后是这样。
关键是楼主的写法存在问题(或者是故意为之),如果正确加上括号,这个问题还有一些讨论的价值,否则也只不过是一个抖机灵的段子式的东西了。
不喜欢在技术讨论区抖机灵。
略微调整了一下后做了验证:

package com.zhyea;

public class Sub extends Super {

    public static void main(String[] args) {

        String s1 = "ab" "c";

        String s2 = "abc";

        System.out.println((s1 == s2) + " : " + (s1.equals(s2)));

    }

}


执行结果:

true true


具体原因,请参考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

发布了79 篇原创文章 · 获赞 2 · 访问量 2261

猜你喜欢

转载自blog.csdn.net/liuji0517/article/details/104790858
今日推荐