day_13_Object(HashCode,toString,Equals,Finalize),
1.Equals
Object 是Java中提供的一个根类
- 无继承父类的类默认继承Object
- Object xxx = new xxx();可以发生多态
- 因为多态的原因,如果一个方法需要传递的数据,我们不能确定数据的类型的时候,可以写Object
- Object中的equals方法
-
public boolean equals(Object obj){
-
return (this == obj);
-
}
- 存在意义 比较两个对象是否相等(一般对于用户来说是比较对象属性,而非地址)
public class _01_Equals {
public static void main(String[] args) {
}
}
class Student{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int age,String name){
super();
this.age = age;
this.name = name;
}
public Student(){
super();
}
// name相等,就代表是同一个学生
public boolean equals(Object obj){
//比较地址,地址相同 肯定是同一个对象
if(this == obj){
return true;
}
//判断是否为当前类类型,不是返回false
if(obj instanceof Student){
//强制转换,比较数据
Student s2 = (Student)obj;
if(name.equals(s2.name)&&age ==s2.age){
return true;
}
}
return false;
}
public boolean a(Object obj){
// 1 比较地址,地址相等 值一定相等,因为都是同一个对象了
if (this == obj) {
return true;
}
// 2 判断类型是否为当前类类型,否则返回false,不同类没有可比性
if (obj instanceof Student) {
// 3 强制转换,比较想要比较的数据
Student s2 = (Student)obj;
// if (name.equals(s2.name) && age == s2.age) {
if (name.equals(s2.name) ) {
return true;
}
}
return false;
}
}
/*比较字符串是否相等
-
应该用 equals 因为 == 比较内存地址
-
并且 String类中 已经重写了equals方法,比较的是值,而不是地址
- 任何的引用类型比较,都必须转换为基本类型比较,除非就是想知道他们内存地址是否一致
public class _02_Equals {
public static void main(String[] args) {
String s1 = new String("123a");
String s2 = new String("123a");
// false
System.out.println(s1 == s2);
// true
System.out.println(s1.equals(s2));
// TODO Auto-generated method stub
}
}
2.toString
/返回该对象的字符串表示形式,可以通过这个方法,把每个对象的数据展示出来,让外界知道
//Object中的toString
// public String toString() {
// return getClass().getName() + “@” + Integer.toHexString(hashCode());
//}
public class _01_toString {
public static void main(String[]args){
String s1 = new String("123a");
//String类中重写了toString
System.out.println(s1);
Person p1 = new Person(18,"张三");
System.out.println(p1);
}
}
class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return"姓名"+name+"年龄"+age;
}
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
}在这里插入代码片
3.HashCode
- hashCode设计目的 : 给每个对象生成一个唯一的标识符
- 同一个对象生成多次hash值,值一定是一样的
- 但不同对象,生成的值,也有可能相同,这样叫哈希冲突
- 既然有哈希冲突的情况,所以 hash就不能保证数据的唯一性 , 怎么办?
-
1 先比较哈希,如果哈希不同,对象则不同
-
2 如果哈希值相同,再比较对象是否相同
- 在java中 可以通过 hashCode和equals来表示对象的唯一性
- hash算法 : 是一种安全的加密算法,把不定长的值,改为定长的值,并且不能保证其唯一性
*/
public class _01_HashCode {
public static void main(String[]args){
_01_HashCode hc = new _01_HashCode();
int hash = hc.hashCode();
System.out.println(Integer.toHexString(hash));
//HashCode._01_HashCode@1
System.out.println(hc);
}
public int hashCode(){
return 1;
}
}在这里插入代码片
4.Finalize
//作用 垃圾被回收之前 自动调用该方法,想做什么,自己覆写 Object
//finalize方法 没有垃圾回收功能,只是用于被回收之前做的一些事而已,回收是JVM去做的,所以程序员就算手动调用这个方法,也只是一个普通的成员方法调用而已,
//和对象回收没有任何关系
// 一般用于做一些对象回收前的数据销毁操作
public class _01_Finalize {
public static void main(String[] args) {
Animal animal = new Animal();
animal = null;
// 程序员只能建议 垃圾回收器回收
// System.gc();
// 如果垃圾过多,不用建议,自动回收
for (int i = 0; i < 9999999; i++) {
new Animal();
}
// TODO Auto-generated method stub
}
}
class Animal {
public void finalize() {
System.out.println(this + " 马上要被回收了");
}
}
在这里插入代码片