day14 方法重写和多态(二)

1. 重写hashCode()

hashCode属于一种杂凑算法:是指将一些杂乱的条件拼凑在一起计算出来一个值

Java中hash值是根据地址加上其他的一些条件所计算出来的一个十进制的数值

为什么要重写hashCode?

因为在一些散列数据结构中,是根据两个对象的equals比较为true,并且hashCode相同,

则认为是重复的对象,这种规则来存储元素的。所以我们在实际开发中,通常重写了equals方法,也会重写hashCode

package com.qfedu.test1;
/**
 * 	hashCode hash值  
 * 	hashCode属于一种杂凑算法:是指将一些杂乱的条件拼凑在一起计算出来一个值
 * 	Java中hash值是根据地址加上其他的一些条件所计算出来的一个十进制的数值
 * 
 * 	为什么要重写hashCode?
 * 		因为在一些散列数据结构中,是根据两个对象的equals比较为true,并且hashCode相同,
 * 		则认为是重复的对象,这种规则来存储元素的。所以我们在实际开发中,通常重写了equals方法,也会重写hashCode
 * 	
 * @author WHD
 *
 */
public class Person {
	private String name;
	private String idCard;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getIdCard() {
		return idCard;
	}
	public void setIdCard(String idCard) {
		this.idCard = idCard;
	}
	
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		Person p1 = (Person) obj;
		if(this.getName().equals(p1.getName()) && this.getIdCard().equals(p1.getIdCard())) {
			return true;
		}
		return false;
	}
	
	
	/**
	 * 	我们要重写为 当equals比较为true
	 * 	hashCode必须相同
	 * 
	 * 	分析:因为我们现在要求 当equals比较为true  则hashCode相同
	 * 	并且equals方法是根据名字和身份证号来计算的
	 * 	所以我们可以将hashCode方法也重写为根据名字和身份证号来计算
	 * 
	 * 	问题
	 * 	1.result在计算过程中进行了重新赋值 不存在两个result
	 * 	2.我们改变完hashCode以后 地址是没有改变 也是不可能改变的
	 */
	public int hashCode() {
		int prime = 31; // 权重 
		int result = 1;
		result = prime * result + (this.getName() == null ? 0 : this.getName().hashCode());
		result = prime * result + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
		return result;
//		return 99 * 99 + this.getName().hashCode() + this.getIdCard().hashCode();
	}
	
	
	
	public Person(String name, String idCard) {
		this.name = name;
		this.idCard = idCard;
	}
	public Person() {
	}
	public static void main(String[] args) {
//		Person p1 = new Person();
//		Person p2 = p1;
//		System.out.println(p1.equals(p2));
//		System.out.println(p1.hashCode());
//		System.out.println(p2.hashCode());
		
		
		Person p3 = new Person("赵四", "4512487812142453");
		Person p4 = new Person("赵四", "4512487812142453");
		System.out.println(p3.equals(p4));
		System.out.println(p3.hashCode());
		System.out.println(p4.hashCode());
		
		System.out.println(p3 == p4);
		
		
	}
}

2. hashCode权重(了解)

为什么在计算hashCode的时候使用31作为权重?

31是一个特殊的质数

任何数乘以31 等于 这个数 左移5位 减去这个数本身

左移几位表示乘以2的几次方

右移几位表示除以2的几次方

综上所述,因为使用31计算hashCode 使用位运算符参与运算 效率比较高

3. getClass()

getClass方法可以获取当前对象信息 包名 + 类名

package com.qfedu.test2;
/**
 * 	getClass方法可以获取当前对象信息 包名 + 类名
 * @author WHD
 *
 */
public class Student {
	public static void main(String[] args) {
		Student stu = new Student();
		System.out.println(stu);
		System.out.println(stu.getClass());
		System.out.println(stu.getClass().toString());
		
		System.out.println(stu.getClass().getName());
		
	}
}

4. 类类型的属性

我们在实际开发中,通常需要使用自定义的数据类型来存储数据,这样更合适。

package com.qfedu.test3;
/**
 * 	姓名
 * 	年龄
 * 	身高
 * 	性别
 * 	地址
 * @author WHD
 *
 */
public class Person {
	private String name;
	private int age;
	private double height;
	private String sex;
	private Address address;
	private Hobby[] hobbies; // String [] strs
	public void setHobbies(Hobby [] hobbies) {
		this.hobbies = hobbies;
	}
	public Hobby[] getHobbies() {
		return hobbies;
	}
	
	
	public void setAddress(Address address) {
		this.address = address;
	}
	public Address getAddress() {
		return address;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String toString() {
		return "Person[name=" + name + ",age=" + age + ",sex=" + sex + ",height=" + height + ",address=" + address + "]";
	}
}
package com.qfedu.test3;

public class Address {
	private String province;
	private String city;
	private String area;
	private String street;
	private String zipCode;
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getArea() {
		return area;
	}
	public void setArea(String area) {
		this.area = area;
	}
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getZipCode() {
		return zipCode;
	}
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}
	@Override
	public String toString() {
		return "Address [province=" + province + ", city=" + city + ", area=" + area + ", street=" + street
				+ ", zipCode=" + zipCode + "]";
	}
	
	
	
}
package com.qfedu.test3;

public class Hobby {
	private String hobbyType;
	private String hobbyName;
	public String getHobbyType() {
		return hobbyType;
	}
	public void setHobbyType(String hobbyType) {
		this.hobbyType = hobbyType;
	}
	public String getHobbyName() {
		return hobbyName;
	}
	public void setHobbyName(String hobbyName) {
		this.hobbyName = hobbyName;
	}
	@Override
	public String toString() {
		return "Hobby [hobbyType=" + hobbyType + ", hobbyName=" + hobbyName + "]";
	}

}
package com.qfedu.test3;

import java.util.Arrays;

public class TestPerson {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.setName("赵四");
		p1.setAge(20);
		p1.setHeight(175);
		p1.setSex("男");
		
		Address address = new Address();
		address.setProvince("河南省");
		address.setCity("郑州市");
		address.setArea("二七区");
		address.setStreet("长江路街道");
		address.setZipCode("450003");
		
		p1.setAddress(address);
		
		Hobby [] hobbies = new Hobby[3];
		
		hobbies[0] = new Hobby();
		hobbies[0].setHobbyType("文艺类");
		hobbies[0].setHobbyName("唱歌");
		
		hobbies[1] = new Hobby();
		hobbies[1].setHobbyType("体育类");
		hobbies[1].setHobbyName("篮球");
		
		hobbies[2] = new Hobby();
		hobbies[2].setHobbyType("电子竞技类");
		hobbies[2].setHobbyName("贪吃蛇");
		p1.setHobbies(hobbies);
		
		Hobby [] hs  = p1.getHobbies();
		for (int i = 0; i < hs.length; i++) {
			System.out.println(hs[i].getHobbyType() + "----" + hs[i].getHobbyName());
		}
		System.out.println("-----------------------------------");
		System.out.println(Arrays.toString(p1.getHobbies()));
		
		
		
		
		
		System.out.println("-----------------------------------");
		System.out.println("名字:" + p1.getName());
		System.out.println("省份是:" + p1.getAddress().getProvince());
		System.out.println("城市是:" + p1.getAddress().getCity());
		
		System.out.println("地址信息是:" + p1.getAddress());
		System.out.println("-----------------------------------");
		System.out.println(p1);
		
		
	}
}

请雅清同学过目!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值