关于克隆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表示父类的实现类
*/
}