美文网首页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