1.equal只能用于引用数据类型(内在判断过程完全取决于子类中重写方式,如果没有重写equal,就默认采取==只判断内存地址);
如果一个类没有重写equal方法,那么就默认继承父类Object中的equal方法,就是单纯的== 来判断地址:
equal总结:Object的equal和==都是在比较内存地址是否为同一对象,如果是String,Integer类覆写了equal,就是比较的内存地址上的值
重写了equals也最好重写hashcode()方法:防止判断对象equal了之后,但是不同的hashcode计算方法导致在某些情况例如hashmap存放键值对计算index时,出现两种index,造成存了两个不同的数据,其实应该是一个数据
2. == 用于直接比较内存地址(也就是比较是否为同一对象)
基本数据类型比较特殊:
(byte,short,char,int,float,double,long,boolean):作为常量在方法区中的常量池用hashset策略存储起来,那么在常量池中一个常量会对应一个地址,不管有再多的“123”,“123”这个数据都对应的是同一个地址,相应的String str="123", str常量也在常量池中 也是可以直接通过这样的==比较内存地址;
基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean):这几种除了Float和Double都实现了缓存机制,这些包装类型也能通过==来判断是否相等,
1.int1和int2 都在常量池中对应一个地址
2.int类型和Integer类型比较,无论Integer类型的对象是常量或者是new出来的,只要和int类型进行比较,就会自动拆箱成int,相当于还是两个int类型进行比较,常量池中对应一个地址;
3.4.两个new出来的Integer类型或者一个常量类型和一个new出来的对象==比较,不会进行拆箱操作,地址不同;
5.如果Integer类型作为常量(不包括new出来的)的话,会对-128到127之间(Byte,Short,Integer,Long都是这个范围)的数进行缓存,会有专门的常量池存放,127在缓存之内,所以(5)是相等的;而在(6)中,128超过缓存范围,会进行new Integer() 操作来创建对象,相当于指向了两个不同的地址,所以(6)不等;
int和Integer的区别:
1.int是基本数据类型,初始化值是0;Integer是基本数据类型包装类,初始化值是null;
2.都可以表示一个数:(以下三种都能表示一个数)
int i =1;
Integer i = 1;
Integer i = new Integer(1);
3.Integer和int不能互通,像一些ArrayList,泛型等都需要用到的是包装类而不是基础数据类型;
自动装箱拆箱:
还是以int和Integer为例:
装箱
在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i=
new
Integer(
10
);
而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:
Integer i=
10
;
这个过程会自动根据数值的类型去new Integer对象,则就是自动装箱;
拆箱:
Integer i=
10
;
int
j=i;
将Integer对象自动拆箱为int