zoukankan      html  css  js  c++  java
  • [读书笔记]自动装箱的陷阱以及==与equals

    先看一段代码,来自周志明的《深入理解Java虚拟机》。

            Integer a = 1;
            Integer b = 2;
            Integer c = 3;
            Integer d = 3;
            Integer e = 321;
            Integer f = 321;
            Long g = 3L;
            System.out.println(c == d);
            System.out.println(e == f);//这里有个IntegerCache -128~127的问题
            System.out.println(c == (a + b));
            System.out.println(c.equals(a + b));
            System.out.println(g == (a + b));//自动拆箱了又自动装箱了?
            System.out.println(g.equals(a + b));//因为a和b都是Integer类型,算术运算后还是Integer类型,和Long不是一个类型,所以是false,请看后面源代码。equals不处理数据转型的问题,类型不一样,不会去比较值。

    输出:

    true
    false
    true
    true
    true
    false
    

      先来看下java中==与equals的区别:

      ==比较引用。如果对象不是复合数据类型而是基本类型,比较的也是值。

      equals比较的是值。

    再来看下Integer类中equals的源码:

      public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }

    再来看下原著中作者的解释:

    包装类(指的是Integer这种,对比的是int)的"=="运算在不遇到算术运算的情况下不会自动拆箱,以及它们equals()方法不处理数据转型的关系。

  • 相关阅读:
    shell 调试
    shell中的函数参数
    shell脚本执行的区别
    《C# 语言学习笔记》——C# 简介
    【SVN】SVN使用教程总结
    SVN Unable to connect to a repository at URL问题解决
    前后端分离(三)
    前后端分离(二)
    前后端分离(一)
    【git】Git的使用
  • 原文地址:https://www.cnblogs.com/yasire/p/5463711.html
Copyright © 2011-2022 走看看