1、==
==为两个对象地址的判断
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2);
System.out.println(str2 == str3);
str1 == str2 为true,他们都是存放在常量池中的数据,指向同一地址,所有相同
str2 == str3 为false, str3指向new的对象地址,而str2位常量池中的地址,所以不同
2、equals
在Object中的默认实现就是==,比较对象的地址,子类可以重写equals方法,实现对象的比较
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str3));
两个输出的结果都为true,因为String类中重写Object中的equals方法,增加了内容的判断
3、hashcode()
hashCode返回的是一个int的数值,其目的是实现一个hash码,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,(HashSet、HashMap以及HashTable),在基于散列的集合为了阻止数据的重复判断集合是否已存在相关对象,一般没有作用,在散列表中才有作用
== 和equals的对比
equals在Object中默认实现就是==,默认是通过对象的地址来判断对象是否相等,对象一般会通过对equals的重写来进行对象的判断
class Person{
private int age;
public Person(int age){
this.age = age;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
public static void main(String[] args){
Person p1 = new Person(16);
Person p2 = new Person(16);
System.out.println(p1 == p2);
System.out.println(p1.equals(p2))
}
p1 == p1 返回false,判断的是对象的地址,因为新建的是两个对象。
p1.equals(p2) 返回true,因为重写了person中的equals方法,判断的是里面的内容
hashCode和equals的联系
在一般的集合和操作中,如果不是进行散列表的数据结构操作,他们是没有关系的
在普通对象的比较中,通过equals方法判断返回true的时候,他的hashcode不一定相等
在进行散列表的数据结构操作是,有如下关系:
1、如果对象中重写了equals方法,则有必要重写hashCode方法
2、如果equals返回true,则hashcode有必要也返回相等的hash值
3、如果equals返回false,则hashcode不一定返回不同的hash值,但为不相等的对象生成不同的hash值,可以提高哈希表的性能
3、如果hashCode值返回true,则equals不一定要返回true
4、如果hashcode值返回false,则equals一定返回false
7、同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题