Integer 解析问题求解答

宅男愚智 2016-11-13 02:29:50
这两天在看关于Java的面试题,看到关于Integer 的小题目,我自己动手写了一下,发现了一些问题(初学者)
问题一

源码:
> public static void main(String[] args) {
Integer f1 =100, f2 = 100, f3 = 1000, f4 = 1000;
System.out.println(f1 == f2);
System.out.println(f1 == f2);
}
正确的返回应该是:

true
false
而我的返回结果是(错误):

true
true
Integer是int的包装类,根据自动装箱/拆箱机制,两种是可以互换的。所以下面的 == 比较的不是值而是引用,通过查看Integer.java 源码发现。

调用的valueof( )

public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
valueof( )调用 IntegerCache类

> private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}
简单说数值范围在-128与127之间,数值会直接进行自动装箱/拆箱,若是超出范围,则会new 一个新Integer对象出来。所以上面的面试题中f1 == f2的结果是true,而f3 == f4的结果是false。

至于我的返回结果为什么是错误的我没有弄没有弄明白。

问题二

把问题一种的源码稍微改一下:

public static void main(String[] args) {
Integer f1 =100, f2 = 100, f3 = 1000, f4 = 1000;
System.out.println(Objects.equals(f1, f2));
System.out.println( Objects.equals(f3,f4));
}
运行结果是:

true
true
我们知道equals()类是在Object包里面,查看Object.java 可以发现:

public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
那同样,在这里Object 也是引用来,引用事也应该调用Integer.java中valueOf(int i)与IntegerCache类,为什么这里返回的是true,true?
...全文
255 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
宅男愚智 2016-11-18
  • 打赏
  • 举报
回复
引用 7 楼 Q80470101 的回复:
[quote=引用 6 楼 rockyzhang1992 的回复:] [quote=引用 5 楼 Q80470101 的回复:]

  //参阅Integer中equals方法:
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
感谢大家的帮忙,现在明白了。[/quote] 结贴[/quote] 怎么结贴,新手
家里敷泥呀 2016-11-15
  • 打赏
  • 举报
回复
引用 6 楼 rockyzhang1992 的回复:
[quote=引用 5 楼 Q80470101 的回复:]

  //参阅Integer中equals方法:
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
感谢大家的帮忙,现在明白了。[/quote] 结贴
家里敷泥呀 2016-11-14
  • 打赏
  • 举报
回复

  //参阅Integer中equals方法:
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
月明星稀灬 2016-11-14
  • 打赏
  • 举报
回复
宅男愚智 2016-11-14
  • 打赏
  • 举报
回复
引用 5 楼 Q80470101 的回复:

  //参阅Integer中equals方法:
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
感谢大家的帮忙,现在明白了。
宅男愚智 2016-11-13
  • 打赏
  • 举报
回复
问题一已经解决,是我本人不够自学导致的问题。问题二不理解equals() 在进行比较的时候,是按照Integer()类范围进行比较还是按照什么取值范围进行比较
ant_1024 2016-11-13
  • 打赏
  • 举报
回复
object的equals比较的是内存地址,而integer有它自己的常量池将数字放到了常量池中,所以会是true,true.
Hanson, 2016-11-13
  • 打赏
  • 举报
回复
??你的问题是不是写错了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧