String类型equals方法讲解

 

目录(?)[+]

 

 

 

 

 

(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53868815冷血之心的博客)

 

最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法。在此,我总结下关于String类中的equals方法,以备应对以后的笔试面试。

 

String类的定义:

java.lang 
类 String

java.lang.Object
  java.lang.String
所有已实现的接口:
SerializableCharSequenceComparable<String>

 


 

public final class String
extends Objectimplements SerializableComparable<String>, CharSequence

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

例如:

     String str = "abc";
 

等效于:

     char data[] = {'a', 'b', 'c'};
     String str = new String(data);

 

 

equals方法:

先来看下equals方法的定义:

 

由上边我们可以看出,String类中的equals方法是对父类Object类中的equals方法的覆盖,先来看下Object类的equals方法怎么写的:

[java] view plain copy
 
  1. @param   obj   the reference object with which to compare.  
  2.     * @return  {@code true} if this object is the same as the obj  
  3.     *          argument; {@code false} otherwise.  
  4.     * @see     #hashCode()  
  5.     * @see     java.util.HashMap  
  6.     */  
  7.    public boolean equals(Object obj) {  
  8.        return (this == obj);  
  9.    }  

即直接return (this==obj)此处 某个对象调用该方法,this 就指代那个对象。

 

再来看看String类中的equals方法是如何覆盖以上方法的:

[java] view plain copy
 
  1. /** 
  2.      * Compares this string to the specified object.  The result is {@code 
  3.      * true} if and only if the argument is not {@code null} and is a {@code 
  4.      * String} object that represents the same sequence of characters as this 
  5.      * object. 
  6.      * 
  7.      * @param  anObject 
  8.      *         The object to compare this {@code String} against 
  9.      * 
  10.      * @return  {@code true} if the given object represents a {@code String} 
  11.      *          equivalent to this string, {@code false} otherwise 
  12.      * 
  13.      * @see  #compareTo(String) 
  14.      * @see  #equalsIgnoreCase(String) 
  15.      */  
  16.     public boolean equals(Object anObject) {  
  17.         if (this == anObject) {  
  18.             return true;  
  19.         }  
  20.         if (anObject instanceof String) {  
  21.             String anotherString = (String) anObject;  
  22.             int n = value.length;  
  23.             if (n == anotherString.value.length) {  
  24.                 char v1[] = value;  
  25.                 char v2[] = anotherString.value;  
  26.                 int i = 0;  
  27.                 while (n-- != 0) {  
  28.                     if (v1[i] != v2[i])  
  29.                             return false;  
  30.                     i++;  
  31.                 }  
  32.                 return true;  
  33.             }  
  34.         }  
  35.         return false;  
  36.     }  


可以看到,在此equals方法中有一个value的数组。找到其定义:

可以看出,value是一个char类型的数组,用于存放字符串中的每个字符。和上边String类的定义相吻合(废话么这不是)。

 判断条件:

    若当前对象和比较的对象是同一个对象,即return true。也就是Object中的equals方法。

    若当前传入的对象是String类型,则比较两个字符串的长度,即value.length的长度。

          若长度不相同,则return false

          若长度相同,则按照数组value中的每一位进行比较,不同,则返回false。若每一位都相同,则返回true。

    若当前传入的对象不是String类型,则直接返回false

   

 

*******************************************String类的equals方法的变体形式******************************************

要求:

自己写一个类MyString,里边有一个char[ ]  value,实现里边的equalsString方法,要求可以比较两个MyString类的对象。相等返回0,大于返回1,小于返回-1,若比较的不是MyString类型的对象,则返回-100。

 

代码如下:

[java] view plain copy
 
  1. package cn.ywq.test;  
  2.   
  3. class MyString {  
  4.       
  5.     char[] value;  
  6.     public MyString(char[] value) {  
  7.         this.value=value;  //通过构造方法将字符传入  
  8.     }  
  9.       
  10.       
  11.     public int equalsString(Object obj) {  
  12.         if(this==obj){  
  13.             return 0;  
  14.         }  
  15.           
  16.         //若该对象是MyString类型的  
  17.         if(obj instanceof MyString){  
  18.             MyString string =(MyString) obj;  
  19.             int n=this.value.length;  
  20.             if (n>string.value.length) {  //先判断长度的关系  
  21.                 return 1;  
  22.             }else if(n<string.value.length){  
  23.                 return -1;  
  24.             }else{   //若长度相等  
  25.                  char v1[] = this.value;  
  26.                  char v2[] = string.value;  
  27.                     int i = 0;  
  28.                     while (n-- != 0) {  //按照数组的每一位进行比较  
  29.                         if (v1[i] > v2[i]){  
  30.                             return 1;  
  31.                         }else if(v1[i] < v2[i]){  
  32.                             return -1;  
  33.                         }  
  34.                                   
  35.                         i++;  
  36.                     }  
  37.                     return 0;  //若while循环正常结束,则说明相等,返回0  
  38.   
  39.             }  
  40.         }  
  41.         return -100;  //若传入的不是MyString类型的对象  
  42.           
  43.     }  
  44.   
  45. }  

 

测试代码:

[java] view plain copy
 
  1. package cn.ywq.test;  
  2.   
  3. public class Test {  
  4.   
  5.     public static void main(String[] args) {  
  6.           
  7.         char[] value={'a','b','c','d'};  
  8. //      char[] value2={'a','b','c','d','e'};  
  9. //      char[] value3={'c','b','c','d'};  
  10.         char[] value4={'a','b','c',};  
  11.           
  12.         MyString myString = new MyString(value);  
  13.         MyString s=new MyString(value4);  
  14.         int i = myString.equalsString(s);   
  15.         System.out.println(i);  
  16.     }  
  17.   
  18. }  

 

 

 

posted @ 2018-03-14 21:49  逆水行舟!  阅读(7161)  评论(0编辑  收藏  举报