1. ==方法
1.1 ==概述
JAVA数据类型分为两类:
基本数据类型
复合数据类型(包装类是基本数据类型的引用类型属于复合数据类型)
基本数据类型包括:
byte、short、char、int、long、float、double、boolean
他们之间比较用==,比较的是值是否相等。
而对于复合数据类型,比较的是两变量的地址值是否一致,所以除非是同一个new出来的对象,结果为true;否则比较后结果为false。
1.2 代码实例演示
测试代码:
package core.java.inherit;
public class Test {
public static void main(String[] args) {
int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2);
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
}
}
效果截图:
注意:只要涉及new,就会新开辟一块内存空间来存储,内存地址肯定是不同的。
2. equals方法
2.1 equals概述
Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,他们一定是相等的。然而对于多数类来说,这种判断没有任何意义。经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。举个栗子:
如果两个雇员对象的姓名、薪水和雇佣日期都一样,就认为他们是相等的。
2.2 equals特性
- 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true
- 对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true
- 传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,然后x.equals(z)应该返回true
- 一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false
- 对于任何非空的参考值x , x.equals(null)应该返回false 。
2.3 代码实例演示
Employee类:
package core.java.inherit;
import java.time.LocalDate;
import java.util.Objects;
public class Employee {
private String name;
private double salary;
private LocalDate hireDay;
public Employee(String name,double salary, int year, int month, int day){
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year,month,day);
}
public String getName(){
return name;
}
public double getSalary(){
return salary;
}
public LocalDate getHireDay(){
return hireDay;
}
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
public boolean equals(Object otherObject){
if(this == otherObject) return true;
if(otherObject == null) return false;
if(getClass() != otherObject.getClass()) return false;
Employee other = (Employee)otherObject;
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
}
public int hashCode(){
return Objects.hash(name, salary, hireDay);
}
public String toString(){
return getClass().getName() + "[name="+name+",salary="+salary+",hireDay="+hireDay+"]";
}
}
Manager类:
package core.java.inherit;
import java.util.Objects;
public class Manager extends Employee{
private double bonus;
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
bonus = 0;
}
public double getSalary(){
double baseSalary = super.getSalary();
return baseSalary + bonus;
}
public void setBonus(double bonus){
this.bonus = bonus;
}
public boolean equals(Object otherObject){
if(!super.equals(otherObject)) return false;
Manager other = (Manager)otherObject;
return bonus == other.bonus;
}
public int hashCode(){
return super.hashCode() + 17 * new Double(bonus).hashCode();
}
public String toString(){
return super.toString() + "[bonus=" + bonus + "]";
}
}
EqualsTest类:
package core.java.inherit;
public class EqualsTest {
public static void main(String[] args) {
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
System.out.println("alice1 == alice2:" +(alice1 == alice2));
System.out.println("alice1 == alice3:" +(alice1 == alice3));
System.out.println("alice1.equals(alice3):" + alice1.equals(alice3));
System.out.println("alice1.equals(bob)" +alice1.equals(bob));
System.out.println("bob.toString():" + bob);
Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
boss.setBonus(5000);
System.out.println("boss.toString():"+boss);
System.out.println("carl.equals(boss):"+carl.equals(boss));
System.out.println("alice1.hashCode():"+alice1.hashCode());
System.out.println("alice3.hashCode():"+alice3.hashCode());
System.out.println("bob.hashCode():"+bob.hashCode());
System.out.println("carl.hashCode():"+carl.hashCode());
}
}
效果截图: