@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可保证一致,但其性能较差较低