Java学习笔记之Object常用方法

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();

 

 



posted @ 2019-10-22 18:46  红·林  阅读(1273)  评论(0编辑  收藏  举报