Java 堆栈 peek() 行为
Java Stack peek() behavior
以下代码 returns false
用于除 -128 和 127 之间的所有值。这有什么特别的原因吗?我知道我必须使用 equals
因为 peek()
returns 对对象的引用,但我很想知道为什么它只适用于上述值范围。
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.push(x)
会转换为 s1.push(Integer.valueOf(x))
。因为这是一个缓存值,所以相同的实例会被重复用于这些值中的任何一个。
根据 JRE 的实现,Integer
可能 也有比它更大的缓存——但不要依赖它 ;)
行中
s1.push(x);
s2.push(x);
原始 int x
使用 Integer.valueOf(x)
自动装箱到 Integer
实例中(java 自己完成)。该方法使用缓存来存储 -127 到 128 范围内的 Integer
个实例,这意味着对于所有其他 int
值,将在上面的两行代码中创建一个新实例,结果在 ==
与 return 的比较中 false.
以下代码 returns false
用于除 -128 和 127 之间的所有值。这有什么特别的原因吗?我知道我必须使用 equals
因为 peek()
returns 对对象的引用,但我很想知道为什么它只适用于上述值范围。
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.push(x)
会转换为 s1.push(Integer.valueOf(x))
。因为这是一个缓存值,所以相同的实例会被重复用于这些值中的任何一个。
根据 JRE 的实现,Integer
可能 也有比它更大的缓存——但不要依赖它 ;)
行中
s1.push(x);
s2.push(x);
原始 int x
使用 Integer.valueOf(x)
自动装箱到 Integer
实例中(java 自己完成)。该方法使用缓存来存储 -127 到 128 范围内的 Integer
个实例,这意味着对于所有其他 int
值,将在上面的两行代码中创建一个新实例,结果在 ==
与 return 的比较中 false.