Object类及一些注意事项
Object类规定一些方法
1. String toString();
当前对象建议String类型描述。默认情况是当前类所属包名.类名@十六位内存地址
2. int hashCode();
内存中当前对象的唯一索引值,默认情况下是当前 对象所处空间首地址的十进制展示
3. boolean equals(Object obj);
判断两个对象是否一致,默认是比较两个对象的地址
【注意】:
如果两个对象的equals比较方法为true,则要求两个对象的hashCode()必
须一致
toString方法
private int size = 0;
private Node<E> first;
private Node<E> last;
@Override
public String toString() {
return "MyLinkedList [size=" + size + ", first=" + first + ", last=" + last + "]";
}
}
在eclipse中可以 Alt + Shift + S 快捷键重写
equals方法【重点】
比较两个对象是否一致,在Object类内默认方式是比较 两个对象的地址是否一致。
但是有一种情况不符合我们所期望的情况:
需要比较的是两个对象中保存的内容是一致的,但是使用Object类内继承而来
的equals方法是不合适的
Student student1 = new Student(1, "小明", 16, '男');
Student student2 = new Student(1, "小明", 16, '男');
比如在这里,我们新建了两个对象,它们的的成员变量是一致的,但是它们所处的地址
空间不同,所以在使用equals方法进行比较时会返回false,此时按照我们的需求我们
需要重写equals方法.
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Student))
return false;
Student other = (Student) obj;
return age == other.age && gender == other.gender && id == other.id && Objects.equals(name, other.name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
return age == other.age && gender == other.gender && id == other.id && Objects.equals(name, other.name);
}
以上两种写法都可以满足需求,但是在我们重写equals后,千万别忘了重写 hasCode()
方法
补充:
instanceof 是判定一个对象是否为一个类的实例
hashCode方法
@Override
public int hashCode() {
return Objects.hash(age, gender, id, name);
}
以上代码均可以在eclipse中使用 shift + alt + s 选择generate hasCode() and
equals()可以进行快捷生成
【注意】
当重写完之后再次创建具有相同的成员变量的两个对象时,他们的hashCode()的值是一致的,但这个值代表的并非该对象首地址的十进制表示,也就是此时的hashCode与该对象的地址没有任何关系。