equals、toString.hashCode的重写

 @Override//程序注解:表示为重写方法,重写时必须

两个等价的对象(equals为true),哈希码要相同;如果两个对象hash码不一样,equals必须为false

类中重写equals就必需重写hashCode

public class Student implements Comparable//实现该接口使之可比较(Sorted)
{
	int sno;
	String sname;
	int sage;
	
	@Override
	public int compareTo(Object o)//Compareble接口中的方法
	{
		Student stu=(Student)o;
		return this.sno-stu.sno;
	}
	
	public Student(int sno,String sname,int sage)
	{
		this.sno=sno;
		this.sname=sname;
		this.sage=sage;
	}
	
	@Override//程序注解:表示为重写方法,重写时必须有
	public String toString()
	{
		return sno+":"+sname;
	}
	
	@Override//程序注解:重写
	public boolean equals(Object o)
	{
		if(o==null){//判断是否为空
			return false;
		}
		if(!(o instanceof Student)){//判断是否为该类对象类型
			return false;
		}
		Student stu=(Student)o;
		
		System.out.println (this.sname+"equals"+stu.sname);
		
		if(this.sno==stu.sno&&this.sname.equals(stu.sname)) 
		//有多项要用短路与或进行比较时,比较成本低的(==)放在前边
		{
			return true;
		}
		return true;
	}	
}
----------------------------------------------------------------------------
import java.util.*;

public class TestToString
{
	public static void main(String args[])
	{
		Student stu=new Student(97001,"张三",20);
		System.out.println (stu.toString());
		/*如果类并没有重写toString()方法,会返回类的路径和存储位置
		 **/
	}	
}
--------------------------------------------------------------------
import java.util.*;

public class TestList
{
	public static void main(String args[])
	{
		//<>:泛型,声明元素类型
		List<Student> list=new ArrayList<Student>();
		list.add(new Student(97001,"Tom",21));//按添加顺序从0排序
		list.add(new Student(97002,"Liming",21));
		list.add(new Student(97003,"Dany",21));
		
		System.out.println (list.size());
		System.out.println (list.get(1));
		
		for(Student s:list)
		{
			System.out.println (s);
		}
	}
}
----------------------------------------------------------------------------
public class TestSet
{
	public static void main(String args[])
	{
		Set<Student> set=new HashSet<Student>();
		set.add(new Student(97001,"Tom",21));
		/*添加时会自动equals和hashCode方法(入桶)
		 *当hashCode生成哈希码之后会与同一桶中的各个元素equals比较,如果相同,则不会插                                       入此元素
		 **/
		set.add(new Student(97201,"Liming",21));
		set.add(new Student(97101,"Liming",21));
		set.add(new Student(97102,"Liming",21));
		set.add(new Student(97002,"Dany",21));
		set.add(new Student(97003,"Dany",21));
		/*97001:TomhashCode
		97101:LiminghashCode
		LimingequalsTom
		97102:LiminghashCode
		97002:DanyhashCode
		DanyequalsLiming
		97003:DanyhashCode
		**/
		System.out.println ("------------------------");
		for(Student s:set)//HashSet的遍历顺序不一定与添加顺序一致,LinkedHashSet可保证一致,但其性能较差较低
		{
			System.out.println (s);
		}
	}
}

哈希的理解:将各对象分装到各个不同哈希码代表的哈希桶中方便使用。
hasnCode()方法为生成哈希码的方法 
HashSet的遍历顺序不一定与添加顺序一致,LinkedHashSet可保证一致,但其性能较差较低

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值