决心彻底认知 Integer 和 int 对象创建的原理

基本知识:【内容自己总结(也有角色虚构),主要内容如有错误,请指出与君同步进步!】

A、int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换int 是java的一种基本数据类型 (自认为基本数据类型的特性:永远不会 new);
B、integer是一个类,只要用到对象就一定要调用构造函数去产出,而int变量不需要(人家是java的八个儿子之一,土豪);
C、Integer的默认值是null,int默认值是0;

D、Integer 的缓存常量池原理,范围-128到127(不清楚的度娘走起!

下面(看图说话)

 

1: Integer a=1;和 Integer a = new Integer(1); 是一样的效果所以,他们在java内存中的作用和new的作用一样,都会在堆内存创建一个引用对象,里面存的也就是栈中对象的地址;例如图中的15声明方式(d和e 也是);

2:第一个结论中只说了效果一样而已,但是实质上不一样,使用new去创建, 堆和栈中一定都是是新的对象,但是Integer a =1 ,直接赋值的,赋值范围在-128到127之间的,那么它也算是java的干儿子,会从Integer的缓存常量池中的对象地址赋值给它;查看途中的1、2组合和3、4组合就应该明白了;【本文标注的红色字呢说明一个玩意:就是所谓的Integer 缓存常量池 ,都是适用于像Integer a =1 这样直接赋值的】;

3:说一下java 亲儿子吧:int 。我们看图中的8,9,10 这三个声明对象的式子,对应的内存的分布。实际上他们的值都存放在堆内存中,只不过它的值不是地址(栈对象的地址),恰恰就是它直接赋值的对象值,就是图中的,1,1,200;对于o,p,q这三个对象,不需要栈空间为他们创建对象并且给他们获取这个值的地址,他们自己就有存储这些值的本领;

就上面的几点:当前经常出现的面试题目有如下类型:

a: 两个new Integer()比较(“==”),一定是false;

Why?都new了,谁认识谁?地址不同所以不同;

b:一个 Integer 直接赋值 和 new Integer(),也一定是false.

why?从头再看一下。

c:一个int 和 Integer{(无论是直接赋值还是new 出来的对象)}  比较(“==”),他们的值只要相等 ,那一定是true;

why?因为Integer 自动拆解呀,和java亲儿子比都要先拆解成它儿子一样的int,才可以比;

d:两个int 比?没得比,这个不会!!!

对于“==”这个运算符有一句话永远是对的:

比较的永远是堆中对象的值!要么是引用对象的地址要么就是java 亲儿子,直接比较值。

最后跟上测试的几种情况:

posted @ 2018-03-16 16:44  Ankermaker  阅读(493)  评论(0编辑  收藏  举报