关于equals()和==

第一个例子

        Integer a=100;
        Integer b=1000;
        Integer c=100;
        Integer d=1000;
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(c==b);
        System.out.println(b==d);

上面程序运行结果为:

false
true
false
false

可以看到a和c的数值相等,所以输出结果为true,但是b和d的数值也相等为什么输出结果却为false呢?这是因为Integer类在内存中有一个值的范围为[-128,127]的对象池。只要Integer对象的值在[-128,127]范围内,都是从这个对象池中取。所以只要是这个范围内的Integer对象,只要数值相同,就是同一个对象。那么==的结果,就是true。超过了这个范围,则会new新的Integer对象,尽管数值相同,但是已经是另一个对象了。

第二个例子

 	String a = "helloword";
    final String b = "hello";
    String d = "hello";
    String c = b + "word";
    String e = d + "word";
    String f ="hello"+"word";
    System.out.println(a == c);
    System.out.println(a == e);
    System.out.println(a == f);

输出:

  true
  false
  true

首先要明确的是引用数据类型 == 比较的是地址值,equals() 没重写比较的是地址值,重写之后比较的是内容。String重写了,StringBuffer没有重写。
其次:a==ctrue是因为 bfinal类型,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b替换为它的值。所以 c = b+“word” 等于 c = “hello”+“word” 。(有final时是直接比较内容而不是地址)

a ==efalse是因为e = d+“word” 其实是创建了一个StringBuffer对象,然后用StringBuffer对象执行append方法来创建出字符串对象“ab”,然后再转换成为String。但是这个转换后的String对象,也就是上面的e是放在堆里面的。而a则是字符串常量,放在常量池里面。所以返回的是false。(地址值不同)

a ==ftrue 是因为:常量相加的时候,其实是在编译的时候就直接相加为“helloword”,这是JVM的优化,所以运行的时候,a和f的字节码是一样的。因为在常量池中有了一个“helloword”,所以两个引用指向的是一个字符串“helloword”,所以返回结果也是true。(指向同一个地址)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值