首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Stack peek()行为

Java Stack peek()行为
EN

Stack Overflow用户
提问于 2015-07-01 08:19:06
回答 2查看 1.1K关注 0票数 1

下面的代码返回除-128至127之间以外的所有值的false。有什么特别的原因吗?我知道我必须使用equals,因为peek()返回对对象的引用,但我很想知道为什么它只适用于上述范围的值。

代码语言:javascript
复制
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());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-01 08:22:42

这有两个原因:

  • 自动拳击;
  • 事实是 implementation, as per the documentation, has an internal cache of at least all values between, precisely, -128 and 127

当您自动装箱时,s1.push(x) (某些int x )将转换为s1.push(Integer.valueOf(x))。由于这是一个缓存的值,因此对这些值中的任何一个都重用相同的实例。

根据JRE的实现,Integer也可能有更大的缓存--但不要依赖它;)

票数 4
EN

Stack Overflow用户

发布于 2015-07-01 08:24:39

在线上

代码语言:javascript
复制
s1.push(x);
s2.push(x);

原语int x被自动装箱到Integer实例中,使用Integer.valueOf(x) (java本身就是这样做的)。该方法使用缓存将Integer实例存储在-127到128之间,这意味着对于所有其他int值,将在上述两行代码中创建一个新实例,从而使==比较返回false。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31156067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档