【Java学习记录】九 Java中的“==”和equal

”==”

“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。相同为true,不相同为false;基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean。

equal()

所有的java类均继承Ojbect,equals是Object的方法。我们看看equals是怎样实现的:

public boolean equals(Object obj) {

    return (this == obj);
   }

可以看到equals 也是调用的 == ,所以他们的本质是一样的。

但是在很多类中,对equal()进行了重写,例如String、Integer、Date。我们重点看一下再String类中是如何被重写的:

public boolean equals(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;
     }

String类的equals被重新复写,只要字符串相等,则返回true。

在字符串缓冲池中,若已有字符串,则直接赋值时不再新创建一个字符串,如果是new 关键字,则新创建一个不同的字符串。

例题:假设有以下代码

String s = "hello";
String t = "hello";
char c[] = {'h', 'e', 'l', 'l', 'o'};
String str1 = new String("hello"); 
String str2 = new String("hello"); 

System.out.println(s.equals(t));
System.out.println(t.equals(c));
System.out.println(s==t);
System.out.println(t.equals(new String("hello")));

System.out.println(str1==str2);
System.out.println(str1.equals(str2));

那么输出会是什么?答案是:

true
false
true
true
false
true

s和t是通过直接通过赋值创建的字符串,内容一样,所以内存中存放的地址相同。

  • 因此s.equals(t)是true(因为字符串内容相同)
  • s==t也是true(因为地址相同)
  • t.equals(c)是false(因为一个是字符串,一个是对象)
  • t.equals(new String("hello"))是true(因为存放的字符串内容相同)
  • str1==str2是false(因为通过New创建的,地址不同)
  • str1.equal(str2)是true(因为字符串的内容相同)

重写equals方法必须要重写hashcode方法

hashCode是一个本地方法,他返回的是这个对象的内存地址。

hashCode的通用规定:

  • 在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用,hashCode方法都必须始终返回同一个值。在一个应用程序与另一个应用程序的执行过程中,执行hashCode方法所返回的值可以不一致。

  • 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中的hashCode方法都必须产生同样的整数结果

  • 如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中的hashCode方法,则不一定要求hashCode方法必须产生不用的结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。

由上面三条规定可知,如果重写了equals方法而没有重写hashCode方法的话,就违反了第二条规定。相等的对象必须拥有相等的hash code。

你可能感兴趣的:(Java基础学习)