黑马程序员技术交流社区

标题: 有hashCode和equals方法,compareTo方法,为什么还能添加重复元素 [打印本页]

作者: yangruijing    时间: 2015-3-10 11:46
标题: 有hashCode和equals方法,compareTo方法,为什么还能添加重复元素
package jihe01;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MapDemo4 {

        public static void main(String args[]){
                method();
        }
        public static void method(){
                HashMap<String ,List<student2>> csdn=new HashMap<String, List<student2>>();
                List<student2> yure=new ArrayList<student2>();
                List<student2> jiuye=new ArrayList<student2>();
                csdn.put("yure",yure);
                csdn.put("jiuye",jiuye);
                yure.add(new student2("01","zhangsan"));
                yure.add(new student2("02","lisi"));
                yure.add(new student2("01","zhangsan"));
                jiuye.add(new student2("01","wangwu"));
                jiuye.add(new student2("02","zhaoliu"));
                Iterator<String > it=csdn.keySet().iterator();
                while(it.hasNext()){
                        String roomName=it.next();
                        List<student2> room=csdn.get(roomName);
                        sop(roomName);
                        getStu(room);
                       
                }
        }
        public static void getStu(List<student2> room){
                Iterator<student2> it=room.iterator();
                while(it.hasNext()){
                        sop(it.next());
                }
        }
        public static void sop(Object obj){
                System.out.println(obj);
        }
}
class student2 implements Comparable<student2>{
        private String id;
        private String name;
        public student2(String id,String name){
                this.id=id;
                this.name=name;
        }
        public String toString(){
                return id+"..."+name;
        }
        public int compareTo(student2 student){
                int num=new Integer(id.hashCode()).compareTo(new Integer(student.id.hashCode()));
                if(num==0)
                        return name.compareTo(student.name);
                return num;
        }
        public int hashCode(){
                return name.hashCode()+id.hashCode();
        }
        public boolean equals(Object obj){
                if(!(obj instanceof student2))
                        throw new ClassCastException("类型不匹配");
                student2 student=(student2)obj;
                return name.equals(student.name) && id.equals(student.id);
        }
}
为什么还能将重复元素添加进来


捕获.JPG (29.91 KB, 下载次数: 7)

捕获.JPG

作者: yangruijing    时间: 2015-3-10 12:25
我知道不是这么写的,老师在写这段程序时,并没有在student类中复写hashCode和equals方法,也没有实现comparable接口,我就是想知道这样做能不能保证集合中数据的唯一性
作者: z47057554    时间: 2015-3-10 13:13
本帖最后由 z47057554 于 2015-3-10 13:20 编辑

      你把元素的存储关系弄混了,你的student2是存储于ArrayLiat中的,Map管不到它里面的ArrayList是不是有重复元素的。
      Map能管的是<String ,List<student2>> 中的String,和 List<student2>>(看好,是List,不是student2),
      换句话说,你的student2是存储于ArrayList中的,而student2中的hashCode和equals方法,实现comparable接口对ArrayList来说是没有用的,
      至于你把ArrayList存于Map中,Map看的是ArrayList的hashCode和equals方法,
      另外说下,存放于HashSet和HashMap(以Hash开头的容器)时用到的是hashCode和equals方法,存放于TreeSet和TreeMap(以Tree开头的容器)时用到的是实现comparable接口,当然全部写上最好






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2