zoukankan      html  css  js  c++  java
  • java中int和Integer比较

    java中int和Integer比较

    一,类型区别

    我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的包装类。

    二,声明或实例化时区别

    基本类型int在使用时可以在声明时直接初始化,如int a=0;而Integer作为一个class肯定要通过其构造方法来实例化啦,如:Integer i=new Integer(0);

    三,自动拆包

    什么是自动拆包?前面说Integer是int的包装类,拆包就是拆的Integer的包。

    对象的比较是通过equal()方法来比较的,但你肯定见过如下操作:

    Integer i=new Integer(10);
    int j=10;
    System.out.println(i==j);//输出true
    

    两个对象如果直接用判断程序比较的是两个对象的内存地址(不知道对象和引用的关系推荐文章: 链接 ),也就是说只有同一个对象使用才会返回true,那为什么这里也会返回true呢。

    原因就是java的自动拆包机制啦,当一个基本类型和一个包装类型比较时,包装类型会被自动拆包进行比较。

    四,非new产生的Integer

    1,非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

    Integer i = new Integer(100);
    Integer j = 100;
    System.out.print(i == j); //false
    

    2,对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

    Integer i = 100;
    Integer j = 100;
    System.out.print(i == j); //true
    
    Integer i = 128;
    Integer j = 128;
    System.out.print(i == j); //false
    

    3,java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

    public static Integer valueOf(int i){
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high){
            return IntegerCache.cache[i + (-IntegerCache.low)];
        }
        return new Integer(i);
    }
    

    本文部分引用博客:链接

  • 相关阅读:
    C&C++ recap
    将Rmarkdown文件转为pdf文件
    ChIP-seq Peak caller MACS index out of range问题解决
    R正则表达式的问题
    nodejs+cheerio爬虫测试
    jetty更换图标
    MyEclipse无法生成class文件
    JPA @OneToOne stackoverflow
    jquery-validate--使用由于疏忽导致的问题1(input失去焦点没有被验证,submit才验证)
    组合框
  • 原文地址:https://www.cnblogs.com/Davidhwj/p/10617765.html
Copyright © 2011-2022 走看看