以String为例详解“==”与equals()区别,以及String中重写equals()方法

来源:互联网 发布:绍兴网络电视台 跃马 编辑:程序博客网 时间:2024/06/05 14:57

“==”是java运算符中关系运算符中的一种,主要用于比较“==”两边的操作数是否相等。而equals()方法是一个方法,其返回值为boolean类型,该方法是Object()类中的方法之一。其返回true或者false主要取决于重写实现。最常见的一个例子就是String字符串的比较,不同情况下的字符串“==”与“equals()”返回结果不同。equals()方法最重要的一点就是编程人员能够根据自己的需求去重写该方法,按照自己定义的规则判断两个对象是否相等。

一、使用“==”比较的有两种基本情况,一种是基础数据类型的比较(java中基础数据类型有8种:byte、short、int、long、double、float、boolean、char):这种情况比较的是两个值是否相等。例:

                   int i=1;

       int j=1;

       System.out.println(i==j);

输出结果为true。另一种为引用间的比较,比较的是两个对象的地址,如果两个引用指向同一个对象,则返回值为true。否则为false。例如,创建一个Person类,比较p1与p2:

                   Person p1=new Person();
                   Person p2=new Person();
                   System.out.println(p1==p2);

输出结果为false。由于p1与p2为指向Person对象的地址,不相同,所以输出结果为false。

二、equals追根溯源,是Object类中的一个方法,在该类中,equals()实现的也仅仅只是比较两个对象的内存地址是否相等。例如在第二个例子当中将p1==p2改为p1.equals(p2),其结果也为false(Person类中未重写equals方法的情况下)。

但在一些子类中,如:String、Integer 等,该方法将被重写。

在String类中equals()方法重写为将字符串转化为字符数组,比较两个字符数组间的每个字符是否相同,所以当String对象调用equals()方法时,其比较的是两个字符串的内容是否相同,而不是指向字符串的地址。

下面将举例说明,在开始这个例子之前,我们需要知道JVM处理String的一些特性。Java的虚拟机在处理String时会在内存中开辟出一块单独的区域,用来存储字符串对象,这块内存区域被称为字符串缓冲池。当使用String a = "abc";这样的语句进行定义一个引用的时候,首先会在字符串缓冲池中查找是否已经相同的对象,如果存在,那么就直接将这个对象的引用返回给a,如果不存在,则需要新建一个值为"abc"的对象,再将新的引用返回a。而String a = newString("abc");这样的语句明确告诉JVM想要产生一个新的String对象,并且值为"abc",于是就在堆内存中的某一个小角落开辟了一个新的String对象。基于这个原理,我们看以下几个例子。

1、以下程序输出结果为:truetrue。因为在str2赋值之前,str1的赋值操作就已经在内存中创建了一个值为"abc"的对象了,然后str2将会与str1指向相同的地址,所以其引用地址为同一地址,在使用“==”时候,返回值也为true。

                   String str1="abc";
                   Stringstr2="abc";
                   System.out.println(str1==str2);
                   System.out.println(str1.equals(str2));

2、以下程序输出结果为:false true。由于使用了new,所以str2所创建的字符串的对象在堆中新开辟了一块空间,与str1所指的对象不是同一个,所以地址不同,顾用“==”时的返回值为false,而equals()方法比较的是str1与str2所指对象的每个字符是否相等,故输出的结果为true。

                   String str1="abc";
                   String str2=newString("abc");
                   System.out.println(str1==str2);
                   System.out.println(str1.equals(str2));

附String类中重写的equals()方法代码:

public booleanequals(Object anObject) {

       if (this == anObject) {

           return true;

       }

       if (anObject instanceof String) {

           String anotherString = (String)anObject;

           int n = value.length;

           if (n == anotherString.value.length) {

               char v1[] = value;

               char v2[] = anotherString.value;

               int i = 0;

               while (n-- != 0) {

                   if (v1[i] != v2[i])

                       return false;

                   i++;

               }

               return true;

           }

       }

       return false;

    }

 

阅读全文
0 0