美文网首页
说说java中int和integer的区别

说说java中int和integer的区别

作者: 哈利路亚911 | 来源:发表于2018-09-28 10:12 被阅读0次

java虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成部分,所以在面试中考察原始数据类型和包装类型是很常见的。
int是java的8中原始数据类型(boolean byte short char int float double long)之一,Java虽然是面向对象的语言但是原始数据类型是例外。
Integer 是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学云算,int和字符串之间的转换等,java5中引入了自动装箱和自动拆箱功能,java可根据上下文自动进行转换,极大简化了相关流程。
关于integer的值缓存,这涉及到java5的一个改动,构建integer的传统方法是直接调用构造器,直接new一个对象,但是根据经验,我们发现大部分的数据操作都是集中供暖在有限的,较小的数值范围,

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

因而在java5中新增加了静态工厂方法 valueOf,在调用他的时候回利用一个缓存机制,带来了性能改进,按照javadoc,这个默认值是 -128到127之间。

知识扩展
1.理解自动装箱,拆箱
自动装箱实际上是一中语法糖,什么是语法糖呢?可以理解为java平台为我们自动进行了一些转化,保证不同的写法在运行时等价,他们发生在编译阶段,也就是生成字节码是一致的。
javac替我们自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue(),那么如何验证这个结论呢?
下面写一段简单的代码然后反编译一下
Integer integer = 1;
int unboxing = integer ++;

反编译输出:
1: invokestatic #2 // Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: invokevirtual #3 // Method
java/lang/Integer.intValue:()I
这种缓存不是只有Integer才有,同样的存在于其他一些包装类上,不如:

  • Boolean,缓存了true/false对应实例,确切的说只返回了两个常量实例
  • Short 同样缓存了 -128到127
  • Byte,数值有限,所以全部缓存了。
  • Character,缓存范围'\u0000' 到 '\u007F'。

相关文章

网友评论

      本文标题:说说java中int和integer的区别

      本文链接:https://www.haomeiwen.com/subject/ipeuoftx.html