相关文章推荐

java当中所有的类都是继承于Object这个超类的,在Object超类中的定义了一个equals的方法,这个方法的初始行为是用于检测一个对象是否等于另外一个对象,它将判断两个对象是否具有相同的引用(对象的内存地址即存放在栈中的地址,也是用==进行比较),如果两个对象的具有相同的引用,他们一定是相等的。然而,经常需要检测两个对象的内容是否相等,所以在一些类库中这个方法被重写(覆盖)掉了,String,Integer,Date在这些类中的equals有其自身的实现,而不再是比较类在栈内存中的存放地址了,而是比较该地址所指向的真实内容是否相等。

简单数据类型和封装类中的equals和"=="

Java为每一个简单数据类型提供了一个封装类,每个基本数据类型可以封装成对象类型。
除int(Integer)和char(Character),其余类型首字母大写即成封装类类型名。double (Double),float(Float),long(Long), short(Short),byte(Byte),boolean(Boolean)。

以int和Integer为例说明

Java中int和Integer区别如下:

  • int是基本的数据类型,默认值可以为0
  • Integer是int的封装类,默认值为null
  • int和Integer都可以表示某一个数值
  • “equals”比较

    Integer的equals(Object obj)方法,在equals(Object obj)方法中,会先判断参数中的对象obj是否是Integer同类型的对象,如果是则判断值(即地址指向的真实内容)是否相同,值相同则返回true,值不同则返回false,如果obj不是Integer类的对象,则返回false。
    需要注意的是:当参数是基本类型int时,编译器会给int自动装箱成Integer类,然后再进行比较。

  • 基本类型(值类型)之间无法使用equals比较。
  • equals参数为值类型,则参数会进行自动装箱为包装类型,之后请参见第3点。
  • equals参数为包装类型,则先比较是否为同类型,非同类型直接返回false,同类型再比较值。
  • new Long(0).equals(0) 为 false,equals参数默认为int类型,装箱为Integer类型,不同类型直接返回false
  • new Integer(500).equals(500) 为 true,equals参数默认为int类型,装箱为Integer类型,相同类型再比较值返回true
  • new Integer(500).equals((short)500) 为 false,equals参数为short类型,装箱为Short类型,不同类型直接返回false
  • new Long(0).equals(0L) 为 true,equals参数为long类型,装箱为Long类型,相同类型再比较值返回true
  • “==”比较

  • 基本类型之间互相比较:以值进行比较
  • 一边是基本类型,一边是包装类型
  • 同类型的进行比较,如Integer 与int,Long与long进行==比较时, 会自动拆箱比较值
  • 不同类型之间进行比较,则会自动拆箱,且会进行自动向上转型再比较值(低级向高级是隐式类型转换如:byte<short<int<long<float<double, 高级向低级必须强制类型转换
  • 两边都是包装类型则直接比较引用地址,但是要注意IntegerCache除外。
  • IntegerCache 缓存

    JAVA的Integer有IntegerCache会缓存-128~127之间的对象。

    如:Integer x = 100,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。

    1
    2
    3
    4
    5
    6
    7
    Integer i02 = 59;
    Integer i03 = Integer.valueOf(59);
    Integer i04 = new Integer(59);

    System.out.println(i02 == i03); //true 因为59位于缓存区间直接从缓存中获取
    System.out.println(i02 == i04); //false
    System.out.println(i03 == i04); //false

    再看一些例子

    1
    2
    3
    4
    5
    6
    7
    Integer i02 = 200;
    Integer i03 = Integer.valueOf(200);
    Integer i04 = new Integer(200);

    System.out.println(i02 == i03); //false 因为200超出缓存区间从新创建对象
    System.out.println(i02 == i04); //false
    System.out.println(i03 == i04); //false

    int与Integer

    1
    2
    3
    4
    int a=55,b=201;
    Integer at=55,bt=201;
    System.out.println(a==at); //true 自动拆箱,和 IntegerCache 没关系
    System.out.println(b==bt); //同上

    【参考资料】

  • https://blog.csdn.net/qq_35807136/article/details/52189363
  •  
    推荐文章