Java堆栈peek()行为
以下代码返回除-128和127之间的所有值之外的Java堆栈peek()行为,java,stack,peek,Java,Stack,Peek,以下代码返回除-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
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());
}
公共布尔测试(int x){
堆栈s1=新堆栈();
堆栈s2=新堆栈();
s1.推(x);
s2.推(x);
返回(s1.peek()==s2.peek());
}
原因有两个:
- 自动装箱李>
- 事实是
s1.push(x)
对于某些intx
将转换为s1.push(Integer.valueOf(x))
。因为这是一个缓存的值,所以对于这些值中的任何一个,都会重用同一个实例
根据JRE的实现,
Integer
的缓存也可能比JRE的缓存大——但不要依赖于此;) 这有两个原因:
- 自动装箱李>
- 事实是
s1.push(x)
对于某些intx
将转换为s1.push(Integer.valueOf(x))
。因为这是一个缓存的值,所以对于这些值中的任何一个,都会重用同一个实例
根据JRE的实现,Integer
的缓存也可能比JRE的缓存大——但不要依赖于此;) 在队列中
s1.push(x);
s2.push(x);
原语intx
使用自动装箱到Integer
实例中(java自己做这件事)。该方法使用缓存来存储-127到128范围内的整数
实例,这意味着对于所有其他int
值,将在上面两行代码中创建一个新实例,从而导致=
比较返回false。
s1.push(x);
s2.push(x);
原语
intx
使用自动装箱到Integer
实例中(java自己做这件事)。该方法使用缓存来存储-127到128范围内的Integer
实例,这意味着对于所有其他int
值,将在上述两行代码中创建一个新实例,导致比较返回false。Integer
缓存介于-128和127之间的值以提高性能。请参阅此Integer
缓存介于-128和127之间的值以提高性能。请参阅此