1. 装箱拆箱
1.1 案例介绍
java会将int
和Integer
这样的类型进行自动装箱拆箱操作. 对于小于128的数值会直接使用静态变量IntegerCache.cache
中的Integer
. 对于大于等于128的数值会使用Integer
对其进行包装.
public static Permission get(Integer value) {
for (Permission permission : Permission.values()) {
if (permission.getCode() == value) {
return permission;
}
}
return null;
}
@Test
void get() {
Permission permission = Permission.get(128);
assertEquals(Permission.PERMISSION128, permission);
}
使用上述的代码片段将会报错, 此时permission
的值将会是null.
1.2 原理分析
java会在编译`.java`文件时, 对int类型的数值使用Integer.valueOf()
方法进行装箱.
此时使用`==`进行判断时, 实际上是两个不同地址的Integer变量进行比较, 所以一定报错.
1.3 解决办法
-
将
get()
方法中的Integer
类型改为int
类型.Integer
类型的变量与int
类型的变量进行比较时, 会自动使用Integer.intValue()
进行拆箱.此时实际上是两个int类型的值进行比较.
-
使用
equals()
方法进行值比较
1.4 补充思考
为何此时为true