说说java中int和integer的区别

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'。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 7,044评论 1 31
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,952评论 18 399
  • 走着走着,妈妈停下来不走了,某同学回过头奇怪地问:"怎么啦?" "这是什么?"妈妈盯着脚前的一张纸巾问,不等某同学...
    冥界女战士之有趣灵魂阅读 708评论 0 0