java基本类型和包装类型的“==”和equals()方法

八大基本数据类型均有对应的包装类 
byte、short、int、long、float、double、char、boolean分别对应Byte、Short、Integer、Long、Float、Double、Character、Boolean

包装类型的出现是为了方便基本数据类型能够和其它对象结合在一起使用,比如一些常用的集合List和Set等要求存放的值必须为对象。而包装类的自动拆装和封装机制则使得包装类和基本数据类型互换变得很便利。至于包装类和基本数据类型之间的区别就不用赘述了,主要是初始值,使用方式,存储方式不同等等。
 

  1. 基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较。
  2. 另外两个Integer对象进行“==”比较时,如果有一方的Integer对象是new获得的,返回false,因为比较的是两个对象的地址。
  3. 两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。
  4. 基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,若类型不同返回false,若装箱后类型相同,则比较值,如果值相同,则返回true,否则返回false。
  5. 对于Integer、Short、Byte、Character、Long 这些包装类,都有一个常量池,常量池的范围是-128~127之间。如果定义的包装类的值在这个范围内,则会直接返回内部缓存池中已经存在的对象的引用,而对于浮点型Float和Double这样的包装类,没有常量池机制,不管传入的值是多少,都会new一个新的对象。
     

代码示例:

int a=257;
Integer b=257;
Integer c=257;
Integer d=new Integer(a);
Integer d1=new Integer(a);

Integer b2=57;
Integer c2=57;

System.out.println(a==b);//true
System.out.println(b==c);//false
System.out.println(b2==c2);//true
System.out.println(a==d);//true
System.out.println(b==d);//false
System.out.println(d==d1);//false

System.out.println(a.equals(b));//编译出错,基本型不能调用equals()
System.out.println(b.equals(257.0));//false
System.out.println(b.equals(c));//true
System.out.println(b.equals(a));//true
System.out.println(b.equals(d));//true

 

你可能感兴趣的:(java)