zoukankan      html  css  js  c++  java
  • int与Integer区别+Integer类详解

            //Integer范围-128~127
            //Integer与Integer比较
            Integer a_127 = 127;
            Integer b_127 = 127;
            Integer c_new_127 = new Integer(127);
            //编译a_127=127时,被翻译成Integer a_127=Integer.valueOf(127)
            //而在valueOf()的源码中,对于-128~127之间的数,会进行缓存,即Integer a_127=127时,会将127进行缓存,下次再写Integer b_127=127时,则会直接从缓存中取,就不会new了
            //所以a_127==b_127结果为true,而a_128==b_128结果为false
            System.out.println(a_127 == b_127);//true
            //因为c_new_127新建了一个对象,所以这里两个对象相比较,当然不一样
            System.out.println(a_127 == c_new_127);//注意:false
            Integer a_128 = 128;
            Integer b_128 = 128;
            System.out.println(a_128 == b_128);//注意:false
            Integer a_new_128 = new Integer(128);
            Integer b_new_128 = new Integer(128);
            //两个new出来的对象进行比较,一定为false
            System.out.println(a_new_128 == b_new_128);//注意:false
            System.out.println(a_128 == a_new_128);//注意:false
            //int与int比较
            int i_127 = 127;
            int n_127 = 127;
            System.out.println(i_127 == n_127);//true
            int i_128 = 128;
            int n_128 = 128;
            System.out.println(i_128 == n_128);//true
            //Integer与int比较
            //Integer与int比较时,Integer会自动拆箱为int
            System.out.println(a_127 == i_127);//true
            System.out.println(c_new_127 == i_127);//true
            System.out.println(a_128 == i_128);//注意:true
            System.out.println(a_new_128 == i_128);//注意:true

    Integer.valueOf()的源码如下:

    1     //IntegerCache.low=-128;IntegerCache.high=127
    2     public static Integer valueOf(int i) {
    3         if (i >= IntegerCache.low && i <= IntegerCache.high)
    4             return IntegerCache.cache[i + (-IntegerCache.low)];
    5         return new Integer(i);
    6     }
    View Code

    Integer和int的区别:

    1.Integer是int的包装类,int的初值为0,Integer的初值为null。

    2.无论值是否相同,Integer与new Integer都不会相等,结果为false。

      情况一:Integer范围在-128~127之间,指向专门存放它的常量池;new Integer引用指向堆。它们的内存地址不一样,所以无论值是否相同,比较结果都为false。

      情况二:Integer范围不在-128~127之间,编译时Integer.valueOf()返回的是new Integer();而new Integer引用指向堆。这样两者是两个不同的堆栈对象,无论堆上的值是否相同,引用地址不同,比较结果都为false。

      情况三:两个Integer范围都不在-128~127之间,则依然是两个new Integer对象,则比较结果为false。

    3.两个都是非new出来的Integer,如果数在-128~127之间,值相同则为true,否则为false。原因:java在编译Integer时,会翻译成Integer i = Integer.valueOf(),而valueOf()会对-128~127之间的数进行缓存。

    4.两个都是new出来的,无论堆上的值是否相同,引用地址不同,结果为false。

    5.int和Integer比,无论Integer是new出来的还是-128~127范围之外的,值相同则为true,否则为false。原因:Integer会自动拆箱为int再比较。

    Integer类:

    字段:

    MAX_VALUE 
              值为 231-1 的常量,它表示 int 类型能够表示的最大值。

    MIN_VALUE 
              值为 -231 的常量,它表示 int 类型能够表示的最小值。

    SIZE 
              用来以二进制补码形式表示 int 值的比特位数。

    TYPE 
              表示基本类型 int 的 Class 实例。

    构造方法:

    Integer(int value) 
              构造一个新分配的 Integer 对象,它表示指定的 int 值。

    Integer(String s) 
              构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。

    方法:

    bitCount(int i) 
              返回指定 int 值的二进制补码表示形式的 1 位的数量。

    compareTo(Integer anotherInteger) 
              在数字上比较两个 Integer 对象。

    doubleValue() 【int,long,float,short】
              以 double 类型返回该 Integer 的值。

    parseInt(String s) 
              将字符串参数作为有符号的十进制整数进行解析。

    parseInt(String s, int radix) 
              使用第二个参数指定的基数,将字符串参数解析为有符号的整数。

    toBinaryString(int i) 
              以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。

    toHexString(int i) 
              以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。

    toOctalString(int i) 
              以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。

    valueOf(int i) 
              返回一个表示指定的 int 值的 Integer 实例。

    valueOf(String s) 
              返回保存指定的 String 的值的 Integer 对象。

    valueOf(String s, int radix) 
              返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。

    reverse(int i) 
              返回通过反转指定 int 值的二进制补码表示形式中位的顺序而获得的值。

    reverseBytes(int i) 
              返回通过反转指定 int 值的二进制补码表示形式中字节的顺序而获得的值。

  • 相关阅读:
    PHP实现发送模板消息(微信公众号版)
    laravel 跨域问题
    微信授权登录
    支付demo2
    支付demo1
    微信支付注意点
    微信支付方式区分
    debian,dietpi,linux中文乱码解决方法
    嵌入式应该深入专研STM32还是继续学习linux内核驱动呢?
    arduino下载ESP8266开发板的方法
  • 原文地址:https://www.cnblogs.com/cing/p/7997629.html
Copyright © 2011-2022 走看看