注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

淡泊明智

 
 
 

日志

 
 

Object类分析equals、hashcode、clone  

2012-11-27 18:08:02|  分类: java基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Object类中的equals():
Java代码 复制代码 收藏代码
  1. public boolean equals(Object obj) {   
  2.     return (this == obj);   
  3.     }  
public boolean equals(Object obj) {   return (this == obj);      }  

可见equals方法就是比较引用是不是相同,感觉挺没用的一个方法。
所以String类覆盖为equals()方法先比较引用,不一致,再比较内容是否一致
Java代码 复制代码 收藏代码
  1. public boolean equals(Object anObject) {   
  2.     if (this == anObject) {   
  3.         return true;   
  4.     }   
  5.     if (anObject instanceof String) {   
  6.         String anotherString = (String)anObject;   
  7.         int n = count;   
  8.         if (n == anotherString.count) {   
  9.         char v1[] = value;   
  10.         char v2[] = anotherString.value;   
  11.         int i = offset;   
  12.         int j = anotherString.offset;   
  13.         while (n-- != 0) {   
  14.             if (v1[i++] != v2[j++])   
  15.             return false;   
  16.         }   
  17.         return true;   
  18.         }   
  19.     }   
  20.     return false;   
  21.     }  
这个实现的意思是,如果两个字符串内容相同,就返回true。
这才是真正意义上的equals方法该做的事情。

---------------------------------------------------------------------------------
Object类中的hashcode():
Java代码 复制代码 收藏代码
  1. public native int hashCode();  
这个本地方法返回的是该引用所指向的对象在内存中的地址
Java代码 复制代码 收藏代码
  1. public class Test{   
  2.     public static void main(String[] args){   
  3.         Person p = new Person();   
  4.         Person pp = p;   
  5.         Student s = new Student();   
  6.        
  7.         System.out.println(""+p.hashCode());   
  8.         System.out.println(""+pp.hashCode());   
  9.                 System.out.println(""+s.hashCode());   
  10.     }   
  11. }  
结果为:
Java代码 复制代码 收藏代码
  1. 33263331  
  2. 33263331  
  3. 6413875  
hashcode()和equals()肯定是对应的,可以试一下:
Java代码 复制代码 收藏代码
  1. if(p.equals(pp)){   
  2.             System.out.println("equals true");   
  3.         }   
  4.            
  5.         if(p == pp){   
  6.             System.out.println("== true");   
  7.         }  
会显示:
Java代码 复制代码 收藏代码
  1. equals true  
  2. == true  
那么对于String来说,hashcode()肯定就是与内容相关的喽:
Java代码 复制代码 收藏代码
  1. public int hashCode() {   
  2.     int h = hash;   
  3.         int len = count;   
  4.     if (h == 0 && len > 0) {   
  5.         int off = offset;   
  6.         char val[] = value;   
  7.   
  8.             for (int i = 0; i < len; i++) {   
  9.                 h = 31*h + val[off++];   
  10.             }   
  11.             hash = h;   
  12.         }   
  13.         return h;   
  14.     }  
---------------------------------------------------------------------------------
Object类中的clone():
Java代码 复制代码 收藏代码
  1. protected native Object clone() throws CloneNotSupportedException;  
注意这个方法是protected,对于具体的类,要想实现拷贝,需要让这个类实现Cloneable接口,实现clone()方法
这个方法是本地方法,实现的是浅复制。
如果只想进行浅复制,那么直接调用Object的clone()即可:
Java代码 复制代码 收藏代码
  1. class User {     
  2.     String name;     
  3.     int age;     
  4. }     
  5.      
  6. class Account implements Cloneable {     
  7.     User user;     
  8.     long balance;     
  9.      
  10.     @Override     
  11.     public Object clone() throws CloneNotSupportedException {     
  12.         return super.clone();     
  13.     }     
  14. }    
     

    如果想进行深复制,那么需要修改clone():
Java代码 复制代码 收藏代码
  1. class User implements Cloneable {     
  2.     String name;     
  3.     int age;     
  4.      
  5.     @Override     
  6.     public User clone() throws CloneNotSupportedException {     
  7.         return (User) super.clone();     
  8.     }     
  9. }     
  10.      
  11. class Account implements Cloneable {     
  12.     User user;     
  13.     long balance;     
  14.      
  15.     @Override     
  16.     public Account clone() throws CloneNotSupportedException {     
  17.         Account account = null;     
  18.      
  19.         account = (Account) super.clone();     
  20.         if (user != null) {     
  21.             account.user = user.clone();     
  22.         }     
  23.      
  24.         return account;     
  25.     }     
  26. }    
clone三部曲。
1 声明实现Cloneable接口。
2 调用super.clone拿到一个对象,如果父类的clone实现没有问题的话,在该对象的内存存储中,所有父类定义的field都已经clone好了,该类中的primitive和不可变类型引用也克隆好了,可变类型引用都是浅copy。
3 把浅copy的引用指向原型对象新的克隆体。

  评论这张
 
阅读(239)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018