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);
  }
}

为什么在f1f2中同时使用'a'时结果为假? 为什么 f2.Set(f1.Get()); 未注释时结果为真? 请解释我哪里出错了。

.isEquals() 方法中,您将包装器对象与 == 运算符进行比较,如果对象引用不在 Integer 内部缓存中,则比较对象引用。

由于321Integer缓存,==运算符returnsfalse,因为引用不同(f1指的是与f2)不同的内存地址。

当您 显式 将引用设置为相等时(使用 f2.Set(f1.Get())),程序输出 true.[=25= 也就不足为奇了]

如果您将 a 设置为 -128127 之间的值,程序将输出 true.

aauto boxedInteger 而对于 int a = 321; 你将有两个不同的 Objects 对于 f1f2.

例如

Integer a1 = new Integer(321);
Integer a2 = new Integer(321);

而对于 a1 == a2 你将有 false 因为 == 比较参考而不是价值 你应该使用 equals 方法来检查你的 isEqual 中的价值方法。