`
HelloSure
  • 浏览: 308011 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Object类分析equals、hashcode、clone

 
阅读更多
Object类中的equals:
public boolean equals(Object obj) {
	return (this == obj);
    }

可见equals方法就是比较引用是不是相同,感觉挺没用的一个方法。
所以String类覆盖为:
public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

这个实现的意思是,如果两个字符串内容相同,就返回true。
这才是真正意义上的equals方法该做的事情。

---------------------------------------------------------------------------------
Object类中的hashcode():
public native int hashCode();

这个本地方法返回的是该引用所指向的对象在内存中的地址。
public class Test{
	public static void main(String[] args){
		Person p = new Person();
		Person pp = p;
		Student s = new Student();
    
		System.out.println(""+p.hashCode());
		System.out.println(""+pp.hashCode());
                System.out.println(""+s.hashCode());
	}
}

结果为:
33263331
33263331
6413875

hashcode()和equals()肯定是对应的,可以试一下:
if(p.equals(pp)){
			System.out.println("equals true");
		}
		
		if(p == pp){
			System.out.println("== true");
		}

会显示:
equals true
== true

那么对于String来说,hashcode()肯定就是与内容相关的喽:
public int hashCode() {
	int h = hash;
        int len = count;
	if (h == 0 && len > 0) {
	    int off = offset;
	    char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }


---------------------------------------------------------------------------------
Object类中的clone():
protected native Object clone() throws CloneNotSupportedException;

注意这个方法是protected,对于具体的类,要想实现拷贝,需要让这个类实现Cloneable接口,实现clone()方法。
这个方法是本地方法,实现的是浅复制。
如果只想进行浅复制,那么直接调用Object的clone()即可:
    class User {  
        String name;  
        int age;  
    }  
      
    class Account implements Cloneable {  
        User user;  
        long balance;  
      
        @Override  
        public Object clone() throws CloneNotSupportedException {  
            return super.clone();  
        }  
    }  

如果想进行深复制,那么需要修改clone():
    class User implements Cloneable {  
        String name;  
        int age;  
      
        @Override  
        public User clone() throws CloneNotSupportedException {  
            return (User) super.clone();  
        }  
    }  
      
    class Account implements Cloneable {  
        User user;  
        long balance;  
      
        @Override  
        public Account clone() throws CloneNotSupportedException {  
            Account account = null;  
      
            account = (Account) super.clone();  
            if (user != null) {  
                account.user = user.clone();  
            }  
      
            return account;  
        }  
    }  

clone三部曲。
1 声明实现Cloneable接口。
2 调用super.clone拿到一个对象,如果父类的clone实现没有问题的话,在该对象的内存存储中,所有父类定义的field都已经clone好了,该类中的primitive和不可变类型引用也克隆好了,可变类型引用都是浅copy。
3 把浅copy的引用指向原型对象新的克隆体。

分享到:
评论
1 楼 u012273744 2015-03-14  
 

相关推荐

    Java的Object类讲解案例代码 equals()、hashCode()、finalize()、clone()、wait()

    Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...

    Java Object 类高难度进阶版面试题集锦解析Java Object类高难度面试题及答案解析

    提供了20道高难度的Java Object类面试题及详细答案解析,涵盖了equals()、hashCode()、toString()、clone()、finalize()等方法的重写和应用,以及对象的比较、克隆、标识哈希码等概念。适合准备Java面试的开发者深入...

    javaee_tedu_day09.zip

    如果不是想使用object类,toString方法,可以重写此方法 equals方法 equals方法比较对象的是否相同 ==比较两个对象的内存地址 如果想表示对象的内容相同,返回true,则重写此方法 hashCode 返回一个hash code码,...

    Java的反射中一些重要的方法

     Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode、equals、clone、toString、getClass等。其中getClass返回一个Class 对象。Class对象十分特殊。他是...

    jsp内置对象的用法

    3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等 4 void copy(Object obj) 把此Object拷贝到指定的Object对象中 5 Object clone() 克隆此Object对象 6 String toString() 把此Object...

    javabiginteger源码-Java:Java

    ##-----java.lang.Object类----- 其equals与==有没有差别? 其hashCode及clone前面有个什么修饰语? 其toString()返回什么? 其构造函数及finalize()做了什么? ##-----java.lang.Class类----- 5. 为什么说Class类不...

    knowledge-interview:知识学习

    Object类的方法(平安) clone() equals(object) finalize() getClass() hashCode() notify() notifyAll() toString() wait() String String、StringBuffer、StringBuilder三者的区别: 都在java.lang 包下 String使用...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 ...

    Java教程补充材料

    10 The Methods in the Object Class (finalize, hashcode, clone, getClass, equals) 11 Hiding Data Fields and Static Methods 12 Initialization Blocks 13 Extended Discussions on Overriding Methods 14...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 11: Always override hashCode when you override equals Item 12: Always override toString Item 13: Override clone judiciously Item 14: Consider implementing Comparable 4 Classes and Interfaces Item...

    struts_2.3.12GA_API文档(chm版本)

    equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造方法详细信息 ActionSupport public ActionSupport()方法详细信息 setActionErrors public void setActionErrors...

Global site tag (gtag.js) - Google Analytics