Java中所有类的基类——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与该对象的地址没有任何关系。

发布了6 篇原创文章 · 获赞 6 · 访问量 231

猜你喜欢

转载自blog.csdn.net/weixin_43932553/article/details/104486554