2 superhurley SuperHurley 于 2017.09.09 15:59 提问

字符串==与equals例题

String s1 = "1"+"23"+"abc";
String s2 = "1"+23+"abc";
System.out.println(s1==s2);//false

为啥为false?(!!!问题有误,请看仔细了,否则后果自负!)
另外,自定义类未重写toString(),打印结果为 “类名@散列值”,那么对于重写过toString()方法的API,如何查看这种结果?

天灵灵地灵灵,java大神快显灵!

12个回答

qing_xi_yxq
qing_xi_yxq   2017.09.09 17:21
已采纳

楼主的运行结果都是应该为true,前面已经有坛友验证了。本人比楼主早学了几个月,也看了很多前辈的解答,现整理解答下。
1、==与equals,对于绝大部分对象而言,两者默认都是比较内存地址(String例外,因为已经被重写为比较字符串内容了)。
2、常量池与String不可变类,java程序中,每个String对象都是不可变的(方便重用与管理,具体看书),而且创建后会被缓存在常量池。
3,编译器预处理,对于字符串字面值直接连接,如s1="123"+"abc",预编译阶段会生成字符串常量“123abc”缓存在常量池,而在执行s2=“12”+“3abc”,会先检查常量池,因为已经存在,则直接把之前的常量池的地址赋值给s2,而如s3=s1+s2在编译阶段不能确定值的,会在运行时处理。

qq_19558705
qq_19558705   Ds   Rxr 2017.09.09 16:48

为什么有等于true,我简单说一下。s9 赋值以后,内存里面会有"123" , "abc" , "123abc" 。 执行到s10的时候,会检查内存中是否已经有了"123abc",
如果有了,就直接引用,如果没有就会新增一个。所以就是true,如果String s11 = new String("123abc") 就会是false
为什么是false,字符串相加,每次加一次,都会new一个,最后相加后的内存地址都不一样,当然是false。所以实际开发中,不会频繁用加号,会用StringBuffer的append方法。最后在toString.

diao1057
diao1057   2017.09.09 16:13

==比较的是内存地址,equals比较的内容.

SuperHurley
SuperHurley   2017.09.09 16:18

String s9="123"+"abc";
String s10="123abc";
System.out.println(s9==s10); //true
那么,这个为啥又为true了呢?

Small_Mouse0
Small_Mouse0   Ds   Rxr 2017.09.09 16:42
 String s1 = "1"+"23"+"abc";
String s2 = "1"+23+"abc";
System.out.println(s1==s2);//false

你看准这个是false??,,下面是我测是(JDK1.8,,IDEA2016)

图片说明

Small_Mouse0
Small_Mouse0 常量一般都会在常量池做操作,,我感觉这是相等的
2 个月之前 回复
qq_36746327
qq_36746327   2017.09.09 17:05

图片说明
如上图,这两个是相等的,不过我用的是jdk1.7

mr_haozx
mr_haozx   2017.09.09 18:01

这两个是相等的,我用的也是jdk1.7

source_sunshine
source_sunshine   2017.09.09 18:07

你妹的,我看了半天,你居然是拿假的结果来问。都看得我质疑人生了

SuperHurley
SuperHurley   2017.09.09 18:59

代码
运行结果:false/false
声明:对不起大家,因为s6==s7没有加小括号,导致运行结果为false(其实运行结果本身就不对,粗心了)。在此向大家致歉,s6==s7的结果,我这边也是true,
同时也想问下: 错误代码下的结果是怎么产生的呢?

SuperHurley
SuperHurley   2017.09.09 19:05


明白了,尴尬!

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片