Java 代码中的奇怪逻辑错误
Strange Logical Error in Java Code
interface New<T> {
boolean func(T n, T v);
}
class MyFunc<T>{
T val;
MyFunc(T val){
this.val = val;
}
void Set(T val){
this.val = val;
}
T Get(){
return val;
}
boolean isEqual(MyFunc<T> o){
if(val == o.val) return true;
return false;
}
public class Main {
static <T> boolean check(New<T> n , T a, T b){
return n.func(a,b);
}
public static void main(String args[]){
int a = 321;
MyFunc<Integer> f1 = new MyFunc<Integer>(a);
MyFunc<Integer> f2 = new MyFunc<Integer>(a);
boolean result;
//f2.Set(f1.Get()); //if i uncomment this line result become true
System.out.println(f1.val + " " + f2.val);
System.out.println();
result = check(MyFunc::isEqual, f1, f2);
System.out.println("f1 isEqual to f2: " + result);
}
}
为什么在f1
和f2
中同时使用'a'
时结果为假?
为什么 f2.Set(f1.Get());
未注释时结果为真?
请解释我哪里出错了。
在 .isEquals()
方法中,您将包装器对象与 ==
运算符进行比较,如果对象引用不在 Integer
内部缓存中,则比较对象引用。
由于321
出Integer
缓存,==
运算符returnsfalse
,因为引用不同(f1
指的是与f2
)不同的内存地址。
当您 显式 将引用设置为相等时(使用 f2.Set(f1.Get())
),程序输出 true
.[=25= 也就不足为奇了]
如果您将 a
设置为 -128
和 127
之间的值,程序将输出 true
.
a
是 auto boxed 到 Integer
而对于 int a = 321;
你将有两个不同的 Objects
对于 f1
和 f2
.
例如
Integer a1 = new Integer(321);
Integer a2 = new Integer(321);
而对于 a1 == a2
你将有 false
因为 ==
比较参考而不是价值 你应该使用 equals
方法来检查你的 isEqual
中的价值方法。
interface New<T> {
boolean func(T n, T v);
}
class MyFunc<T>{
T val;
MyFunc(T val){
this.val = val;
}
void Set(T val){
this.val = val;
}
T Get(){
return val;
}
boolean isEqual(MyFunc<T> o){
if(val == o.val) return true;
return false;
}
public class Main {
static <T> boolean check(New<T> n , T a, T b){
return n.func(a,b);
}
public static void main(String args[]){
int a = 321;
MyFunc<Integer> f1 = new MyFunc<Integer>(a);
MyFunc<Integer> f2 = new MyFunc<Integer>(a);
boolean result;
//f2.Set(f1.Get()); //if i uncomment this line result become true
System.out.println(f1.val + " " + f2.val);
System.out.println();
result = check(MyFunc::isEqual, f1, f2);
System.out.println("f1 isEqual to f2: " + result);
}
}
为什么在f1
和f2
中同时使用'a'
时结果为假?
为什么 f2.Set(f1.Get());
未注释时结果为真?
请解释我哪里出错了。
在 .isEquals()
方法中,您将包装器对象与 ==
运算符进行比较,如果对象引用不在 Integer
内部缓存中,则比较对象引用。
由于321
出Integer
缓存,==
运算符returnsfalse
,因为引用不同(f1
指的是与f2
)不同的内存地址。
当您 显式 将引用设置为相等时(使用 f2.Set(f1.Get())
),程序输出 true
.[=25= 也就不足为奇了]
如果您将 a
设置为 -128
和 127
之间的值,程序将输出 true
.
a
是 auto boxed 到 Integer
而对于 int a = 321;
你将有两个不同的 Objects
对于 f1
和 f2
.
例如
Integer a1 = new Integer(321);
Integer a2 = new Integer(321);
而对于 a1 == a2
你将有 false
因为 ==
比较参考而不是价值 你应该使用 equals
方法来检查你的 isEqual
中的价值方法。