本帖最后由 monghuan 于 2011-12-20 15:56 编辑
1.以集合为例,对于HashSet集合,元素不可以重复;对于HashMap集合,其中键是唯一的(即不可重复)。针对这种不可重复,是如何实现的呢?
实际上就是,在元素或键中进行hashCode()和equals()方法的重写。
举例:当重写了Student类的hashCode()和equals()后,- class Student
- {
- String name;
- int age;
- Student(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- public int hashCode()
- {
- return name.hashCode()+age;
- }
- public boolean equals(Object obj)
- {
- if(!(obj instanceof Student))
- return false;
- Student objS = (Student)obj;
- return this.name.equals(objS.name)&&(this.age==objS.age);
- }
- public String toString() //toString()方法一般也会重写,可以重新定义格式
- {
- return name+"-"+age;
- }
- }
复制代码 执行main()中:- HashSet<Student> hs =new HashSet<Student>(); //创建了一个HashSet集合对象,
- hs.add(new Student("Jack",20)); //像集合对象添加元素,第一个元素添加时肯定不会重复
- hs.add(new Student("Jack",21)); //进行第二个元素的添加,这时就会进行元素是否重复的判断,首先计算new Student("Jack",21))对象的hashCode(就是hashCode()方法的返回值),若发现与集合中已存在的元素的hashCode不相同,就直接判断为new Student("Jack",21))这个元素不是重复的,可以添加进集合中;反之,若发现与集合中已存在的元素的hashCode相同,就接着进行equals()方法的判断,根据equals()中的比较细节进行比较(方法的返回值为true,表示元素重复;反之,表示元素不重复),(例子中)比较后发现返回值为false,此时才说明new Student("Jack",21))这个元素不是重复的,存储进集合。
- //hashCode()和equals()的这些比较都是JVM内部进行的
- System.out.println(hs); //打印输出结果:[Jack-21, Jack-20]
-
复制代码 2.在集合中,使用到带有“Hash”关键字的类,一般就需要重写“hashCode()”和“equals()”方法了。 |