Java Integer封装类的IntegerCache内部类

个人理解,不喜勿喷,欢迎指正。

首先看下面这段代码,猜一下输出结果是什么

1         Integer a = 10;
2         Integer b = 10;
3         System.out.println(a == b);
4         a = 100;
5         b = 100;
6         System.out.println(a == b);
7         a = 1000;
8         b = 1000;
9         System.out.println(a == b);    

你以为是true true true 或者是false false false吗?

天真,看下图

你没看错,就是这么坑!

按理说,Integer是封装类型,结果应该是false false false。

那么我们看下这段代码到底是怎样执行的,会出现这种结果

首先赋值时,先调用了下面的函数,这里出现了个奇怪的东西,IntegerCache,看起来问题就在这里

接下来看一下IntegerCache到底是个什么东东,下面是该类的源码

在源码中我们看到这个类有一个[-128,127]的Integer数组cache(这个数组的上限看起来好像是可以变的,但是我没有rt的源码包,所以不知道具体细节),所以在看Integer赋值的代码,就很清晰了

这里判断你赋值的数大小是否被包含在IntegerCache的cache数组内

如果在,就返回该对象的引用,因而小于等于127大于等于-128的数,通过==比较可以得出结果为true,因为引用相同,而超出范围的数就调用Integer的构造函数重新创建一个Integer对象因而虽然值相同但是由于引用不同而得出结果为false

所以判断对象的值是否相同时还是使用a.equals(b)

时间: 2024-12-08 12:18:10

Java Integer封装类的IntegerCache内部类的相关文章

Java Integer中的IntegerCache小记

同事今天给我发了一个关于Java拆装箱的ppt,里面有这么一段代码 Integer c = Integer.valueOf(3); Integer d = Integer.valueOf(3); Integer e = Integer.valueOf(321); Integer f = Integer.valueOf(321); System.out.println(c == d); System.out.println(e == f); 输出是 ,可是为什么呢 true false 我们看一看

Java Integer类分析

public static final int   MIN_VALUE = 0x80000000;  -2^31 public static final int   MAX_VALUE = 0x7fffffff; 2^31-1 public static String toString(int i, int radix) 该方法返回一个字符串形式的参数,第二个参数为指令的基数,将第一个参数转换为以第二个参数为基数的字符串 package com.yiibai; import java.lang.

java中封装类(一)

java中封装类共九个,分别是Boolean,Byte,Short,Integer,Long,Float,Double,Character,Void 其中Void对于使用者并无多大意义,也不可以构造任何对象,代码如下: package java.lang; public final class Void { public static final Class<Void> TYPE = Class.getPrimitiveClass("void"); private Void

java Integer类的缓存(转)

首先看一段代码(使用JDK 5),如下: [html] view plain copy public class Hello { public static void main(String[] args) { int a = 1000, b = 1000; System.out.println(a == b); Integer c = 1000, d = 1000; System.out.println(c == d); Integer e = 100, f = 100; System.out

Java Integer(-128~127)值的==和equals比较产生的思考

最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下: [java] view plain copy System.out.println("<-128~127以内的Integer值,Integer x = value;的方式赋值!>"); Integer i = 127; Integer j = 127; System.out.println("

java Integer包装类装箱的一个细节

java有八个基本数据类型,每个都有对应的一个包装类,比如int对应的Integer.从jdk1.5开始,java引入了自动拆装箱,可以直接进行形如Integer i = 20形式的赋值,编译器会自动将其转换为Integer i = Integer.valueOf(20)进行装箱,拆箱则是将int j = i的形式转换成了int j = i.intValue(). 装箱有个细节,如果不注意很容易出错,来看一下: Integer i = 20; Integer j = Integer.valueO

Java Integer == 以及分析

Java Integer == 先看一下这段代码 Integer integer1 = 100; Integer integer2 = 100; System.out.println("integer1 == integer2:"+(integer1==integer2)); Integer integer3 = 1000; Integer integer4 = 1000; System.out.println("integer1 == integer2:"+(in

Java面向对象程序设计--接口和内部类

1.接口的定义: In the Java programming language, an interface is not a class but a set of requirements for classes that want to conform the interface. 说明: 1) Interface 不是class,虽然interface具有class的一些特点,例如能够继承,能够定义相同类型的变量,而且和C++的abstract class非常像,但Java 的inter

java中封装类Feild和使用setter和getter方法访问封装的类Feild

class Person { private String name; private int age; public void setName(String name) //定义访问name的方法 { if (name.length() > 6 || name.length() < 2) { System.out.println("您设置的人名长度不合要求!"); } else { this.name = name; } } public String getName()