Java空检查为什么使用==而不是.equals()
在Java中,我被告知在执行空检查时应该使用==而不是.equals()。原因是什么?如果在Java空检查为什么使用==而不是.equals(),java,null,Java,Null,在Java中,我被告知在执行空检查时应该使用==而不是.equals()。原因是什么?如果在null上调用.equals(),您将得到NullPointerException 所以,在调用方法之前检查空值总是可取的,不管它在哪里应用 if(str!=null && str.equals("hi")){ //str contains hi } 另请参见 如果对象变量为null,则不能对其调用equals()方法,因此对象引用检查null是正确的 foo.equals(n
null
上调用.equals()
,您将得到NullPointerException
所以,在调用方法之前检查空值总是可取的,不管它在哪里应用
if(str!=null && str.equals("hi")){
//str contains hi
}
另请参见
foo.equals(null)
如果foo为null会发生什么
你会得到一个NullPointerException。它们是两个完全不同的东西<代码>=比较变量包含的对象引用(如果有)
.equals()
检查两个对象是否根据其相等含义的约定相等。两个不同的对象实例完全有可能根据它们的约定“相等”。还有一个小细节,因为equals
是一个方法,如果您尝试在null
引用上调用它,您将得到NullPointerException
例如:
class Foo {
private int data;
Foo(int d) {
this.data = d;
}
@Override
public boolean equals(Object other) {
if (other == null || other.getClass() != this.getClass()) {
return false;
}
return ((Foo)other).data == this.data;
}
/* In a real class, you'd override `hashCode` here as well */
}
Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances
System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition
Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it
System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything
System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null
如果尝试对空对象引用调用equals,则会引发空指针异常。因为equal是从对象类派生的函数,所以此函数比较类的项。如果将其与null一起使用,它将返回false,因为类内容不为null。此外==将引用与对象进行比较 根据默认方法实现使用什么并不重要:
public boolean equals(Object object) {
return this == object;
}
但是您不能确定自定义类中的
是否等于。在Java 0中或null是简单的类型,而不是对象
equals()方法不是为简单类型生成的。简单类型可以匹配==。您总是可以这样做的
if (str == null || str.equals(null))
这将首先检查对象引用,然后检查对象本身,前提是引用不为null。如果使用=>.equals方法
if(obj.equals(null))
// Which mean null.equals(null) when obj will be null.
当您的obj为空时,它将抛出空点异常
所以我们应该使用==
if(obj == null)
它将比较引用。下面是一个示例,其中str!=null
但是str.equals(null)
当使用org.json
JSONObject jsonObj = new JSONObject("{field :null}");
Object field = jsonObj.get("field");
System.out.println(field != null); // => true
System.out.println( field.equals(null)); //=> true
System.out.println( field.getClass()); // => org.json.JSONObject$Null
编辑:
下面是课堂:
除了公认的答案():
由于Java 1.7,如果要比较两个可能为空的对象,我建议使用以下函数:
Objects.equals(onePossibleNull, twoPossibleNull)
java.util.Objects
此类由用于在上操作的静态实用程序方法组成
物体。这些实用程序包括空安全或空容忍方法
用于计算对象的哈希代码,返回对象的字符串
对象,并比较两个对象
自:
1.7
因此,我从不感到困惑,并避免使用此解决方案时出现问题:
if(str.trim().length() <=0 ) {
// is null !
}
if(str.trim().length()我昨晚遇到了这个案子。
我只确定:
null的equals()方法不存在
因此,如果您没有调用一个不存在的方法
-->>>这就是为什么我们使用=检查null
Object.equals是空安全的,但是请注意,如果两个对象为空,Object.equals将返回true,因此在使用Object.equals进行比较之前,请确保检查要比较的对象不是空的(或包含空值)
String firstname = null;
String lastname = null;
if(Objects.equals(firstname, lastname)){
System.out.println("equal!");
} else {
System.out.println("not equal!");
}
上面的示例片段将返回相等的值!您的代码违反了德米特定律。这就是为什么最好重构设计本身。作为一种解决方法,您可以使用可选的
obj = Optional.ofNullable(object1)
.map(o -> o.getIdObject11())
.map(o -> o.getIdObject111())
.map(o -> o.getDescription())
.orElse("")
上面是检查对象的层次结构,所以只需使用
Optional.ofNullable(object1)
如果只有一个对象要检查
希望这会有所帮助!!最简单的方法是尝试使用equals()
进行空值检查,然后查看。当您尝试时,会立即看到明显的结果。顺便说一句,使用关键字“java空值检查”(不带引号)的谷歌搜索给我一个最热门的答案,它的信息与这里的答案相同。你的例子通常更好地写成if(“hi”.equals(str))
@user368186:问题不在于equals方法是否包含null检查。如果你的对象引用为null,那么调用someObject.equals(null)
将引发一个NullPointerException
而无需输入equals方法。@ColinD Agree在此处演示始终建议不惜一切代价避免null,因此您根本不需要null检查;)。您可以始终使用对象。equals(a,b)
它不会引发NullPointerException,但它仍然依赖于“equal”“a”和“b”的方法是否意味着公共int数据
?@Xepoch:不,我通常不创建公共字段(尽管这两种方法对本例都不重要)。为什么?@T.J.克劳德“他们是两个完全不同的东西……”一般来说是的。但是,如果我的理解是正确的,那么两者的默认实现是相同的。查看源代码,.equals()基本上执行==检查@Ayush-这是对象中的默认值,是的。不过,它被大量JDK类覆盖。但重点不是实现,而是语义。(旁注:JDK7已经过时了。)@RogerWang-问得好!答案是null
不是一个对象,它是一个对象引用(一个空白引用)。这是我们可以在代码中直接编写的唯一对象引用。所以对象a=null;对象b=null
表示a==b
为真,因为两个变量都包含相同的对象引用(单个通用的空白引用)。向上投票选择最有用的实际答案,而不是明显的“NullPointerException将返回”herp derp answer.if(str==null | | str.equals(null)| | str equals(“”)我使用了你的答案并添加了一个空字符串的检查!如果我没弄错的话,null和“”不是一回事。它不是完全重新编译吗
Optional.ofNullable(object1)