找回密码
 立即注册
首页 业界区 安全 1.Java SDK源码分析系列笔记-Integer

1.Java SDK源码分析系列笔记-Integer

热琢 2025-6-28 11:11:52
目录

  • 1. 使用
  • 2. 原理分析

    • 2.1. 构造方法
    • 2.2. valueOf方法

      • 2.2.1. 范围正在-128-127的从缓存中取
      • 2.2.2. 解释Integer.valueOf(1)==Integer.valueOf(1)
      • 2.2.3. 解释(Integer val1 = 1) == (Integer val2 = 1)
      • 2.2.4. 解释(Integer val1 = 128) != (Integer val2 = 128)



1. 使用
  1. public class IntegerTest
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         Integer val = new Integer(1);
  6.         Integer val2 = new Integer(1);
  7.         System.out.println(val == val2);//false
  8.         Integer val3 = 1;
  9.         Integer val4 = 1;
  10.         System.out.println(val3 == val4);//true
  11.         Integer val5 = Integer.valueOf(1);
  12.         Integer val6 = Integer.valueOf(1);
  13.         System.out.println(val5 == val6);//true
  14.         System.out.println(val3 == val5);//true
  15.     }
  16. }
复制代码
2. 原理分析

2.1. 构造方法
  1. //final表示Integer不能被继承。Comparable表示可以比较
  2. public final class Integer extends Number implements Comparable<Integer>
  3.     private final int value;//底层使用int类型,且使用final
  4.     public Integer(int value) {
  5.         this.value = value;//普通的对属性赋值
  6.     }
  7. }
复制代码
Integer是不可变的,所谓的不可变是指:

  • 类使用final修饰
  • 内部属性value使用final修饰
  • 没有对外提供修改内部属性value的方法
2.2. valueOf方法
  1. public static Integer valueOf(String s) throws NumberFormatException {
  2.     return Integer.valueOf(parseInt(s, 10));
  3. }
  4. public static Integer valueOf(int i) {
  5.         //-128-127直接返回缓存中的数字
  6.     if (i >= IntegerCache.low && i <= IntegerCache.high)
  7.             //计算数组下标
  8.         return IntegerCache.cache[i + (-IntegerCache.low)];
  9.     //否则创建对象
  10.     return new Integer(i);
  11. }
复制代码
2.2.2. 解释Integer.valueOf(1)==Integer.valueOf(1)

如下面使用所输出的:
  1. private static class IntegerCache {
  2.     //缓存的最小数字-128
  3.     static final int low = -128;
  4.     //缓存的最大数字需要计算
  5.     static final int high;
  6.         //最常用的数字缓存在Integer数组中
  7.     static final Integer cache[];
  8.     static {
  9.         // high value may be configured by property
  10.         //最大数字默认127
  11.         int h = 127;
  12.         //从环境变量中读取java.lang.Integer.IntegerCache.high
  13.         String integerCacheHighPropValue =
  14.             sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
  15.         if (integerCacheHighPropValue != null) {
  16.             try {
  17.                 int i = parseInt(integerCacheHighPropValue);
  18.                 //取两者中的最大者作为最大数字
  19.                 i = Math.max(i, 127);
  20.                 // Maximum array size is Integer.MAX_VALUE
  21.                 h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
  22.             } catch( NumberFormatException nfe) {
  23.                 // If the property cannot be parsed into an int, ignore it.
  24.             }
  25.         }
  26.         high = h;
  27.                 //创建缓存数组
  28.         cache = new Integer[(high - low) + 1];
  29.         //把low-high之间的数字全部放入缓存数组中
  30.         int j = low;
  31.         for(int k = 0; k < cache.length; k++)
  32.             cache[k] = new Integer(j++);
  33.         // range [-128, 127] must be interned (JLS7 5.1.7)
  34.         assert IntegerCache.high >= 127;
  35.     }
  36.     private IntegerCache() {}
  37. }
复制代码
Integer.valueOf(1) == Integer.valueOf(1)是true,原因很简单,因为加载Integer类的时候会把-128-127丢进IntegerCache中缓存,当调用Integer.valueOf的实现中会判断-128-127的时候会从这个缓存中取,没有在创建。
因此Integer.valueOf(1)返回的是同一个对象
2.2.3. 解释(Integer val1 = 1) == (Integer val2 = 1)

如下面的这段代码:
  1. Integer val5 = Integer.valueOf(1);
  2. Integer val6 = Integer.valueOf(1);
  3. System.out.println(val5 == val6);//true
复制代码
使用Idea运行后,使用Show ByteCode插件查看字节码
1.png

结果如下:
2.png

可以看出字节码调用的仍然是Integer.valueOf方法
2.2.4. 解释(Integer val1 = 128) != (Integer val2 = 128)

如下面的这段代码:
  1. Integer val3 = 1;
  2. Integer val4 = 1;
  3. System.out.println(val3 == val4);//true
复制代码
IntegerCache只缓存了-128-127的Integer,这里的val3和val4虽然都是128,但是他们是不同的对象,所以引用不等。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册