==和equal的区别 hashcode int和Integer区别 自动装箱拆箱

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值