下面的代码返回除-128至127之间以外的所有值的false。有什么特别的原因吗?我知道我必须使用equals,因为peek()返回对对象的引用,但我很想知道为什么它只适用于上述范围的值。
public boolean test(int x) {
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
s1.push(x);
s2.push(x);
return (s1.peek() == s2.peek());
}发布于 2015-07-01 08:22:42
这有两个原因:
当您自动装箱时,s1.push(x) (某些int x )将转换为s1.push(Integer.valueOf(x))。由于这是一个缓存的值,因此对这些值中的任何一个都重用相同的实例。
根据JRE的实现,Integer也可能有更大的缓存--但不要依赖它;)
发布于 2015-07-01 08:24:39
在线上
s1.push(x);
s2.push(x);原语int x被自动装箱到Integer实例中,使用Integer.valueOf(x) (java本身就是这样做的)。该方法使用缓存将Integer实例存储在-127到128之间,这意味着对于所有其他int值,将在上述两行代码中创建一个新实例,从而使==比较返回false。
https://stackoverflow.com/questions/31156067
复制相似问题