3.集合-Map

1.Map接口实现类的特点

注意:这里讲的是JDK8的Map接口特点

  1. Map与Collection并列存在,用于保存具有映射关系的数据key-value;
  2. Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中;
  3. Map中的key不允许重复;
  4. Map中的value可以重复;
  5. Map的key可以为null,value也可以为null,注意key为null只能有一个,value为null,可以多个;
  6. 常用String类作为Map的key;
  7. key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value;
  8. Map存放数据的key-value,一对k-v是放在一个Node中的,又因为Node实现了Enty接口,有些书上也说,一对k-v就是一个Entry。

1.EntrySet介绍

  1. k-v 最后是 HashMap$Node node = new Node(hash,key,value,null);
  2. k-v为了方便程序员遍历,还会创建EntrySet集合,该集合存放的元素类型是Entry,而Entry对象就有k-v【EntrySet<Entry<K,V>>】。
  3. entry中,定义的类型是Map.Entry ,但是实际上存放的还是HashMap N o d e , 这 是 因 为 H a s h M a p Node,这是因为HashMap NodeHashMapNode implments Map.Entry。
  4. 当把HashMap$Node对象存放到EntrySet就方便我们遍历了,因为Map.Entry提供了重要的方法getKey()和getValue()。

2.Map接口常用方法

  1. put 添加
  2. remove 根据键删除映射关系
  3. get 根据键获取值
  4. size 获取元素个数
  5. isEmpty 判断个数是否为0
  6. containsKey 查找键是否存在

3.Map接口遍历方法

  1. containsKey 查找键是否存在
  2. keySet 获取所有的键
  3. entrySet 获取所有关系
  4. values 获取所有的值

1.keySet遍历

        Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");

        //第一组:先取出所有的key,通过key取出对应的value
        Set keyset = map.keySet();
        //1.增强for
        for(Object key:keyset){
            System.out.println(key + "-" + map.get(key));
        }

        //2.迭代器
        Iterator iterator = keyset.iterator();
        while (iterator.hasNext()){
            Object key = iterator.next();
            System.out.println(key + "-" + map.get(key));
        }

2.values遍历

        Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");
        //第二组,把所有的values取出来
        Collection values = map.values();
        //这里可以使用所有的Collections使用的遍历方法
        //1.增强for
        //取出所有的值
        for(Object value:values){
            System.out.println(value);
        }

        //2.迭代器
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()){
            Object value = iterator1.next();
            System.out.println(value);
        }

3.EntrySet遍历

        Map map = new HashMap();
        map.put("A","1");
        map.put("B","2");
        map.put("C","3");
        map.put("D","4");
        //第三组,通过EntrySet 来获取k-v
        Set entrySet = map.entrySet();
        //1.增强for
        for (Object entry : entrySet){
            //将entry转成Map.Entry
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey() + "-" + m.getValue());
        }

        //2.迭代器
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            Map.Entry m = (Map.Entry) iterator2.next();
            System.out.println(m.getKey() + "-" + m.getValue());
        }

4.HashMap小结

  1. Map接口的常用实现类:HashMap、hashtable、properties;
  2. HashMap是Map接口使用频率最高的实现类;
  3. HashMap是以key-value对的方式存储数据;
  4. key不能重复,但是值矿业重复,允许使用null键和null值;
  5. 如果添加相同的key,则会覆盖原来的值;
  6. 与hashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的;
  7. HashMap没有实现同步,因此是线程不安全的。

5.HashTable的基本介绍

  1. 存放的元素时键值对:即K-V;
  2. hashtable的键和值都不能为null;
  3. hashtable使用方法基本上和HashMap一样;
  4. hashtable是线程安全,HashMap是线程不安全;

1.HashTable底层简单说明

  1. 底层有数组Hashtable$Entry[] 初始化大小为11;
  2. threshold 8 = 11 * 0.75;临界值
  3. 扩容:(前容量*2)+1 ;

6.Hashtable和HashMap对比

版本线程安全(同步)效率允许null键null值
HashMap1.2不安全可以
Hashtable1.0安全较低不可以

7.Properties

  1. Properties类继承自Hashtable 类并且实现了Map接口,也是使用一种键值对的形式来保存数据;
  2. 它的使用特点和Hashtable类似;
  3. Properties还可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改;

8.开发中如何选择集合实现类

  1. 先判断存储的类型(一组对象或一组键值对);

  2. 一组对象:Collection接口
    允许重复:List
    增删多:LinkedList【底层维护了一个双向链表】
    改查多:ArrayList 【底层维护了Object类型的可变数组】
    不允许重复:Set
    无排序:HashSet 【底层是HashMap ,维护了一个哈希表,即数组+链表+红黑树】
    排序: TreeSet
    插入和取出顺序一致:LinkedHashSet (底层是LinkHashMap(底层是HashMap))【维护数组+双向链表】

  3. 一组键值对:Map
    键无序: HashMap 【底层是:哈希表;jdk7:数组+链表;jdk8:数组+链表+红黑树】
    键排序:TreeMap
    键插入和取出顺序一致:LinkedHashMap
    读取文件:Properties

9.TreeSet和TreeMap排序

1.TreeSet

//排序
        TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //调用Sting的compareTo方法比较大小
                return ((String)o2).compareTo((String)o1);
            }
        });

        treeSet.add("a");
        treeSet.add("b");
        treeSet.add("c");
        treeSet.add("d");

        System.out.println(treeSet);

2.TreeMap

 //[排序
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //调用Sting的compareTo方法比较大小
                return ((String)o1).compareTo((String)o2);
            }
        });
        treeMap.put("a","1");
        treeMap.put("b","2");
        treeMap.put("c","3");
        treeMap.put("d","4");

10.Collections工具类

1.Collections工具类介绍

  1. Collections是一个操作Set、List和Map等集合的工具类;
  2. Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作。

2.排序操作

  1. reverse(List):反转List中元素的排序;
  2. shuffle(List):对List集合元素进行随机排序;
  3. sort(List):根据元素的自然顺序对指定List集合元素按升序排序;
  4. sort(List、Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序;
  5. swap(List、int、int):将指定List集合中的i处元素和j处元素进行交换。

3.查找与替换操作

  1. Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素;
  2. Object max(Collection , Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素;
  3. Object min(Collection);
  4. Object min(Collection , Comparator);
  5. int frequency(Collection , Object):返回指定集合中指定元素的出现次数;
  6. void copy(List dest , List src):将src中的内容复制到dest中;
  7. boolean replaceAll(List list , Object oldVal , Object newVal):使用新值替换List对象的所有旧值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值