黑马程序员技术交流社区

标题: Map总结 [打印本页]

作者: 小K哥    时间: 2016-5-6 22:38
标题: Map总结
一:Map的功能概述:
(一)Map集合的特点:
                将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(二)注意:
                  Map集合的数据结构值针对键有效,跟值无关                        
                Collection集合的数据结构是针对元素有效
(三)Map集合的方法概述:
                  1:添加功能
                                  V put(K key,V value):添加元素。如果键是第一次存储,就直接存储元素,返回null
                                                                        如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
                  2:删除功能
                                  void clear():移除所有的键值对元素
                                  V remove(Object key):根据键删除键值对元素,并把值返回
                  3:判断功能
                                  boolean containsKey(Object key):判断集合是否包含指定的键
                                  boolean containsValue(Object value):判断集合是否包含指定的值
                                  boolean isEmpty():判断集合是否为空
                  4:获取功能
                                  Set<Map.Entry<K,V>> entrySet():返回此映射中包含的映射关系的 Set 视图
                                  V get(Object key):根据键获取值
                                  Set<K> keySet():获取集合中所有键的集合
                                  Collection<V> values():获取集合中所有值的集合
                  5:长度功能
                                  int size():返回集合中的键值对的对数
(四)Map集合的两种遍历方式:
                Map集合的遍历:
                                方式一:                       
                                                  A:获取所有的键
                                                        :Set<K> keySet():获取集合中所有键的集合
                                                  B:遍历键的集合,获取得到每一个键
                                                  C:根据键去找值
                         
                                方式二:                                                       
                                                  A:获取所有键值对对象的集合
                                                        :Set<Map.Entry<K,V>> entrySet():返回的是键值对对象的集合
                                                  B:遍历键值对对象的集合,得到每一个键值对对象
                                                  C:根据键值对对象获取键和值       
(五)Map集合和Collection集合的区别?
                  Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
                  Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。                                               
二:HashMap(Map的子类)的功能概述:

(一)是基于哈希表的Map接口实现。
                        哈希表的作用是用来保证键的唯一性的。
                       
(二)Hashtable和HashMap的区别?
                          Hashtable:线程安全,效率低。不允许null键和null值
                          HashMap:线程不安全,效率高。允许null键和null值
                  
(三)List,Set,Map等接口是否都继承子Map接口?
                          List,Set不是继承自Map接口,它们继承自Collection接口
                          Map接口本身就是一个顶层接口
                          
三:TreeMap(Map的子类)的功能概述:
(一)TreeMap:是基于红黑树的Map接口的实现。
                有两种排序方式:
                                A:自然排序(元素具备比较性)
                                        让元素所属的类实现自然排序接口 Comparable
                                B:比较器排序(集合具备比较性)
                                        让集合的构造方法接收一个比较器接口的子类对象 Comparator
                                       
四:LinkedHashMap(HashMap的子类)的功能概述:
(一)是Map接口的哈希表和链表实现,具有可预知的迭代顺序。
                        由哈希表保证键的唯一性
                        由链表保证键盘的有序(存储和取出的顺序一致)
五:例子部分:
(一)
                代码实现:(Student类省略,有name\age)       
                        public class TreeMapDemo2 {
                                                public static void main(String[] args) {
                                                        // 创建集合对象
                                                        TreeMap<Student, String> tm = new TreeMap<Student, String>(
                                                                        new Comparator<Student>() {
                                                                                @Override
                                                                                public int compare(Student s1, Student s2) {
                                                                                        // 主要条件
                                                                                        int num = s1.getAge() - s2.getAge();
                                                                                        // 次要条件
                                                                                        int num2 = num == 0 ? s1.getName().compareTo(
                                                                                                        s2.getName()) : num;
                                                                                        return num2;
                                                                                }
                                                                        });
                                                        // 创建学生对象
                                                        Student s1 = new Student("潘安", 30);
                                                        Student s2 = new Student("柳下惠", 35);
                                                        Student s3 = new Student("唐伯虎", 33);
                                                        Student s4 = new Student("燕青", 32);
                                                        Student s5 = new Student("唐伯虎", 33);
                                                        // 存储元素
                                                        tm.put(s1, "宋朝");
                                                        tm.put(s2, "元朝");
                                                        tm.put(s3, "明朝");
                                                        tm.put(s4, "清朝");
                                                        tm.put(s5, "汉朝");
                                                        // 遍历
                                                        Set<Student> set = tm.keySet();
                                                        for (Student key : set) {
                                                                String value = tm.get(key);
                                                                System.out.println(key.getName() + "---" + key.getAge() + "---"
                                                                                + value);
                                                        }
                                                }
                                        }
(二)键盘录入2个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台
                  分析:
                   A:创建学生类
                   B:创建键盘录入
                   C:创建TreeSet集合,用集合存储学生对象
                   D:用Comparator类排序
                   E:遍历集合
                代码实现:
                        public class TreeSetDemo2 {
                                public static void main(String[] args) {
                                        //创建键盘录入
                                        Scanner reader=new Scanner(System.in);
                                        TreeSet<Student> ts=new TreeSet<Student>(new Comparator<Student>() {
                                                @Override
                                                public int compare(Student s1, Student s2) {
                                                        int num=s2.getSum()-s1.getSum();
                                                        int num2=num==0?s1.getName().compareTo(s2.getName()):num;
                                                        int num3=num2==0?s1.getChinese()-s2.getChinese():num2;
                                                        int num4=num3==0?s1.getMath()-s2.getMath():num3;
                                                        int num5=num4==0?s1.getEnglish()-s2.getEnglish():num4;
                                                        return num5;
                                                }
                                        });
                                        for(int i=1;i<=2;i++){
                                                System.out.println("请输入第"+i+"个学生的信息");
                                                System.out.println("请输入姓名:");
                                                String name=reader.nextLine();
                                                System.out.println("请输入语文成绩:");
                                                Integer chinese=Integer.valueOf(reader.nextLine());
                                                System.out.println("请输入数学成绩:");
                                                Integer math=Integer.valueOf(reader.nextLine());
                                                System.out.println("请输入英语成绩:");
                                                Integer english=Integer.valueOf(reader.nextLine());
                                                Student s=new Student();
                                                s.setName(name);
                                                s.setChinese(chinese);
                                                s.setMath(math);
                                                s.setEnglish(english);
                                                //创建TreeSet集合,用集合存储学生对象
                                                ts.add(s);               
                                        }
                                        // 遍历集合
                                        System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩");
                                                        for (Student s : ts) {
                                                                System.out.println(s.getName() + "\t" + s.getChinese() + "\t"
                                                                                + s.getMath() + "\t" + s.getEnglish());
                                                        }
                                }
                        }
(三)需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
                  分析:
                  A:创建键盘录入
                  B:用字符串接收键盘录入数据
                  C:把字符串转出字符数组
                  D:遍历字符数组
                  E:创建TreeMap集合
                  F:把遍历的的每一个字符和TreeMap的键比较.
                                                  相同:值加一
                                                  不相同:添加,并且值为一
                  G:遍历集合
        代码实现:
                public class TreeMapDemo3 {
                        public static void main(String[] args) {
                                //创建键盘录入
                                Scanner reader=new Scanner(System.in);
                                //用字符串接收键盘录入数据
                                String s=reader.nextLine();
                                //把字符串转出字符数组
                                char[] ch=s.toCharArray();
                                //创建TreeMap集合
                                TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
                                //遍历字符数组
                                for(char c:ch){
                                        Integer num=tm.get(c);
                                        if(num==null){
                                                tm.put(c, 1);//不相同:添加,并且值为一
                                        }else{
                                                num++;//相同:值加一
                                                tm.put(c, num);
                                        }
                                }
                                //遍历集合
                                Set<Character> set=tm.keySet();
                                StringBuffer sb=new StringBuffer();
                                for(Character key:set){
                                        sb.append(key).append("(").append(tm.get(key)).append(")");               
                                }
                                System.out.println(sb.toString());
                        }
                }




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