題目
小樓同學最近很郁悶些楣,剛剛上線的程序出了 Bug沪饺,因為對 Integer 類型理解的不到位怜姿,判斷 Integer 對象相等使用了==,結(jié)果測試的時候沒問題砌创,上線后出現(xiàn)了錯誤虏缸,于是他深入研究了一下 Integer 類鲫懒,并打算自己模擬一個 Integer 類。
補全 IntegerExt 類的靜態(tài)方法 <code>getInstance(int i)</code>刽辙,對參數(shù)在 -128 (包含)到 127 (包含)之間的實例使用常量池窥岩,范圍之外的不使用。
// 事例
IntegerExt i1 = IntegerExt.getInstance(1);
IntegerExt i2 = IntegerExt.getInstance(1);
IntegerExt i3 = IntegerExt.getInstance(1111);
IntegerExt i4 = IntegerExt.getInstance(1111);
// 正確結(jié)果
i1 == i2 為 true
i1.equals(i2) 為 true
i3 == i4 為 false
i3.equals(i4) 為 true
目標
最終實現(xiàn)的 IntegerExt 滿足介紹部分的所有需求扫倡。
提示語
- 注意重寫 equals 方法谦秧;
- 注意需要使用常量池的參數(shù)邊界;
- 驗證包括但不限于以上示例撵溃;
知識點
- 常量池疚鲤;
- 重寫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);
}
}