1:运算符的比较
- ==运算符
1):可以使用在基本数据类型和引用数据类型变量中。
2):如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(类型不一定相同)
如果比较的是引用数据类型:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体。 - equals
1):首先,equals是一个方法,而非运算符。
2): 只适用于引用数据类型。
3):Object类中的equals()中的定义:
public boolean equals(Object obj) {
return (this == obj);
}
说明:Object类中的equals()和 == 作用是相同的。
例如
自定义一个Persion类,创建两个对象
Persion p1 = new woman();
Persion p2 = new Persion();
则用equals比较后输出结果为 false
System.out.println(p1.equals(p2));
4):像String,Date,File,包装类等都重写了Object类中的eqals方法,重写后比较的都是对象的”实体内容“是否相等。
5):重写equals方法
- 为什么要重写equals方法:当我们在自定义的类中调用equals方法时,实际调用的是Object中的equals()方法。所以若想使用equals比较对象的”实体内容“是否相等,则就需要重写equals方法。
- 手写方式:
举例上面的Persion类
public boolean equals(Object o) {
if (this == o) {
return true; //判断两个对象是否指向同一个地址。
}
if (!(o instanceof Persion)){·
return false; //判断对象类型是否相同
}
Persion persion = (Persion) o; //类型强转
return Objects.equals(getName(), persion.getName()) && Objects.equals(getAge(), persion.getAge()); //对比属性内容是否相同
}
在实际开发过程中,是使用编译器快捷生成。
- ”==“与equals区别
String讲解
- String定义的变量在常量池中。如果常量池中已经有了之前定义的String常量,那么新定义的就会直接指向之前定义的String数据。
toString讲解
- 先看一下Object类中的toString源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
可见返回的是类名加上虚拟地址值
- 所以如果想要输出类中属性的具体信息,就需要重写同String方法。
- 但是像String,Date,File,包装类等都重写了Object类中的toString方法