对象的关联
定义
简单的说,一个对象中使用了另一个对象。示例
class Employee 包含 class MyDate
if(o1 instanceof Employee && o2 instanceof Employee){
Employee em=(Employee) o1;
Employee emp=(Employee) o2;
MyDate md1 = em.getBirthday();
MyDate md2 = emp.getBirthday();
if(md1.getYear().equals(md2.getYear())){
if(md1.getMonth().equals(md2.getMonth())){
return md1.getDay().compareTo(md2.getDay());
}else {
return md1.getMonth().compareTo(md2.getMonth());
}
}else{
return md1.getYear().compareTo(md2.getYear());
}
}
java.lang.Object
- 定义
是所有类的父类。若一个类没有显示的继承任何类时,默认 extends java.lang.Object - 作用
既然 Object 是所有类的父类,因此 Object 类中的内容是最具共性的
既然 Object 是所有类的父类,因此子类可以继承 Object 类中所有的方法
既然 Object 是所有类的父类,若 Object 类中的方法对于子类不适用,子类也可以重写 Object 类中的方法
to String()
作用:得到字符串表现形式
Object 类中的 toString 返回
getClass.getName() + '@' + Integer.toHexString(hashCode())
即:得到的是十六进制的hashCodePerson@3fab5
hashCode
当new创建对象时,产生唯一的hashCode地址值
以十六进制表示
java中实际是没有地址的,地址值是标识对象在内存中的存在若 Object 类中的 toString() 对于我们来说不适用,我们可以重写。
要得到一个人,即输出p,但是输出结果是hashCode
我们想要的人是有具体属性的,字,年龄等等,才叫“人”。
public String toString(){
return "姓名:" + name + " 年龄:" + age;
}
equals()
以下是网上截图,说的不错
image.png
image.png
image.png
重写hashCode() 和 equals()
是否问过自己,为什么要重写hashCode() 和 equals()?
确定两个对象是否相同,或者说,控制两个对象的比较
@Data
public class RankingVO {
private Integer id = 1;
private BigDecimal num;
private String nickName;
private String uuid;
private Integer ranking;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof RankingVO)) return false;
RankingVO rankingVO = (RankingVO) o;
return Objects.equals(nickName, rankingVO.nickName) && Objects.equals(uuid, rankingVO.uuid);
}
@Override
public int hashCode() {
return Objects.hash(nickName, uuid);
}
}
public Callable<ResponseEntity<ResponseData>> history(HttpServletRequest request) {
Callable<ResponseEntity<ResponseData>> result = new Callable<ResponseEntity<ResponseData>>() {
//参与了分发奖池的排名
List<RankingVO> inPoolList = poolDetailService.queryByHistory(cycle);
if (CollectionUtils.isEmpty(inPoolList)) {
inPoolList = new ArrayList<>();
}
//..........
//当前用户
RankingVO currentRankingVO = new RankingVO();
//.........
//排名:只要nickName, uuid相等的,就视为相同,取其排序过的索引
Integer i = inPoolList.indexOf(currentRankingVO);
//.........
}