题目

知道字节码吗,字节码都有哪些?比较下面代码x == y都经过了哪些过程

1
2
3
4
5
6
7
public class interview {
public static void main(String[] args) {
Integer x = 5;
int y = 5;
System.out.println(x == y);
}
}

正确答案:

1
true

通过idea的工具jClasslib插件查看main方法的code,发现:

image-20210913142135732

  1. 然后我们去Integer中查看Valueof和intValue方法

valueOf

1
2
3
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
1
2
3
4
5
6
7
public static Integer valueOf(int i) {
// 这里调用了
if (i >= IntegerCache.low && i <= IntegerCache.high)
// 如果在缓存里面,这从这个缓存数组中取出值(这个值是integer对象)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Integer的内部类
private static class IntegerCache {
// 定义最小值为-128
static final int low = -128;
static final int high;
// 定义一个缓存数组
static final Integer cache[];

static {
// high value may be configured by property
// high 的默认值为127
int h = 127;
// 从vm中拿到high的数值,这个数值可以通过vm参数配置
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
// 如果拿到了这个值,说明进行了vm配置
if (integerCacheHighPropValue != null) {
try {
// 把这个值转化为int类型
int i = parseInt(integerCacheHighPropValue);
// 这个值得最小值要大于等于127
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
// 这个值得最大值是2147483518,也就是整个cache数组的长度为Integer的最大值
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
// 赋值
high = h;
// 定义cache数组的长度
cache = new Integer[(high - low) + 1];
int j = low;
// 为这个cache填充值,这些都是Integer对象
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
// 断言这个值得最大值大于等于127
assert IntegerCache.high >= 127;
}

// 私有化构造方法,jvm级别单例
private IntegerCache() {}
}

intValue

1
2
3
4
// 返回了int类型的一个值value
public int intValue() {
return value;
}
1
2
3
4
5
6
private final int value;

// 这个vlaue在创建Integer对象的时候
public Integer(int value) {
this.value = value;
}
1
2
3
4
5
6
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
// 在一步调用了new Integer()的方法
return new Integer(i);
}

总结

  1. 在创建一个integer的对象的时候,回调用valueOf方法
    1. valueOf方法回去调用IntegerCache中的一个值
      1. IntegerCache
        1. 如果没被初始化,则优先从jvm参数中读取值进行初始化
        2. 如果初始化过了则直接拿到值,直接就返回了
      2. 然后调用new Integer(i)方法
  2. 然后把这个对象放入栈中的局部变量表
  3. 然后判断的时候,调用intValue方法,然后int类型的值
  4. 两个int类型的值进行判断