2021-01-18

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 + " 马上要被回收了");
	}
}

在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值