zoukankan      html  css  js  c++  java
  • 决心彻底认知 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 亲儿子,直接比较值。

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

  • 相关阅读:
    ES6标准入门 第一章:简介
    vue调试工具之 vue-devtools的安装
    vue 高德地图之玩转周边
    vue-动手做个选择城市
    js 高级算法
    (转)预处器的对比——Sass、LESS和Stylus
    windows下安装mongodb以及node.js连接mongodb
    vue组件(将页面公用的头部组件化)
    浅谈移动端rem的用法
    vue 调用高德地图
  • 原文地址:https://www.cnblogs.com/Ankermaker/p/8583258.html
Copyright © 2011-2022 走看看