`
HelloSure
  • 浏览: 310059 次
  • 性别: 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类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...

    学习Object类——为什么要重写equeals和hashcode方法

    此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    `hashCode` 方法是 `Object` 类中的一个方法,用于返回对象的哈希码值。在 Java 中,哈希码经常被用于实现散列表(如 `HashMap` 和 `HashSet`)。为了确保散列表的正确性,重写 `equals` 方法时,通常也需要重写 `...

    Object类和Scanner类

    ### Object类和Scanner类 #### 一、Object类详解 **1.1 概述** 在Java语言中,`Object` 类是所有类的基础。它位于类层次结构的顶端,这意味着所有的类,无论显式还是隐式地,都直接或间接地继承自 `Object` 类。...

    Java Object类认识

    本文将深入探讨`Object`类,以及其核心方法`equals()`与Java中的`==`操作符之间的差异。 `Object`类位于Java的核心库`java.lang`包中,它提供了基本的方法来支持对象的创建、比较和字符串表示。以下是`Object`类的...

    Java面向对象(进阶)- Object类的详细概述

    例如,Object类的`clone()`方法就是一个native方法。 5. **开发中使用注意事项** - 当重写`equals()`时,通常也需要重写`hashCode()`,以保持一致性,这对于对象存储在哈希集合中时非常重要。 - `==`和`equals()`...

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

    Object类提供了几个核心的方法,这些方法在处理对象时非常关键,包括equals()、hashCode()、toString()、clone()、finalize()等。 1. **equals() 方法**: - 默认情况下,equals() 方法比较的是对象的引用,即检查...

    详解Java中Object 类的使用.rar

    2. **方法覆盖与多态**:Object类提供了一些基本的方法,如`toString()`、`hashCode()`和`equals()`。这些方法在子类中常常需要被重写以实现特定的行为。例如,`toString()`方法默认返回类名和哈希码,但通常我们...

    Java程序设计:020611_Object类.ppt

    - Object类提供了对所有Java对象通用的基本操作,例如`clone()`,`finalize()`,`hashCode()`等。这些方法使得在处理不同类型的对象时有一致的行为。 - Object类的`toString()`方法是一个关键的方法,它返回一个...

    JavaSE之Object与Object类

    在Java编程语言中,`Object`类是所有类的根类,这意味着无论是自定义的类还是内置的类,它们最终都会继承自`Object`。这个类包含了一些基础的方法,供所有的Java对象使用。以下是关于`Object`类及其相关知识点的详细...

    JAVA之Object类所有方法

    在Java编程语言中,`java.lang.Object`是所有类的根类,无论是用户自定义类还是内置类,它们都直接或间接地继承自Object类。这个类提供了许多基础方法,这些方法对于对象的操作和管理至关重要。现在,我们将深入探讨...

    302.300.JAVA基础教程_面向对象(中)-Object类综合练习(302).rar

    这意味着你可以直接或间接地调用`Object`类的方法,例如`toString()`、`equals()`和`hashCode()`等。 1. `toString()`方法:这是`Object`类的一个重要方法,用于返回对象的字符串表示。默认的`toString()`方法返回...

    Java实训教程 Java软件开发实战 Java类库 第1章 Object类 共29页.pptx

    - 在`Object`类中,`equals`方法默认行为是检查两个对象是否是指向同一个对象(即同一性)。但在实际应用中,经常需要判断两个对象的数据值是否相同(即等同性)。 - **为何重写`equals`方法**:为了能够正确地根据...

    java中的Object类[文].pdf

    `clone()`方法用于创建当前对象的一个副本,但是这个方法在`Object`类中是受保护的,需要在子类中重写为公开的(public)并实现具体复制逻辑,通常用于深拷贝或浅拷贝。 3. **`equals()`和`hashCode()`方法**: `...

    Chp10 Object类与常用类,内部类.pdf

    在Java编程语言中,`Object`类是一个非常关键的类,它是所有类的基类,位于Java继承体系的顶端。这意味着无论是自定义的类还是Java内置的类,最终都会继承自`Object`类。通过这个特性,我们可以对任何类型的对象进行...

    Java软件开发实战 Java基础与案例开发详解 6-2 object类 共7页.pdf

    `Object`类提供了许多基本而强大的功能,包括`toString()`、`equals()`、`hashCode()`、`getClass()`以及`clone()`等方法。通过理解和适当重写这些方法,开发者可以更好地控制对象的行为,并提高代码的质量和可维护...

    Java从JDK源码角度对Object进行实例分析

    Object类包含了对象常用的方法,如getClass、hashCode、equals、clone、toString、notify、wait等。这些方法大多数是native方法,其他类继承了Object后就可以不用重复实现这些方法。 4. getClass()方法 getClass()...

    java中hashCode方法与equals方法的用法总结

    `equals()` 方法是 Object 类的一个成员方法,用于比较两个对象的内容是否相等。默认的行为是检查两个对象是否指向内存中的同一个位置(即引用是否相同)。如果你需要自定义对象的比较逻辑,比如基于对象属性的比较...

Global site tag (gtag.js) - Google Analytics