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)。
1 String s = "seven" ; 2 String s1 = "seven"; 3 System.out.println(s == s1); //返回false 4 System.out.println(s.equals(s2));//返回true
hashcode : 哈希码。 native本地方法(C、C++实现),操作系统实现逻辑,把结果返还给我们。把对象的内存地址经过算法得出的一个int。
为什么重写equals必须重写hashcode?
以下为重写equals和hashcode方法的源码,建议自动生成
1 @Override 2 public int hashCode() { 3 final int prime = 31; 4 int result = 1; 5 result = prime * result + ((name == null) ? 0 : name.hashCode()); 6 return result; 7 } 8 @Override 9 public boolean equals(Object obj) { 10 if (this == obj) 11 return true; 12 if (obj == null) 13 return false; 14 if (getClass() != obj.getClass()) 15 return false; 16 Person other = (Person) obj; 17 if (name == null) { 18 if (other.name != null) 19 return false; 20 } else if (!name.equals(other.name)) 21 return false; 22 return true; 23 }
现有两个对象
1 Student s1=new Student("小明",18); 2 3 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并覆写方法
1 public class Person implements Cloneable{ 2 3 @Override 4 public Object clone() throws CloneNotSupportedException 5 { 6 Object object = super.clone(); 7 return object; 8 } 9 }
然后可以调用clone()方法,下面代码也展示了两种创建对象的方法1,new 2,clone()
1 Person p1=new Person("张三",11); 2 Person p2=(Person)p1.clone();