基础:
1、int 是 java 的一种基础数据类型,而 integer 是int 的一个封装类。
2、Integer 变量必须实例化之后才能使用,而 int 变量不需要。
3、Integer 实际是对象的引用,当 new 一个 integer 对象时,实际上是生成一个指针指向该对象;而 int 是直接存储数据值。
4、Integer 的默认值是 null ,而 int 的默认值是 0。
延伸:
1、因为 integer 变量实际上是对 integer 对象的引用,所以两个通过new 的integer 变量永远不相等(因为 new 生成的是两个对象,其内存地址不一样)。
Integer i = new Integer(100); Integer j = new Integer(100); System.out.print(i == j);//false
2、当一个 integer 变量和一个 int 变量比较时,只要两个变量的值相等,那么结果就是true,因为 integer 本质是 int 的一个封装类,当两数比较时,java会自动将 integer拆包,所以本质上就是两个int 变量的比较。
Integer i = new Integer(100); int j = 100; System.out.print(i == j);//true
3、当一个 new 创建的 Integer 变量和一个非 new 创建的 Integer 变量比较时,结果为false。因为非 new 创建的变量存在 java 常量池中,而 new 创建的变量指向堆中新建的对象,两者的内存地址不同。
Integer i = new Integer(100); Integer j = 100; System.out.print(i == j);//false
4、当两个非 new 的 Integer 变量比较时,如果两个变量的值在-128到127之间,那么结果就是 true,否则是 false。
对于这个奇怪的结果,java 的解释是这样的:
Integer i = new Integer(100);//在编译时会变成Integer i = Integer.ValueOf(100)
而 java API 中对 Integer.valueOf()的定义如下:
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); }
即,对于 -128~127 的数,java会进行缓存,而下次再对一个 Integer 变量赋值时,如果在 -128~127 并且已经被缓存,那么就会直接从缓存中调用。
PHP中文网,有大量免费的JAVA入门教程,欢迎大家学习!