hascode,equals和’=='*
- User类【没有重写任何方法】
package com.company;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public User() {
}
}
1. hascode
hashCode()
的作用是获取哈希码,也称为散列码,是返回一个int整数。重新New两个内容相同的对象【如果不重写hascode】,他们的hascode是不相同的,所以在Java的Set的集合中默认为不同的。
User user1 = new User("xiaowang", 16);
User user2 = new User("xiaowang", 16);
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
结果:
2.equals
equals可以用判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。
Object中equals源码
public boolean equals(object obj){
return (this==obj);
}
- 没有重写hascode及equals
User user1 = new User("xiaowang", 16);
User user2 = new User("xiaowang", 16);
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
System.out.println(user2.equals(user1));
结果:
- 重写hascode及equals
//添加进user类中
@Override
public boolean equals(Object o) {
User user= (User) o;
return user.getName().equals(this.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
User user1 = new User("xiaowang", 16);
User user2 = new User("xiaowang", 16);
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
System.out.println(user2.equals(user1));
3.‘==’
如果比较的对象是基本数据类型,则比较数值是否相等。如果比较的是引用数据类型,则比较的是对象的内存地址是否相等。而一个常量只会对应一个地址,因此不管是再多的 “abc”, 这样的数据都只会存储一个地址. 所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。
4.equals与’==’
equals与==虽然都有用于比较对象是否相同,但是用法不同。equals是函数【只存在于Object中】,而 == 则是运算符。字符串与对象使用equals相比是相同的【字符串对象已经重写了equals函数,调用此则是比较值】,使用 ==则是比较地址是是否相同
String a =new String("abc");
String b = new String("abc");
String x = "abc";
String y = "abc";
System.out.println("x==y: " + (x == y));
System.out.println("a==b: " + (a == b));
System.out.println("a.equals(b): " + (a.equals(b)));
System.out.println("a==x:"+a.equals(x));
System.out.println("a==x:"+a==x);
结果:
【注解】:new出来的String对象是存放在堆中,而通过赋值的字符串则是存放在常量池中[公用常量池]。所以a!=b,但是使用equals比较a与b时,则是比较值。x与y同一个常量池的一个“abc”,则相等,使用==比较a与x则是比较地址是否相同,而堆的地址与常量池中的地址明显不相同。使用equals比较a与x,则是比较值。
【本人对此的一些看法,有误请大佬指教】