006.int和Integer有什么区别!

9

int是我们常说的整形数字,是Java的8个原始数据类型(boolean、byte 、short、char、int、float、double、long)之一。

Java语言虽然号称一切都是对象, 但原始数据类型是例外 。


Integer是int对应的包装类,它有一个 int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。

在Java5中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。

关于Integer的值缓存

  • 构建Integer对象的传统方式是直接调用构造器,直接new一个对象。
  • 根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java5中新增了静态工厂方法valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。这个值默认缓存是-128到127之间。
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

自动装箱、拆箱
:

自动装箱实际上算是一种语法糖。什么是语法糖?可以简单理解为Java平台为我们自动进行了一些转换,保证不同的写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。

像前面提到的整数,javac替我们自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue(),这似乎这也顺道回答了另一个问题,既然调用的是Integer.valueOf,自然能够得到缓存的好处啊。

Java原始数据类型和引用类型局限性


  • 原始数据类型和Java泛型并不能配合使用
这是因为Java的泛型某种程度上可以算作伪泛型,它完全是一种编译期的技巧,Java编译期会自动将类型转换为对应的特定类型,这就决定了使用泛型,必须保证相应类型可以转换为Object
  • 无法高效地表达数据,也不便于表达复杂的数据结构,比如vector和tuple
我们知道Java的对象都是引用类型,如果是一个原始数据类型数组,它在内存里是一段连续的内存,而对象数组则不然,数据存储的是引用,对象往往是分散地存储在堆的不同位置。这种设计虽然带来了极大灵活性,但是也导致了数据操作的低效,尤其是无法充分利用现代CPU 缓存机制。