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

                                         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 。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,== 和 equals 都用于比较两个对象的值,但它们的实现方式有所不同。 == 操作符用于比较两个对象的引用是否相同,即比较两个对象是否指向同一个内存地址。如果两个引用指向同一个对象,则它们是相等的;否则,它们是不相等的。例如: ``` String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false ``` 在上面的代码,str1 和 str2 指向同一个字符串对象,因此 str1 == str2 的结果为 true。而 str3 是通过 new 关键字创建的一个新的字符串对象,它与 str1 和 str2 的引用不同,因此 str1 == str3 的结果为 false。 equals 方法用于比较两个对象的内容是否相等,即比较两个对象的值是否相等。通常情况下,我们需要自己重写 equals 方法来定义相等的规则。例如: ``` class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Person)) { return false; } Person other = (Person) obj; return this.name.equals(other.name) && this.age == other.age; } } Person p1 = new Person("Tom", 20); Person p2 = new Person("Tom", 20); System.out.println(p1.equals(p2)); // true ``` 在上面的代码,我们重写了 Person 类的 equals 方法,定义了当两个 Person 对象的 name 和 age 属性都相等时,它们是相等的。因此,p1 和 p2 的 equals 方法返回 true。 总之,== 操作符比较两个对象的引用,equals 方法比较两个对象的内容。在实际开发,我们要根据具体的需求来选择使用哪个方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值