package com.cc.demo1;
public class IntegerTest {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
System.out.println(c == d); //true
System.out.println(e == f); //false
//存在a+b数值表达式,比较的是数值
System.out.println(c == (a + b)); //true
//equals比较的是数值
System.out.println(c.equals(a + b));//true
//存在a+b数值表达式,比较的是数值
System.out.println(g == (a + b));//true
// Long的equals()先判断传递进来的是不是Long类型,而a+b自动装箱的是Integer类型
System.out.println(g.equals(a + b));//false
//从下面的两个比较中,可以看出一个Integer和Long想加,结果是Long类型
System.out.println(g.equals(a + h));//true
System.out.println(c.equals(a + h));//false
}
}
肯定很多人都知道, 在Java中有一个Integer缓存池,缓存的大小是:-128~127。
这里说一下:
使用 **== **的情况:
- 如果比较的是Integer变量,默认比较的是地址值。
- Java的Integer维护了从-128~127的缓存池。
- 如果比较的某一边有操作表达式(如a+b),那么比较的是具体数值。
使用 equals () 的情况:
- 无论是Integer还是Long中的equals() 默认比较的是数值。
- Long的equals()方法,JDK的默认实现:会判断是否是Long类型
看一下Long中equals()方法的源码:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
会先判断是否为Long类型,不是Long,返回false。
再看一下Intege中equals方法的源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
也会先判断是否是Integer类型。
简单的看一下instanceof。
instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。java中的instanceof是通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。