JAVA基本类型与包装类型的比较

1,597 阅读1分钟

比较方式:

  1. 基本类型和基本类型比较
  2. 基本类型和包装类型比较
  3. 包装类型和包装类型比较
  4. "=="与"equal"比较
  5. [-128,127]与[-128,127]范围的数据比较

先说结论:包装类之间比较需转成同一类型通过equals比较是否相等,通过compareTo比较大小,其余可直接通过"=="比较是否相等,通过'>' '<'比较大小。

基本类型和基本类型比较

基本类型之间的比较只会比较本身的值是否相等,所以可以放心比较。

int a = 127;
int b = 127;
byte c = 127;
short d = 127;
long e = 127L;
float f = 127.0F;
double g = 127.0;
char h = (char) 127;

System.out.println(a == b);//true
System.out.println(a == c);//true
System.out.println(a == d);//true
System.out.println(a == e);//true
System.out.println(a == f);//true
System.out.println(a == g);//true
System.out.println(a == h);//true

基本类型和包装类型比较

基本类型和包装类型比较都会触发自动拆箱,最终还是比较本身值,所以依然可以放心比较。

int a = 200;
Integer b = 200;
Integer c = new Integer(200);

System.out.println(a == b);//true
System.out.println(a == c);//true
System.out.println(c.equals(a));//true

包装类型之间的比较

因为包装类型是一个对象,所以值相同地址值可能会不同,而"=="只会比较地址值。一般又是经常进行值比较所以都是通过"equals"方法比较。

先看"=="的比较结果

通过valueOf()方式创建对象:如果是[-128,127]的值,会先去缓存池查看是否以有对象,有则将对象地址返回,没有则创建。

Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
Integer c = new Integer(127);
Integer d = Integer.valueOf(200);
Integer e = Integer.valueOf(200);

System.out.println(a == b);//true 因为缓存池有则返回了已经创建的地址值故相等
System.out.println(a == c);//false 通过new 关键字新建了个对象,所以分有新的地址值
System.out.println(d == e);//false 因为不在缓存池范围内所以都是不同地址值

再看"equals"的比较结果

equals是专门为了比较值重写的方法(不重写则和"=="一样),故只要值一样则表示相等

Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
Integer c = new Integer(127);
Integer d = Integer.valueOf(200);
Integer e = Integer.valueOf(200);

System.out.println(a.equals(b));//true
System.out.println(a.equals(c));//true
System.out.println(d.equals(e));//true

如果不同包装类型但值大小相等调用equals会不会和基本类型一样相等

在包装类的equals方法中比较是不是相同类型,不是则直接返回false

Integer a = Integer.valueOf(127);
Double b = new Double(127.0);

System.out.println(a.equals(b));//false 

Integer包装类重写的equals方法

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

拓展

包装类型都实现了Comparable接口,但是并不能通过">" "<"来比较大小,包装类比较大小应该通过compareTo进行比较 包装类和基本类型比较会触发自动拆箱

Integer a = Integer.valueOf(127);
Double b = new Double(127.0);
int c = 200;
double e = 200.0;
Integer f = new Integer(127);

System.out.println(a > b);//false
//System.out.println(a == b);//编译不通过
System.out.println(a < b);//false
System.out.println(a < c);//true
System.out.println(a > f);//false
System.out.println(c > e);//false
System.out.println(c == e);//true
System.out.println(c < e);//false
System.out.println(b < e);//true