`
wm920
  • 浏览: 80564 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java.lang.String下equals方法的小结.

 
阅读更多
 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.lang包介绍

    在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    java.lang包

    `Object`类是所有Java类的最终超类,包含所有对象共有的属性和方法,如`equals()`比较两个对象是否相等,`hashCode()`返回对象的哈希码,`toString()`返回对象的字符串表示。 通过理解并熟练使用`java.lang`包中的...

    2.javaequals()方法.zip

    2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....

    java.lang研究

    `Object`类是所有Java类的根,它定义了所有对象共有的行为,如`equals()`、`hashCode()`和`toString()`方法。`System`类提供了系统级的服务,如标准输入、输出流,以及全局变量`out`、`err`和`in`。 `Thread`类是多...

    springfox-core-3.0.1-SNAPSHOT.jar

    解决 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包详解.pdf

    《java_lang包详解》 Java语言的核心库之一就是java.lang包,它包含了Java程序中最基础、最核心的类和接口。由于这个包是自动导入到每个Java程序中的,所以理解和掌握其中的类和接口对于编写Java代码至关重要。下面...

    北大青鸟Java.lang.rar经典例子

    2. **String类**:在`java.lang`包中,`String`类是最常用的数据类型之一,代表不可变的字符序列。它提供了许多操作字符串的方法,如`substring()`(提取子字符串)、`indexOf()`(查找子串首次出现的位置)和`...

    java.lang.NullPointerException出现的几种原因及解决方案

    if (str.equals("Test")) { // 这里将抛出java.lang.NullPointerException异常 // 这里的代码将不会被触发,因为会抛出java.lang.NullPointerException异常。 } 解决方案:在使用对象之前,需要判断其是否为空。 ...

    org.apache.commons.lang3.StringUtils.jar.rar

    Apache Commons Lang 是一个由 Apache 软件基金会开发的 Java 类库,它提供了一系列实用工具类,用于增强 JDK 内置的 String 类的功能。在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以...

    JBuider第六章:Java.lang包.rar

    `Object`类是所有Java类的父类,包含了所有对象通用的方法,如`equals()`、`hashCode()`和`toString()`。`String`类是不可变的字符序列,广泛用于文本处理。`Integer`和`Boolean`是Java的基本数据类型包装类,允许...

    java 中String.equals和==的比较

    String.equals() 是 Java 中 String 类的方法,用于比较字符串的内容是否相等。该方法会比较字符串的每个字符是否相同,包括大小写。如果两个字符串的内容相同,那么 equals() 方法将返回 true,否则返回 false。 =...

    Java中Object.equals和String.equals的区别详解

    Java中的Object.equals和String.equals是两个不同的equals方法,它们之间的区别是非常重要的,理解这两个方法的区别对于我们编写高质量的Java代码非常重要。 首先,让我们来了解一下Java中的存储空间。Java中的存储...

    北大青鸟JAVA培训教程-java.lang包

    【java.lang包】是Java标准库中最基础的包,它包含了一些核心的类,比如`Math`, `Class`, `Object`等,这些类是所有Java程序的基础。在学习这个包时,首先要理解的是,`java.lang`包是自动导入到每一个Java程序中的...

    commons-lang-StringUtils.zip

    6. **比较与相等**:`StringUtils.equals忽视大小写(String str1, String str2)`可以在不考虑大小写的情况下比较两个字符串是否相等,避免了因大小写引起的误判。 7. **删除与填充**:`StringUtils....

    java-lang包详解

    【java-lang包详解】 在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地...

    java源码阅读之java.lang.Object

    Java源码阅读之java.lang.Object Java中的Object类是所有类的父类,任何类都默认继承Object。Object类提供了多种方法,以下是其中一些重要的方法: 1. clone方法:保护方法,实现对象的浅复制,只有实现了...

    java.lang.Void类的解析与使用详解

    Java中的`java.lang.Void`类是一个特殊的类,它在Java标准库中扮演着重要的角色,尤其是在处理泛型和反射时。`Void`类是不可实例化的,它的主要目的是作为`void`关键字的一个对象表示,而`void`在Java中通常用于表示...

    Java基础复习(内附String中equals与==区别的分析)

    本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...

    Java源码解析——看优秀源码最能使人进步

    Java.lang.String类是Java语言中的一种基本数据类型,该类的定义、字段属性、构造方法、equals方法、hashCode方法、charAt方法、compareTo方法、concat方法、indexOf方法、replace方法、split方法、substring方法、...

Global site tag (gtag.js) - Google Analytics