题目
小楼同学最近很郁闷,刚刚上线的程序出了 Bug,因为对 Integer 类型理解的不到位,判断 Integer 对象相等使用了==,结果测试的时候没问题,上线后出现了错误,于是他深入研究了一下 Integer 类,并打算自己模拟一个 Integer 类。
补全 IntegerExt 类的静态方法 <code>getInstance(int i)</code>,对参数在 -128 (包含)到 127 (包含)之间的实例使用常量池,范围之外的不使用。
// 事例
IntegerExt i1 = IntegerExt.getInstance(1);
IntegerExt i2 = IntegerExt.getInstance(1);
IntegerExt i3 = IntegerExt.getInstance(1111);
IntegerExt i4 = IntegerExt.getInstance(1111);
// 正确结果
i1 == i2 为 true
i1.equals(i2) 为 true
i3 == i4 为 false
i3.equals(i4) 为 true
目标
最终实现的 IntegerExt 满足介绍部分的所有需求。
提示语
- 注意重写 equals 方法;
- 注意需要使用常量池的参数边界;
- 验证包括但不限于以上示例;
知识点
- 常量池;
- 重写equals方法;
题目代码
public class IntegerExt {
private int i;
private IntegerExt(int i){
this.i = i;
}
public int toIntValue(){
return i;
}
public static IntegerExt getInstance(int i){
return null;
}
}
解题思路
使用map作为常量池的容器,key值使用String(因为题目模拟Integer,使用Integer感觉有点奇怪...),这道题比较简单,不要忽略了equals方法就行了。
我的答案代码
import java.util.*;
public class IntegerExt {
private int i;
private static Map<String, IntegerExt> list = new HashMap<>(256);
private IntegerExt(int i){
this.i = i;
}
public int toIntValue(){
return i;
}
public static IntegerExt getInstance(int i){
String str = String.valueOf(i);
if (list.containsKey(str)) {
return list.get(str);
}
IntegerExt result = new IntegerExt(i);
if (i >= -128 && i <= 127) {
list.put(str, result);
}
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof IntegerExt) {
return this.i == ((IntegerExt)obj).toIntValue();
}
return super.equals(obj);
}
}
网友评论