关于Integer类思考

测试代码:

public class IntegerTest {
    public static void main(String[] args) {
        Integer i1 = 12;
        Integer i2 = 12;
        Integer i3 = 135;
        Integer i4 = 135;
        System.out.println("i1 == i2? " + (i1 == i2));
        System.out.println("i3 == i4? " + (i3 == i4));
    }
}

输出结果:

i1 == i2? true
i3 == i4? false

为什么都是Integer类的对象会输出不同的结果呢?
是因为Integer类的内部做了缓存处理,在Integer内部有一个IntegerCache的静态内部类,该内部类中会缓存-128到127的整数。当用一个int类型的变量给Integer时,会使用自动装箱的程序。

public final class Integer extends Number implements 
Comparable<Integer> {
  ...
  private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];
    ...
    cache = new Integer[(high-low)+1];
    int j = low;
    for(int k = 0;k < cache.length;k ++) 
      cache[k] = new Integer(j++);
      ...
  }
  ...
  //自动装箱的程序
  public static Integer valueOf(int i) {
    if(i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i+(-IntegerCache.low)];
    return new Integer(i);
  }
  ...
}

为了进一步深入地理解Integer中的玄机,可以增加一下难度,使用synchronized关键字进一步验证。

public class ThreadA {
    static Integer integer = 8;
    public static void main(String[] args) throws InterruptedException{
        ThreadB b =new ThreadB();
        b.start();
        synchronized (integer) {
            System.out.println("deng dui xiang b wan cheng b wan 
cheng ....");
            integer.wait();
            System.out.println("b dui xiang zong he shi :" + b.total);
        }
    }
}
class ThreadB extends Thread {
    int total;
    Integer integer = 8;
    @Override
    public void run() {
        synchronized (integer) {
            for(int i = 0;i < 101;i ++) {
                total += i;
            }
            integer.notify();
            System.out.println("computing is finished");
        }
    }
}

输出结果

deng dui xiang b wan cheng b wan cheng ....
computing is finished
b dui xiang zong he shi :5050

程序中两处使用Integer类的对象作为监视器,两个Integer的对象都是分别new出来的,但是仍然可以实现两个线程的通信,所以从从此也可以判断出Integer内部是使用cache的机制。

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • 转自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帅199207阅读 8,588评论 3 93
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,726评论 0 11
  • 已经没有音信几个月了,终于鼓起勇气问了她的近况,对啊〜她挺好的,我应该开心才对。可是为什么开心不起来呢? 看文章说...
    Ttss玄阅读 265评论 0 1
  • 他叫凡哥,4 年前被他老婆踹了,因为穷。 凡哥和老婆是大学认识的。 他老婆是大学霸,长得还特别漂亮。 凡哥是超级学...
    先森猪阅读 414评论 0 0