Java中的equals()与==的区别与用法
824
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
Java中的equals()与==的区别与用法
在Java开发中,equals()方法和==操作符常常引发混淆,主要区别在于:
- ==操作符:用于比较两个对象的内存地址是否相等。
- equals()方法:用于比较两个对象的内容是否相等。
示例分析
以下代码展示了两者的区别:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // 输出 true
System.out.println(str1 == str2); // 输出 false
例子中,虽然两个字符串的内容相同,但它们的内存地址不同。因此,使用equals()方法比较内容返回true,而使用==操作符比较地址返回false。
1. 重写equals()方法
在Java中,所有类默认继承Object类,Object类的equals()方法实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
默认情况下,equals()方法使用==操作符比较地址。如果子类不重写equals()方法,equals()和==的结果完全相同。但许多类(如String类)重写了equals()方法,以便比较内容而非地址。
特别是对于字符串对象,推荐使用如下形式创建:
String s = "Hello";
这种形式会利用字符串常量池,避免重复创建相同内容的对象,从而节省内存和提高性能。
1.1 String类的equals()方法
以下是JDK 11中String类的equals()方法实现:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1()
? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
此方法首先检查两个对象的内存地址是否相同。如果相同,直接返回true;如果不是,则进一步比较内容。对于字符串内容,方法根据编码方式(Latin1或UTF-16)调用不同的equals方法。
特别说明:字符编码
Latin1(ISO 8859-1)和UTF-16是两种字符编码方式,差别虽小,但针对不同编码的字符串有不同的比较逻辑。例如,UTF-16的equals()方法会逐字节比较两个字符串。
springboot葵花宝典
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
白皮书上线