”==”
“==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。相同为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。