简述:int与Integer的区别:

对于它们,我们可能只是知道简单的区别。Integer是int的一个封装类,int的初始值为0,而Integer的初始值为null。但是他们之间真的仅仅只有这些区别吗?我觉得答案是否定的,于是我决定深入到jdk源码中一探究竟。看看Integer与int到底有什么区别。

执行代码:

 public class IntegerTest {

     public static void main(String[] args) {
         // TODO Auto-generated method stub
         int intNum = 127;
         Integer integerNum = 127;
         Integer integerNewNum = new Integer(127);

         //比较两个int变量
         int intNum1 = 127;
         System.out.print("int与int:");
         System.out.println(intNum==intNum1);

         //比较int与Integer区别
         System.out.print("int与Integer:");
         System.out.println(intNum==integerNum);

         //比较int与Integer区别
         System.out.print("int与NewInteger:");
         System.out.println(intNum==integerNewNum);

         //比较Integer与NewInteger
         System.out.print("Integer与NewInteger:");
         System.out.println(integerNum==integerNewNum);

         //比较两个NewInteger
         Integer integerNewNum1 = new Integer(127);
         System.out.print("NewInteger与NewInteger:");
         System.out.println(integerNewNum==integerNewNum1);

         //比较两个小于128的声明变量
         Integer integerNum1 = 127;
         System.out.print("小于128的Integer与Integer:");
         System.out.println(integerNum==integerNum1);

         //比较两个大于等于128的声明变量
         Integer integerNum2 = 128;
         Integer integerNum3 = 128;
         System.out.print("大于等于128的Integer与Integer:");
         System.out.println(integerNum2==integerNum3);

     }

 }

运行结果:

int与Integer:true
int与NewInteger:true
Integer与NewInteger:false
int与int:true
NewInteger与NewInteger:false
小于128的Integer与Integer:true
大于等于128的Integer与Integer:false

问题:

1.为什么当我们使用数值相等的integerNum、integerNewNum与intNum比较时结果为true?

2.为什么当我们使用数值相等的integerNum与integerNewNum进行比较时结果为false?

3.为什么integerNum与integerNum进行比较时会出现大于128和小于等于128不同结果的情况?

我的理解:

一下所有讨论问题的前提是:两个int型变量所赋值的数值相同时,比较结果为true,即12行的结果。

1.17行与21行所得到的结果为true,其实我们如果我们从源码来理解就会知道其本质了。在此之前我们应该先补充一个感念,Integer integerNum =127在执行时会被翻译成

Integer integerNum = Integer.valueOf(127)。源码如下

 public static Integer valueOf(String arg) throws NumberFormatException {
         return valueOf(parseInt(arg, 10));
     }

     public static Integer valueOf(int arg) {
         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]
                 : new Integer(arg);
     }
 private static class IntegerCache {
         static final int low = -128;
         static final int high;
         static final Integer[] cache;

         static {
             int arg = 127;
             String arg0 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
             int arg1;
             if (arg0 != null) {
                 try {
                     arg1 = Integer.parseInt(arg0);
                     arg1 = Math.max(arg1, 127);
                     arg = Math.min(arg1, 2147483518);
                 } catch (NumberFormatException arg3) {
                     ;
                 }
             }

             high = arg;
             cache = new Integer[high - -128 + 1];
             arg1 = -128;

             for (int arg2 = 0; arg2 < cache.length; ++arg2) {
                 cache[arg2] = new Integer(arg1++);
             }

             assert high >= 127;

         }
     }
 private final int value;
 public Integer(int arg0) {
         this.value = arg0;
     }

     public Integer(String arg0) throws NumberFormatException {
         this.value = parseInt(arg0, 10);
     }

以上jdk源码可以得到,Integer 无论是声明还是新建对象,最终所得的值都是int型,所以我们问题1就等到了答案。两个int型比较所得结果必然是ture.

2.25行所得结果为false,为什么呢?不是都转成int型嘛?结果不是应该为false嘛?额额额额。new了地址就不一样了所以当我们使用"=="进行比较时尽管数值相同,但内存地址却早已不相同。这就涉及到了下一篇博文中会讲的"=="与".equals"的区别。

3.为什么会出现问题3这种情况,128会是一个零界点呢?其实答案在源码中我们也可以找到

1 public static Integer valueOf(String arg) throws NumberFormatException {
2         return valueOf(parseInt(arg, 10));
3     }
4
5     public static Integer valueOf(int arg) {
6         return arg >= -128 && arg <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[arg + 128]
7                 : new Integer(arg);
8     }

当arg大于等于-128且小于等于127时则直接从缓存中返回一个已经存在的对象。如果参数的值不在这个范围内,则new一个Integer对象返回。

以上就是int与Integer的区别,我们再日常的项目或者练习中经常拿不准该使用int还是Integer,但看了这篇博文你应该已经有了自己的答案了吧!

Integer与int的区别的更多相关文章

  1. Integer与int的区别(转)

    如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1; ...

  2. Java|从Integer和int的区别认识包装类

    https://blog.csdn.net/darlingwood2013/article/details/96969339?utm_medium=distribute.pc_relevant.non ...

  3. java中Integer和int的区别(转)

    int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...

  4. Integer与int的区别(包装类和基本数据类型的区别)

    1. 默认值 int默认值为0,Integer的默认值为null.推论:Integer既可以表示null又可以表示0 2. 包装类中提供了该类型相关的很多算法操作方法 如把十进制装换为2进制(toBi ...

  5. Integer和int的区别

    1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引用,当new一个Integer ...

  6. Java中Integer 和 int的区别

    基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Integer 实际是对象 ...

  7. Integer 与int 的区别

    int 是java 提供的8 种原始数据类型之一.Java 为每个原始类型提供了封装类,Integer 是java 为int 提供的封装类.int 的默认值为0,而Integer 的默认值为null, ...

  8. 面试题:Integer和int的区别?在什么时候用Integer和什么时候用int

    /*  * (1) int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. * (2)int的默认值为0, 而Integer的默 ...

  9. Integer跟int的区别(备份回忆)

    int与Integer的区别 int 是基本数据类型Integer是其包装类,注意是一个类.为什么要提供包装类呢???一是为了在各种类型间转化,通过各种方法的调用.否则 你无法直接通过变量转化.比如, ...

随机推荐

  1. 关于EventSource的精华

    他是keep-alive的连接,服务端持续向这个请求的Reponse发送数据,以"data: "+您的消息+"\n\n"的格式发送,浏览器端会收到您发送的消息. ...

  2. django -model

    Model 属性 STATUS=( (0,"正常"), (-1 ,"删除") ) Choices =STATUS  //是用户处理数据返回参数做处理 如果增加了 ...

  3. PowerBuilder笔记

    powerbuilder中怎样新建一个pbl文件 在创建pbw之后,右键单击pbw,点新建,弹出对话矿,按图操作,就能创建pbl 主程序入口: 主程序入口代码: // Profile ahzbmysq ...

  4. java script 基础知识

    方法:提供信息 函数去处理 给出一个结果 字符类型. 字符提前赋类型 int i=1; money x; float;datetime; decimal;var 万用类型 var a = 1; 1赋值 ...

  5. 【应用】_有道词典客户端一个后缀名为sql的数据库。

    [缘起] 在清理电脑磁盘的时候,看一看各安装文件夹有占用了多大容量,发现有道词典居然达140MB了,于是进去看看. 发现个有趣的文件:XXX.sql. 首先我们看一看它的安装文件夹的结构: Dict ...

  6. mysql在空闲8小时之后会断开连接(默认情况)

    调试程序的过程发现,在mysql连接空闲一定时间(默认8小时)之后会断开连接,需要重新连接,也引发我对重连机制的思考.

  7. 启动Maven项目启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener

    tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包,你需要设置一下eclipse:项目 -> 属性 -> Deployment Assembly -> Add - ...

  8. javascript中针对float的ceil及floor

    function floorFloat(num, precision) { return +(Math.floor(+(num + 'e' + (precision))) + 'e' + -(prec ...

  9. Map工具系列-08-map控件查看器

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  10. 魅族mx4 pro连电脑,adb无法获取devices信息解决

    根据 flyme 的文档: K:\MX4 USB Reference Manual\简体\MX4_ADB_参考说明书.txt 操作如下: 二.Windows XP中文环境1.  建立或修改C:\Doc ...