SuperHurley
2017-09-09 07:59
采纳率: 100%
浏览 1.6k
已采纳

字符串==与equals例题

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

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

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • qing_xi_yxq 2017-09-09 09:21
    已采纳

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

    打赏 评论
  • 硪就是硪 2017-09-09 08:13

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

    打赏 评论
  • SuperHurley 2017-09-09 08:18

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

    打赏 评论
  • 鼠小 2017-09-09 08:42
     String s1 = "1"+"23"+"abc";
    String s2 = "1"+23+"abc";
    System.out.println(s1==s2);//false
    

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

    图片说明

    打赏 评论
  • ITDragon龙 2017-09-09 08:48

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

    打赏 评论
  • 不会code的coder 2017-09-09 09:05

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

    打赏 评论
  • mr_haozx 2017-09-09 10:01

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

    打赏 评论
  • SuperHurley 2017-09-09 10:59

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

    打赏 评论
  • SuperHurley 2017-09-09 11:05


    明白了,尴尬!

    打赏 评论

相关推荐 更多相似问题