美文网首页Java学习笔记Java 杂谈
实验楼第10期java楼赛——理解常量池

实验楼第10期java楼赛——理解常量池

作者: chenxuxu | 来源:发表于2017-06-27 21:58 被阅读143次

题目

小楼同学最近很郁闷,刚刚上线的程序出了 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 满足介绍部分的所有需求。

提示语

  1. 注意重写 equals 方法;
  2. 注意需要使用常量池的参数边界;
  3. 验证包括但不限于以上示例;

知识点

  1. 常量池;
  2. 重写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);
    }
}

相关文章

网友评论

    本文标题:实验楼第10期java楼赛——理解常量池

    本文链接:https://www.haomeiwen.com/subject/yqcycxtx.html