经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结。
1.equals的本意——即在Object对象中定义的equals()方法有什么样的意义。
(此处先附上==的作用,后面仍有叙述。因为==和equals()方法的关系是很密切的,后面有我自己的看法。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true)
public boolean equals(Object obj)
其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.
public class Fish {
private int weight;
private String color;
public Fish(int weight, String color) {
this.color = color;
this.weight = weight;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class EqualsTest {
public static void main(String[] args) {
Fish f1 = new Fish(1, "blue");
Fish f2 = new Fish(1, "blue");
System.out.println(f1 == f2);
System.out.println(f1.equals(f2));
}
}
——————运行结果为——————
false
false
由此可见,equals()方法的本意为确定两个对象的引用是否相同。
2.而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
public class EqualsTest {
public static void main(String[] args) {
String s1=new String("sss");
String s2=new String("sss");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
}
}
————————运行结果为——————
false
true
由此知道,在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致
3.如果我们要自己覆盖equals()方法,让其比较内容或者有别的使用方法(当然我们一般都是用于比较内容的,但是覆盖的方法中真正的实现究竟是什么样的,谁知道呢O(∩_∩)O~)
public class Fish {
private int weight;
private String color;
public Fish(int weight, String color) {
this.color = color;
this.weight = weight;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((color == null) ? 0 : color.hashCode());
result = prime * result + weight;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Fish other = (Fish) obj;
if (color == null) {
if (other.color != null)
return false;
} else if (!color.equals(other.color))
return false;
if (weight != other.weight)
return false;
return true;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
public class EqualsTest {
public static void main(String[] args) {
Fish f1 = new Fish(1, "blue");
Fish f2 = new Fish(1, "blue");
System.out.println(f1 == f2);
System.out.println(f1.equals(f2));
}
}
——————运行结果为——————
false
true
此例子中我复写了equals()方法和hashcode()方法,使得equals()方法脱离的本意,不再是比较两个对象的引用是否相同,而是比较其内容是否相同。
以上内容为一般书上的总结,下面是我自己想到的一些东西。
我们可以知道计算机归根到底进行的只是一些二进制数的与或非运算,加法乘法运算。由此有了些基本的运算符,所有的函数本质上其实现都是使用基本运算符来实现的。而==是基本运算符中的一个,它的作用:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true
而equals()作为方法,我们可以推测知道,它其中的实现所使用的肯定是==运算符。再进一步的思考,equals()本意不正是==运算符进行对象比较时候的作用吗。那么,既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。在上面的第三个例子中,我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。
更多Java中的equals()相关文章请关注PHP中文网!

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runanywhere”哲学。1)itusesbytbytybytecebytecodethatrunsonanyjvm-platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

在Java中编写平台特定代码的原因包括访问特定操作系统功能、与特定硬件交互和优化性能。1)使用JNA或JNI访问Windows注册表;2)通过JNI与Linux特定硬件驱动程序交互;3)通过JNI使用Metal优化macOS上的游戏性能。尽管如此,编写平台特定代码会影响代码的可移植性、增加复杂性、可能带来性能开销和安全风险。

Java将通过云原生应用、多平台部署和跨语言互操作进一步提升平台独立性。1)云原生应用将使用GraalVM和Quarkus提升启动速度。2)Java将扩展到嵌入式设备、移动设备和量子计算机。3)通过GraalVM,Java将与Python、JavaScript等语言无缝集成,增强跨语言互操作性。

Java的强类型系统通过类型安全、统一的类型转换和多态性确保了平台独立性。1)类型安全在编译时进行类型检查,避免运行时错误;2)统一的类型转换规则在所有平台上一致;3)多态性和接口机制使代码在不同平台上行为一致。

JNI会破坏Java的平台独立性。1)JNI需要特定平台的本地库,2)本地代码需在目标平台编译和链接,3)不同版本的操作系统或JVM可能需要不同的本地库版本,4)本地代码可能引入安全漏洞或导致程序崩溃。

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器