本帖最后由 HM朱蛟 于 2013-4-19 15:50 编辑
楼主你好,我说下我的看法,不对的请指出,认真学习,共同提高。
笔记:
|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
思路:
Set集合底层是调用的Map集合
HashMap对应的应该是HashSet,数据结构是哈希表,先比hashCode(),再比equals。
TreeMap对应的是TreeSet,数据结构是二叉树,依据compareTo的返回值(为0时)来保证元素唯一性。
代码:(取键值,要么把键导入Set集合,要么把映射关系导入set集合,我认为这实际上还是单个元素在作比较)- /*
- 需求:
- 每一个学生都有对应的归属地。
- 学生student,地址string。
- 学生属性:姓名,年龄。
- 注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
- */
- import java.util.*;
- class Student implements Comparable<Student>
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
-
- public int compareTo(Student s)
- {
- int num = new Integer(this.age).compareTo(new Integer(s.age));
-
- if(num==0)
- return this.name.compareTo(s.name);
-
- return num;
- }
- public int hashCode()//散列算法
- {
- return this.name.hashCode()+this.age*34;
- }
-
- public boolean equals(Object obj)//必须要有2个元素才具备自动调用该方法的前提,并且这里不能指定泛型
- {
- if(!(obj instanceof Student))//若传进来的不是student类
- throw new ClassCastException("类型转换异常"); //直接报异常
-
- Student s = (Student)obj;
-
- return this.name.equals(s.name) && this.age==s.age;
- }
-
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
-
- public String toString()
- {
- //return this.getName()+"..."+this.getAge();
- return this.name+".."+this.age;
- }
- }
- //取出方式1:keySet()
- class MapTestKS
- {
- public static void main(String[] args)
- {
- HashMap<Student,String> map = new HashMap<Student,String>();
-
- map.put(new Student("haha-1",1),"beijing");
- //System.out.println(map.put(new Student("haha-1",1),"nanjing"));//put返回被覆盖的值 beijing
- map.put(new Student("haha-1",1),"nanjing");//Map映射的特性,键相同,新值覆盖旧值
- map.put(new Student("haha-3",3),"tianjing");
-
-
- Set<Student> s = map.keySet();//导出所有的key存入一个set集合
-
- Iterator<Student> it = s.iterator();
-
- while(it.hasNext())
- {
- Student key = it.next();//逐个迭代当前键
- String addr = map.get(key);//取出当前键所对应的值
- System.out.println(key+"......"+addr);//输出
- }
- }
- }
- //取出方式2:Map.Entry
- class MapTestME
- {
- public static void main(String[] args)
- {
- //建立一个映射集合容器
- HashMap<Student,String> hm = new HashMap<Student,String>();
-
- //存入映射元素,夫妻
- hm.put(new Student("hehe-1",21),"yunnan");
- hm.put(new Student("hehe-1",21),"guizhou");//重复键,覆盖
- hm.put(new Student("hehe-3",23),"sichuan");
-
- //通过hm.entrySet(),将这些夫妻的结婚证存入一个容器
- Set<Map.Entry<Student,String>> sme = hm.entrySet();
-
- //迭代,类型为结婚证
- Iterator<Map.Entry<Student,String>> it = sme.iterator();
-
- while(it.hasNext())
- {
- Map.Entry<Student,String> me = it.next();//将来结婚证一个一个的拿出来
-
- System.out.println(me.getKey());//取出结婚证里的丈夫
- System.out.println(me.getValue()); //取出结婚证里的妻子
- }
- }
- }
复制代码 |