参考:《新版Java开发手册》提到的三目运算符的空指针问题到底是个怎么回事?
Integer a = null;
boolean b1 = a == 1;// 报NPE, 原因:a要拆箱,即调用a.intValue()与1比较,这时a为null报NPE
boolean b2 = a == (Object) 1;// false, 把1装箱,即从int变成Integer,a==(Object)1 ==> null==(Integer)1,不会报NPE
boolean b3 = (Object) a == (Object) 1;// false,跟上面的例子一样,a可以不加(Object)
/*
* Objects.equals的实现:
* public static boolean equals(Object a, Object b) {
* return (a == b) || (a != null && a.equals(b));
* }
* 在进入该方法内时,1已经被装箱,则避免了NPE,
* 该方法还会调用equals比较,当需要去比较int和Integer或类似数据是否相等时,推荐使用该方法
*/
boolean b4 = Objects.equals(a, 1);
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);