hashCode & clone

关于克隆clone 及 hashCode相关知识点
1.克隆clone知识点:
   1.1 相当于对原对象进行复制
   1.2 本体代码修改不会影响副本的创建过程,维护性好
        /*
         * 重写继承自Object中的克隆方法
         *    1.让该类实现java.lang.Cloneable接口
         *    2.将clone方法的访问权限扩大为public
         *    3.将clone方法的返回值类型缩小为Person类型
         *    4.强制将return后的返回值转换为Person类型  
         */
2.    关于hashCode的相关知识点(必须记住):
    2.1  hashCode jvm(java虚拟机)依据hashCode区分内存中的对象
    2.2 hashCode的生成规律:
     /*
     *    1.以对象内存地址为基础生成hashCode:
     *       在默认情况下(没有重写Object中的hashCode方法),此时hashCode以对象的内存地址为基础生成
     *       此时,hashCode相同的对象,在内存中一定是同一个.即,如果两个对象的变量生成的hashCode是同一个
     *       值,那么,在内存中两个变量是指向同一个对象的.
     *       如下p 和 p2 在内存中就是指向同一个对象  而p3则是在内存中红指向另一个对象,哪怕值是相同的
     *       
     *    2.以内容为基础生成hashCode   
     *       内存中的两个对象,如果内容相同,则hashCode一定相同
     *          程序实例:StringHashCodeTest.java
     *
     *       测试结果:八大基本类型的包装类+String类都是以内容为基础生成hashCode  
     */
    2.3 hashCode要点归纳: 
     /*     前提条件:没有重写Object方法中的hashCode方法
     *         1.同一个对象,无论有多少个引用对象,生成的hashCode一定相同      正确
     *         2.hashCode 不同的两个内存对象,一定不是同一个对象              正确
     *         3.hashCode相同的两个对象,一定不是同一个对象                   错误(以内容为基础生成hashCode)      
     */

代码示例如下:

public class Test {
	public static void main(String[] args) {
		/*
		 * 克隆数据的测试类
		 */
		
		try {
			Person p = new PersonImpl("123","zhangzhang");
			Person p2 = p;
			Person p3 = new PersonImpl("123", "zhangzhang");
			System.out.println("----------克隆原数据---------");
			p.showinfo();
			System.out.println("p hashCode is "+p.hashCode());
			System.out.println("p2 hashCode is "+p2.hashCode());
			System.out.println("p3 hashCode is "+p3.hashCode());
			
			/*
			 * 当两个变量引用的内存对象相同时,若做两个变量的等值判断,那么返回 true
			 *          若不相同,则返回false
			 */
			boolean tag1 = p==p2;
			System.out.println("tag1="+tag1);
			boolean tag2 = p==p3;
			System.out.println("tag2 ="+tag2);
			
			System.out.println("--------克隆的数据----------");
			Person s= p.clone();
			s.showinfo();
			System.out.println(s.hashCode());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

public class Person implements Cloneable
{
	private String pid = null;
	private String pname = null;
	public Person(String pid,String name) 
	{
		this.pid = pid;
		this.pname = name;
	}
	public void showinfo()
	{
		System.out.println("this.pid =="+pid);
		System.out.println("this.pname=="+pname);
	}
	
	/*
	 * 重写继承自Object中的克隆方法
	 *    1.将clone方法的访问权限扩大为public
	 *    2.将clone方法的返回值类型缩小为Person类型
	 *    3.强制将return后的返回值转换为Person类型
	 */
	@Override
	public Person clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return (Person)super.clone();
	}
}

PersonImpl类
public class PersonImpl extends Person
{

	public PersonImpl(String pid, String name) {
		super(pid, name);
		// TODO Auto-generated constructor stub
	}
	/*
	 * 注意该类的命名方式:为继承的父类的名字加上impl表示父类的实现类
	 */
}

 

你可能感兴趣的:(Java学习)