Java学习笔记之Object常用方法

时间:2023-08-27 09:49:01

Object:万类之祖

  == : 比较的是是否是同一个对象,比较的是地址

 

equals: 是Object里面的方法,默认的是==,比较的是地址,但在String类型里重写为比较内容

一般我们在设计一个类中,需要重写父类的equals方法,需要遵照以下几个规则设计:

  • 自反性(x.equals(x)必须返回true);
  • 对称性(x.equals(y)返回true时,y.equals(x)也必须返回true);
  • 传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true);
  • 一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值);
  • 非空性(对于任何非null值的引用x,x.equals(null)必须返回false)。
 String s = "seven" ;
String s1 = "seven";
System.out.println(s == s1); //返回false
System.out.println(s.equals(s2));//返回true

 

hashcode : 哈希码。 native本地方法(C、C++实现),操作系统实现逻辑,把结果返还给我们。把对象的内存地址经过算法得出的一个int。

 为什么重写equals必须重写hashcode?

 以下为重写equals和hashcode方法的源码,建议自动生成

 @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

现有两个对象

  Student s1=new Student("小明",18);

  Student s2=new Student("小明",18);

此时s1.equals(s2)返回true,但如果不重写hashcode,Object默认的hashcode将对象的内存地址经过哈希算法返回给我们一个int,就违反了两个对象相等,hashcode一定相等的规定

 关于hashcode的规定:

  • 两个对象相等,hashcode一定相等
  • 两个对象不等,hashcode不一定不等
  • hashcode相等,两个对象不一定相等("Aa"、"BB")
  • hashcode不等,两个对象一定不等

 toString : 把引用数据类型转换成字符串。直接打印一个引用数据类型的对象则默认调用这个对象动态toString方法。

 finalize : 里面的逻辑会在当前对象被垃圾回收器回收的时候执行。

 clone:Object默认的方法clone()实现的是浅拷贝

下面实现一个浅拷贝的实例,首先实现接口Cloneable并覆写方法

 public class Person implements Cloneable{

     @Override
public Object clone() throws CloneNotSupportedException
{
Object object = super.clone();
return object;
}
}

然后可以调用clone()方法,下面代码也展示了两种创建对象的方法1,new    2,clone()

 Person p1=new Person("张三",11);
Person p2=(Person)p1.clone();