JAVA源码分析之---Object类(二)---hashCode,equals,clone方法的使用

今天咱们剖析hashCode(),equals(),clone()方法的使用

咱们继续第3个方法:

public native int hashCode();

这个方法native修饰,java本身不实现,由c/c++来实现,具体根据所依赖的平台来。

这个方法返回该对象的哈希代码值,在java里,专门有一个类是java.util.HashMap,这个值根据哈希表来的。

如果在java程序中,对同一个对象多次调用,这个对象的哈希值也不会变,可以理解为给每一个对象上了个标记,这个标记是始终不会变的。所以可以用来比较两个对象是否是同一个对象,比如有A和B"两"个对象,如果这"两"个对象的哈希值一样,那么其实是一个对象,稍后在equals方法中,会有体现。

但是,如果在两个程序中,对象的哈希值可以不一样。可以这样认为,在一个程序中,生成的一个对象会拥有一个哈希值,如果在本程序中,这个哈希值唯一。但是如果脱离了本程序,这个哈希值可以不一样。

同理,如果是判断两个对象是否相等,如果相等,那么每个调用的方法必定会产生同一个哈希值。

举例:

package edu.java.test;

public class TestHashCode01 {

	/**
	 * 测试两个引用指向同一个对象的哈希值
	 * @param args
	 */
	public static void main(String[] args) {
		String a = "3";
		String b = a;
		System.out.println("a的HashCode值" + a.hashCode());
		System.out.println("b的HashCode值" + b.hashCode());
	}
}
这里的测试结果为:

a的HashCode值51,b的HashCode值51。

这里a和b都指向了同一个对象,hash值是一样的。

第4个方法:equals方法

    public boolean equals(Object obj) {
        return (this == obj);
    }
这个方法返回一个boolean类型。该方法主要是比较两个对象是否是同一个。而比较的不是对象本身,而是对非NULL对象的引用。

这个方法具有自我性,对称型,传递性,一致性。

自我性体现在:如果x.equals(x),那么在x不为空的前提下,那么返回true,否则抛出NullPointorException。

对称型体现在:如果x和y相等,那么y和x也相等。

传递性体现在:如果x==y,y==z,那么x==z。

一致性体现在:如果x==y为true,那么只要不修改,后面无论调用多少次,一致为true。

而且特别要注意的一点是:一个非空对象和null值比较,那么一定返回false。

如果要对equals方法进行overide重写,那么一定要保证相同对象拥有同样的hash值。

举例:

package edu.java.test;

import java.util.Date;

public class TestHashCode02 {
	/**
	 * 测试两个引用同一个对象的变量是否相等
	 * @param args
	 */
	public static void main(String[] args) {
		Date date = new Date();
		Date date2 = date;
		System.out.println("date的hashCode = "+date.hashCode());
		System.out.println("date2的hashCode = "+date2.hashCode());
		System.out.println("date == date2 的值 = " + date.equals(date2));
	}
}

结果:

date的hashCode = -452137556
date2的hashCode = -452137556
date == date2 的值 = true

第5个方法:clone() 克隆方法

    protected native Object clone() throws CloneNotSupportedException;

native修饰,java本身不实现。

clone()方法是创建并返回该对象的一个副本,注意,创建后,就是两个对象,和引用同一个对象不一样。也就是说:x.clone() ! = x为true。

一般情况下,x.clone().getClass() = = x.getClass()为true,x.clone().equals(x)也为真。

如果在对一个对象希望拥有它的全部属性,并且又能随时修改,但同时又不会影响原有的对象,可以使用clone方法,有点类似于SVN的分支。

而且:如果想要对一个对象进行clone,必须实现Cloneable接口,而且要重写clone方法,否则会报CloneNotSupportedException异常。

举例:写一个实体类TestClone

package edu.java.test;

public class TestClone implements Cloneable {
	private String name;
	private String age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}

}
接着编写测试类:

package edu.java.test;

public class TestClone02 {
	public static void main(String[] args) throws CloneNotSupportedException {
		TestClone tc = new TestClone();
		tc.setAge("10");
		TestClone clone = (TestClone) tc.clone();
		System.out.println("tc的hashCode"+tc.hashCode());
		System.out.println("clone的hashCode"+clone.hashCode());
		System.out.println("tc的年龄 = " + tc.getAge());
		System.out.println("tc的clone的年龄 = " + clone.getAge());
		System.out.println(clone == tc);
		System.out.println(clone.equals(tc));
		System.out.println(tc.getClass() + ":" + clone.getClass());
	}
}

最终结果:
tc的hashCode14927396
clone的hashCode31817359
tc的年龄 = 10
tc的clone的年龄 = 10
false
false
class edu.java.test.TestClone:class edu.java.test.TestClone




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值