String s1 = "1"+"23"+"abc";
String s2 = "1"+23+"abc";
System.out.println(s1==s2);//false
为啥为false?(!!!问题有误,请看仔细了,否则后果自负!)
另外,自定义类未重写toString(),打印结果为 “类名@散列值”,那么对于重写过toString()方法的API,如何查看这种结果?
天灵灵地灵灵,java大神快显灵!
楼主的运行结果都是应该为true,前面已经有坛友验证了。本人比楼主早学了几个月,也看了很多前辈的解答,现整理解答下。
1、==与equals,对于绝大部分对象而言,两者默认都是比较内存地址(String例外,因为已经被重写为比较字符串内容了)。
2、常量池与String不可变类,java程序中,每个String对象都是不可变的(方便重用与管理,具体看书),而且创建后会被缓存在常量池。
3,编译器预处理,对于字符串字面值直接连接,如s1="123"+"abc",预编译阶段会生成字符串常量“123abc”缓存在常量池,而在执行s2=“12”+“3abc”,会先检查常量池,因为已经存在,则直接把之前的常量池的地址赋值给s2,而如s3=s1+s2在编译阶段不能确定值的,会在运行时处理。
==比较的是内存地址,equals比较的内容.
String s9="123"+"abc";
String s10="123abc";
System.out.println(s9==s10); //true
那么,这个为啥又为true了呢?
String s1 = "1"+"23"+"abc";
String s2 = "1"+23+"abc";
System.out.println(s1==s2);//false
你看准这个是false??,,下面是我测是(JDK1.8,,IDEA2016)
为什么有等于true,我简单说一下。s9 赋值以后,内存里面会有"123" , "abc" , "123abc" 。 执行到s10的时候,会检查内存中是否已经有了"123abc",
如果有了,就直接引用,如果没有就会新增一个。所以就是true,如果String s11 = new String("123abc") 就会是false
为什么是false,字符串相加,每次加一次,都会new一个,最后相加后的内存地址都不一样,当然是false。所以实际开发中,不会频繁用加号,会用StringBuffer的append方法。最后在toString.
这两个是相等的,我用的也是jdk1.7
运行结果:false/false
声明:对不起大家,因为s6==s7没有加小括号,导致运行结果为false(其实运行结果本身就不对,粗心了)。在此向大家致歉,s6==s7的结果,我这边也是true,
同时也想问下: 错误代码下的结果是怎么产生的呢?