比较方式:
- 基本类型和基本类型比较
- 基本类型和包装类型比较
- 包装类型和包装类型比较
- "=="与"equal"比较
- [-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