clone,finalize,getclass,hashCode,toString,equals
1. clone()
:
深克隆,浅克隆 参考 :https://blog.csdn.net/lovezhaohaimig/article/details/80372233
-
概念: 创建并返回此对象的副本
-
-
注意:
-
对象对应的类需要实现接口
Cloneable
才能支持克隆:implements Cloneable
-
.clone()`:
add throws declaration
-
Cloneable
仅仅是提供一个标记
//1. clone() public class ObjectDemo1 implements Cloneable { private int i=1; public static void main(String[] args) throws CloneNotSupportedException { //创建对象 ObjectDemo1 od = new ObjectDemo1(); //返回Object类型 //选declaration //CloneNotSupportedException:克隆不支持异常 //对象对应的类需要实现:implements Cloneable接口才能支持克隆 //Cloneable接口仅仅是提供了一个标记,实现了这个接口就能支持克隆 ObjectDemo1 od1 = (ObjectDemo1)od.clone(); //克隆对象调用属性 System.out.println(od1.i); //克隆对象是开辟一块新空间,这个空间复制了原空间的所有信息 System.out.println(od==od1);//输出为:false //被protected修饰的信息,子类对象要在子类的本类中使用 ObDemo od2 = new ObDemo(); od2.clone(); } } class ObDemo extends ObjectDemo1 implements Cloneable{ }
-
2.finalize() ——通知GC进行垃圾回收 (对象调用)–———System.gc()
public class ObjectDemo1{ public static void main(String[] args) { ObjectDemo1 od = new ObjectDemo1(); //test.ObjectDemo1------全路径名 System.out.println(od.getClass()); } }
4.hashCode() -------返回的是对象的哈希码值(十进制)
由于哈希码值范围广,散列,基本不会出现数据的重复情况,就是唯一的 就把当作成了地址值
public class ObjectDemo1{ public static void main(String[] args) { ObjectDemo1 od = new ObjectDemo1(); //十进制转十六进制 System.out.println(Integer.toHexString(od.hashCode())); //返回的是十进制的值 //hashCode()返回的就是对象的哈希码值 //哈希码没有负数,哈希码值最大的取值范围是40亿左右 //哈希码值是散列分布的 //由于哈希码值范围广,散列,所有数据重复的概率基本为0,就是唯一的 被当作成了地址值 System.out.println(od.hashCode()); } }
5.toString()---------默认进行拼接对象地址值, 开发中常用的是类中重写Object中的toString方法进行数据拼接。
public class ObjectDemo1{ public static void main(String[] args) { ObjectDemo1 od = new ObjectDemo1(); //返回的是地址值 //println方法会让od对象调用Object里的toString方法 System.out.println(od); //返的是地址值 Object 方法里的toString()用于拼接地址值 System.out.println(od.toString()); } }
对toString进行重写
public class ObjectDemo1{ public static void main(String[] args) { Person1 p = new Person1(); p.age=22; p.gender='女'; p.name = "lili"; System.out.println(p.toString()); } } class Person1{ String name; int age; char gender; //java提供的重写方法 @Override public String toString() { return "Person1 [name=" + name + ", age=" + age + ", gender=" + gender + "]"; } // 自己重写 // @Override // public String toString() { // // return this.name+","+this.gender+","+this.age; // } }
6.equals()————-Object类里的方法,用于判断两个对象是否相等
判断地址值是否相等
public class ObjectDemo1{ public static void main(String[] args) { person1 p1 = new person1(); p1.name= null; p1.gender='女'; p1.age=10; person1 p2 = new person1(); p2.name=null; p2.gender='女'; p2.age=10; System.out.println(p1.equals(p2)); } } class person1{ //属性 String name; int age; char gender; @Override public boolean equals(Object obj) { //1.比较两个对象的地址值是否相等 //this表示本类对象 if(this==obj){ return true; } //2.判断参数是否为Null if(obj==null){ return false; } //3.保证两个对象的类型一致 if(this.getClass()!=obj.getClass()){ return false; } //4.把参数类型强制转换为Person1类型,才能调用到Person的属性 person1 p = (person1)obj; //5.比较属性值是否相等 //判断两个对象的年龄是否相等 if(this.age!=p.age){ return false; } //判断性别是否相等 if(this.gender!=p.gender){ return false; } //判断姓名是否相等 //判断name两个对象的地址值 //this.name是String类型,调用的equals是String类中的 //String中的equals方法,先比较地址值是否相等,若不等,再比较内容是否一致 //this.name为null调用了equals方法就会出现空指针异常 //前面必须加比较地址值的判断是为了避免少算都为null的形式 if(this.name==p.name||this.name!=null&&this.name.equals(p.name)){ return true; } return false ; } }
重写equals方法:之判断地址值不是很严谨,比较对象中的属性(地址值不相等)
自己写:
public class ObjectDemo1{ public static void main(String[] args) { person1 p1 = new person1(); p1.name="lili"; p1.gender='女'; p1.age=10; person1 p2 = new person1(); p2.name="lili"; p2.gender='女'; p2.age=10; System.out.println(p1.equals(p2)); } } class person1{ //属性 String name; int age; char gender; @Override public boolean equals(Object obj) { //1.比较两个对象的地址值是否相等 //this表示本类对象 if(this==obj){ return true; } //2.判断参数是否为Null if(obj==null){ return false; } //3.保证两个对象的类型一致 if(this.getClass()!=obj.getClass()){ return false; } //4.把参数类型强制转换为Person1类型,才能调用到Person的属性 person1 p = (person1)obj; //5.比较属性值是否相等 //判断两个对象的年龄是否相等 if(this.age!=p.age){ return false; } //判断性别是否相等 if(this.gender!=p.gender){ return false; } //判断姓名是否相等 //判断name两个对象的地址值 if(this.name==p.name){ return true; } return false ; } }
java提供的重写-->Generate HashCode() and equals()
public class Person{ public static void main(String[] args) { Student st = new Student(); st.age=10; st.gender='女'; st.name=null; Student st1 = new Student(); st1.age=10; st1.gender='女'; st1.name="lili"; st1.equals(st); } } class Student{ String name; int age; char gender; String nu; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + gender; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((nu == null) ? 0 : nu.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (gender != other.gender) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (nu == null) { if (other.nu != null) return false; } else if (!nu.equals(other.nu)) return false; return true; } }
保存redis相关笔记