java中的==和equals()以及instanceof

时间:2022-10-24 16:19:27

                                         java中的==和equals()以及instanceof 

一、"=="

  1、 "=="操作符的作用

       1)用于基本数据类型的比较.

          基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean, 他们之间的比较,是用双等号(==)来比较他们的值。
      2)判断引用是否指向堆内存的同一块地址。

         当复合数据类型用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

 2、equals()

    1)JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法

      

   * @param   obj   the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);
}
   上面这个方法比较的是对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。 
   所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。

   2)String的equals() 

    

  public boolean equals(Object anObject) {
if (this == anObject) { //首先比较当前对象和传来的对象是不是同一个对象,如果是则返回true
return true;
}
if (anObject instanceof String) {//如果不是String类型的数据,返回false
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) { //如果char数组长度不相等,返回false
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //从前往后个字符判断,如果有不相等,返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;//每个字符都相等,返回true
}
}
return false;
}

equals方法经常用得到,它用来判断两个对象从实际意义上是否相等,String对象判断规则:
  1)内存地址相同,则为真。
  2)如果对象类型不是String类型,则为假。否则继续判断。
  3)如果对象长度不相等,则为假。否则继续判断。

  4)从前往后,判断String类中char数组value的单个字符是否相等,有不相等则为假。如果一直相等直到第一个数,则返回真。


3.用法示例

   

public class TestStringEqual {
public static void main(String args[]) {
int i = 102;
int j = 102;
System.out.println(i == j); //true

String a = "102";
String b = 102 + "";
System.out.println(a == b); //true
System.out.println(a.equals(b));//true

String a1 = new String("102");
String b1 = "102";
System.out.println(a1 == b1); //false
System.out.println(a1.equals(b1));//true

}
}
4.instanceof 

    1)  java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

    用法:
        result = object instanceof class
   参数:
      Result:布尔类型。
      Object:必选项。任意对象表达式。
      Class:必选项。任意已定义的对象类。
  说明:
     如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。

   注意:

       i)一个类的实例包括本身的实例,以及所有直接或间接子类的实例 

       ii)instanceof左边操作元显式声明的类型与右边操作元必须是同种类或有继承关系, 

  2)instanceof 的伪码实现

    

        // obj instanceof T
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj; // checkcast
result = true;
} catch (ClassCastException e) {
result = false;
}
}
    对上面代码的解释是:

          如果有表达式 obj instanceof T ,那么如果 obj 不为 null 并且 (T) obj 不抛 ClassCastException 异常则该表达式值为 true ,否则值为 false 。