Java学习篇之自定义类的相关重写方法

  上篇博客(Java学习篇之Map集合的遍历方法集锦 )中有一段自定义的Student类的代码,期间涉及到了好多重写方法,下面就根据一个新的案例对部分重写方法进行总结,部分说明文字还是体现在了代码注释中:

  自定义Person类:

package hashCode;

public class Person {
	private String name;
	private int age;
	//空参构造,使得用户可以直接实例化一个空参的
	//对象,再利用对象的set方法进行赋值或者利用
	//get方法进行取值(相关方法的写法见本类代码最下方)
	public Person() {
		super();
	}	
	//有参构造,便于用户在实例化的同时进行进行赋值和方法的调用
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}	
	@Override	
	//重写toString方法,不然打印出的是地址	
	public String toString() {
		return name+".."+age;
	}
	//重写的父类equals方法,保证唯一性
	public boolean equals(Object obj){
		if(this==obj){
			return true;
		}
		if (obj==null){
			return false;
		}
		if (obj instanceof Person){
			Person p=(Person)obj;
			return name.equals(p.name) && age==p.age;
		}
		return false;		
	}
	@Override
	//也可以自己重写,保证唯一性
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	//get和set方法,私有变量,对外提供访问接口
	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;
	}
}

  测试类:

package hashCode;
/*
 * 实现存储内容的去重
 */
import java.util.HashSet;

//打印出的结果:[bb..11, aa..11, Aa..11, BB..11]

public class HashCodeTest {
	public static void main(String[] args) {
		HashSet setPerson=new HashSet();
		setPerson.add(new Person("aa",11));
		setPerson.add(new Person("aa",11));
		setPerson.add(new Person("bb",11));
		setPerson.add(new Person("BB",11));
		setPerson.add(new Person("Aa",11));
		setPerson.add(new Person("aa",11));
		setPerson.add(new Person("aa",11));
		System.out.println(setPerson);		
	}	
}

  上述重写的方法有很多,特地说明下重写hashcode(),equals()方法的原因:自定义的类的hashcode()和equals()继承于Object类,其hashcode码为默认的内存地址,这样的话即使含义相同的两个对象,比较也是不相等的,如果不重写hashcode()方法的话。重写hashcode(),equals()方法是为了保证二者的同步关系。

  该案例是比较自定义的Persona类对象,所以需要重写两个方法,该实例就是为了达到去重的目的,所以测试类中用的是set接口下的实现类HashSet类,我尝试将测试类代码中的HashSet那句话换成了如下:  

List setPerson=new ArrayList();

  得到的结果就不是去重的了,而是原样打印出来,所以说,set接口的特性(不存储重复元素)的原因也许就在于这里,度娘的意思貌似是和hash有关的自定义类都会用到这两个方法进行重写比较,而且给出了结论:对于equals()相等的两个对象,其hashCode()返回的值一定相等。

  要是对以上内容还是模糊,就记住下面的话吧!比较两个对象是否相等的时候,先看哈希值(利用hashCode()方法),哈希值相同再比较内容(利用equals()方法),双重限定


你可能感兴趣的:(●,编程语言,———【Java】,携手Java)