==和equals方法是个用的多个方法。
1.==的分析
对基本数据类型来说,变量的内存地址里存的就是值,所以==在这里比较的值是否相等。
对引用类型来说,==比较的是引用变量地址里存的值是被引用对象的内存地址。
2.equals
比如引用类型中的String,重写了equals比较了值是否相等,也重写了hashcode。
String str1 = new String("sss");
String str2 = new String("sss");
str1==str2 结果:false,比较的两个不同对象的地址,当然不同了
str1.equals(str2) 结果: true,值都相同
String str3 = "sss";
String str4 = "sss";
str3==str4 结果:true 这里有常量池概念,当这样定义变量时,首先去常量池看有没有该值,若有则直接指向该值,所以两者其实地址一样的
str3.equals(str4) 结果: true 值肯定的
比较
str3==str1 结果: false ,常量池是在方法区的,而new对象是在堆里的,所以两者地址肯定不一样
str3.equals(str1) 结果:true 肯定等
Object类有equals也有hashcode,hashcode有啥用?
hashcode主要两个好处:
1.映射元素在内存的地址(就是确定放在哪个地方)(相当于hashCode等于对象地址)
2.元素多时,减少了equals比较
举个例子:hashmap存元素,为啥元素的key为必须是引用类型
因为hashmap是根据key的hashCode来做hash运算的,而基本类型不存在hashCode.
hashmap源码的get方法,int h = hash(key.hashCode());
若key只实现equals重写,而hashCode没有,则无法判断取出的对象就一定是同一个元素,因为hashCode可能相等也可能不。
举个例子
public class Dog{
private String name;
private int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public boolean equals(Object dog){
return this.name.equals((Dog)dog.getName());
}
public class TestMap{
public static void main(String[] args){
Map<Dog,Integer> map = new HashMap<>();
Dog dog1 = new Dog("sss",12);
map.put(dog1,1);
System.out.println(map.get(new Dog("sss",12))); //输出结果为null
}
上面结果就很奇怪了,为啥找不到元素,equals肯定相等的。这里关键就在于这里是两个Dog对象,没有重写hashCode的情况下肯定是不同的,而map的get方法主要在于元素key的hashCode值,通过这个定位元素位置的,所以必须重写对象的hashCode方法。