常量缓存与integer比较_Java编程中 int 和 Integer 的区别
在Java编程语言当中,int和Integer都是用于存储整数的数据类型,Integer是int的包装类。这里我们给出了一个表,来比较int和Integer的区别。
int 和 Integer 两者之间的主要区别是int是基本数据类型,而Integer是int的包装类,是引用的类型,它将基本数据类型int包装到一个对象中。int的主要目的是用于存储32位带符号的二进制整数,而Integer用于根据需要将int转换为对象,将对象转换为int。与Integer相比,int提供的灵活性较小,因为int只允许整数的二进制值。另一方面,Integer在存储和处理整数数据方面更加灵活。因为它继承了Object类,可以在具有Object引用或泛型的集合中使用它们,比如List。内存占用上来说,int需要32位(4字节)来存储。另一方面,Integer是一个对象,它除了存储数据以外,还要存储有关对象的元数据,因此占用的空间更大。有关类型转换,在Java中,不能直接通过强制转换将仅包含整数的字符串值分配给int变量,但是在使用Integer的情况下,可以使用 Integer(String) 构造函数将字符串分配给Integer类型的对象,甚至可以使用Integer提供的静态方法 parseInt(String) 来将String文字转换为int值。还有,我们也无法将int整数从十进制转换为其它进制。但是,在Integer中,我们可以分别使用toBinaryString(),toOctalString() 或 toHexString() 将其整数值直接转换为二进制,八进制和十六进制格式。
Integer a = 10, b = 10, c = 1000, d = 1000; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(c == d); System.out.println(c.equals(d));
这里我们还要特别注意一点,就是比较,看看上面这个例子,它的运行结果是:
truetruefalsetrue
对于很多朋友来说,这个结果都会很意外,不清楚为什么a==b返回true,但是c==d返回false,原因是Integer在加载的时候,会创建一个Integer数组在缓存区里,默认的包含Integer值为-128到127的对象,这个数组的上限大小是可以通过设置这个参数来更改的。
-Djava.lang.Integer.IntegerCache.high
当我们使用字面量,就是直接用数字,给integer赋值的时候,会调用Integer.valueOf这个方法,让我们来看一看这个方法的实现
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
不难看出,当i的值在缓存的范围内的时候,方法会直接返回常量池中对象的地址,在超出范围时,则会返回用构造方法创建的新的对象,所以,使用==运算符比较的时候的时候,在范围内会是true,范围外会是false。
这里我们要强调,==是比较地址,如果想要比较Integer对象的值的大小的时候,不要使用==,可以使用equals或者使用Integer类提供的另一个方法compareTo。
最后提一下,从Java5开始,编译器提供了自动装箱/拆箱的功能,编译器会在后台执帮我们在需要的时候自动把int转换为Integer,或者把Integer的对象转换成int。
以上就是int和Integer的基本区别。