public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
类的每个实例从本质上来说是唯一的,如Thread类的实例。
2)我们并不会用到该类的equals方法,如Random类,虽然可以比较两个Random的实例,以判断两个实例是否可以产生相同的随机数,设计者认为这样的需求用到的场合很少,因而就没有重写equals方法。
3)父类已经实现了equals方法,并且父类实现方式和子类实现方式是一样的,如大部分的Set实现的equals方法使用AbstractSet类提供的equals方法,List实现则使用AbstractList,Map实现使用AbstractMap的。
4)一个private类或package-private类,我们自己可以确保我们不会使用到它们的equals方法。
同时书也提出一般只有值类型的类才需要实现equals方法,像Date、Integer、Order(作为bean来使用)等。
另外,我们在实现equals方法是也要遵循以下几个原则:
1)自反性(reflexive):x.equals(x)==true
2)对称性(symmetric):x.equals(y)==y.equals(x)
3)传递性(transitive):若x.equals(y)==true, y.equals(z)==true,则x.equals(z)==true。
4)一致性(consistent):多次调用x.equals(y)的结果应该是一样的。
5)对任何非null实例x,x.equals(null)==false。
特 性代码:如下
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String role;
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
if(this == obj) {
return true;
}
if(!(obj instanceof Customer)) {
return false;
}
Customer other = (Customer)obj;
return (ObjectUtils.equals(id, other.id) &&
ObjectUtils.equals(name, other.name) &&
ObjectUtils.equals(role, other.role));
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
其中ObjectUtils类的代码如下:
public class ObjectUtils {
/**
* Compare whether the left and right is equals
* It has already considered the null case
*
* @param left
* @param right
* @return
*/
public static boolean equals(Object left, Object right) {
if(left == null && right == null) {
return true;
}
if(left == null && right != null) {
return false;
}
return left.equals(right);
}
}
在《Effective
Java》这本书中,貌似equals实现方法前面没有null、this的判断,因为instanceof可以解决null的问题,而
super.equals()方法可以解决this问题,但是我还是喜欢把它们都分出来,这样写的更加明了一些。另外,事实上,这里的实现并没有遵循对称
性的原则,因为如果A是B的子类,而这个equals方法在A类中,那么AInstance.equals(BInstance)==false,若B也
实现了类似的equals方法,则BInstance.equals(AInstance)==true(当A没有新的比较字段时,或许这个时候A根本就
不需要实现equals方法,如本文开头列出的第三条),这是因为AInstance instanceof BInstance ==
true,反之则为false。不过由于这种情况并不常见,所以就不去care了。:)
分享到:
相关推荐
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...
`Object`类是所有Java类的最终超类,包含所有对象共有的属性和方法,如`equals()`比较两个对象是否相等,`hashCode()`返回对象的哈希码,`toString()`返回对象的字符串表示。 通过理解并熟练使用`java.lang`包中的...
2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....
`Object`类是所有Java类的根,它定义了所有对象共有的行为,如`equals()`、`hashCode()`和`toString()`方法。`System`类提供了系统级的服务,如标准输入、输出流,以及全局变量`out`、`err`和`in`。 `Thread`类是多...
解决 ERROR s.d.s.web.plugins.DocumentationPluginsBootstrapper:98 - Unable to scan documentation context default ... at springfox.documentation.schema.Example.equals(Example.java:131)
《java_lang包详解》 Java语言的核心库之一就是java.lang包,它包含了Java程序中最基础、最核心的类和接口。由于这个包是自动导入到每个Java程序中的,所以理解和掌握其中的类和接口对于编写Java代码至关重要。下面...
2. **String类**:在`java.lang`包中,`String`类是最常用的数据类型之一,代表不可变的字符序列。它提供了许多操作字符串的方法,如`substring()`(提取子字符串)、`indexOf()`(查找子串首次出现的位置)和`...
if (str.equals("Test")) { // 这里将抛出java.lang.NullPointerException异常 // 这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。 } 解决方案:在使用对象之前,需要判断其是否为空。 ...
Apache Commons Lang 是一个由 Apache 软件基金会开发的 Java 类库,它提供了一系列实用工具类,用于增强 JDK 内置的 String 类的功能。在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以...
`Object`类是所有Java类的父类,包含了所有对象通用的方法,如`equals()`、`hashCode()`和`toString()`。`String`类是不可变的字符序列,广泛用于文本处理。`Integer`和`Boolean`是Java的基本数据类型包装类,允许...
String.equals() 是 Java 中 String 类的方法,用于比较字符串的内容是否相等。该方法会比较字符串的每个字符是否相同,包括大小写。如果两个字符串的内容相同,那么 equals() 方法将返回 true,否则返回 false。 =...
Java中的Object.equals和String.equals是两个不同的equals方法,它们之间的区别是非常重要的,理解这两个方法的区别对于我们编写高质量的Java代码非常重要。 首先,让我们来了解一下Java中的存储空间。Java中的存储...
【java.lang包】是Java标准库中最基础的包,它包含了一些核心的类,比如`Math`, `Class`, `Object`等,这些类是所有Java程序的基础。在学习这个包时,首先要理解的是,`java.lang`包是自动导入到每一个Java程序中的...
6. **比较与相等**:`StringUtils.equals忽视大小写(String str1, String str2)`可以在不考虑大小写的情况下比较两个字符串是否相等,避免了因大小写引起的误判。 7. **删除与填充**:`StringUtils....
【java-lang包详解】 在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地...
Java源码阅读之java.lang.Object Java中的Object类是所有类的父类,任何类都默认继承Object。Object类提供了多种方法,以下是其中一些重要的方法: 1. clone方法:保护方法,实现对象的浅复制,只有实现了...
Java中的`java.lang.Void`类是一个特殊的类,它在Java标准库中扮演着重要的角色,尤其是在处理泛型和反射时。`Void`类是不可实例化的,它的主要目的是作为`void`关键字的一个对象表示,而`void`在Java中通常用于表示...
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
Java.lang.String类是Java语言中的一种基本数据类型,该类的定义、字段属性、构造方法、equals方法、hashCode方法、charAt方法、compareTo方法、concat方法、indexOf方法、replace方法、split方法、substring方法、...