• java集合之Map及Collections工具类详解


    java高级之集合

    Map接口

    概述

    • Map接口与Collection接口并列,Collection集合中的元素是独立存在的,而Map集合中的元素是成对存在的,它用于保存具有映射关系的键-值对:key-value;因此可以将Collection集合称为单列集合Map集合称为双列集合
    • Map 中的 keyvalue 可以是任何引用类型的数据;Map 中的 key 值不允许重复,使用Set来存放,因此,同一个 Map 对象所对应的类,必须重写hashCode()equals()方法。
    • 如果Map中的key值是一个对象的话,如果不重写hashCode()equals()方法,那这两个key的hashcode永远都不可能相等,因为这两个对象实例的内存地址是不同的,因此我们为了达到逻辑上的相等,需要重写这两个方法。
    • Map接口的常用实现类:HashMapTreeMapLinkedHashMapProperties

    常用方法

    • map常用的方法总结
    方法的返回值 方法名 方法的描述
    V put(K key, V value) 添加/修改 key-value 到当前map中。
    void putAll(Map m) 将m中的所有key-value对存放到当前map中
    V remove(Object key) 移除指定key的key-value对,并返回value
    void clear() 清空当前map中的所有数据 只剩{}
    V get(Object key) 获取指定key对应的value
    boolean containsKey(Object key) 是否包含指定的key
    boolean containsValue(Object value) 是否包含指定的value
    int size() 返回map中key-value对的个数
    boolean isEmpty() 判断当前map是否为空
    boolean equals(Object o) 判断当前map和参数对象obj是否相等
    • 代码试验如下:

      @Test
      public void testMap1(){
          Map map = new HashMap();
          //1、 Object put(Object key,Object value):添加/修改 key-value 到当前map中。
          map.put("AAA", 123);
          map.put("BBB", 456);
          map.put("CCC", 789);
          map.put("AAA", 233);
          //2、void putAll(Map m): 将m中的所有key-value对存放到当前map中
          Map map1 = new HashMap();
          map1.put("DDD", 444);
          map1.put("EEE", 555);
          map.putAll(map1);
          System.out.println(map);
          //3、Object remove(Object key):移除指定key的key-value对,并返回value
          Object value = map.remove("EEE");
          System.out.println(value);
          //4、void clear():清空当前map中的所有数据 只剩{}
          map.clear();
          System.out.println(map);
          //5、Object get(Object key):获取指定key对应的value
          System.out.println(map.get("DDD"));
          //6、boolean containsKey(Object key):是否包含指定的key
          System.out.println(map.containsKey("BBB"));
          //7、boolean containsValue(Object value):是否包含指定的value
          System.out.println(map.containsValue(444));
          //8、int size():返回map中key-value对的个数
          System.out.println(map.size());
          //9、boolean isEmpty():判断当前map是否为空
          System.out.println(map.isEmpty());
          //10、boolean equals(Object obj):判断当前map和参数对象obj是否相等
          Map map2 = new HashMap();
          map2.put("DDD", 444);
          map2.put("EEE", 555);
          Map map3 = new HashMap();
          map3.put("DDD", 444);
          map3.put("EEE", 555);
          System.out.println(map2.equals(map3));
      }
      
    • 遍历map的常用方法

      方法的返回值 方法名 方法的描述
      Set<K> keySet() 返回所有key构成的Set集合
      Collection<V> values() 返回所有value构成的Collection集合
      Set<Map.Entry<K,V>> entrySet() 返回所有key-value对构成的Set集合
    • 代码试验如下

      @Test
      public void testMap2(){
          Map map = new HashMap();
          map.put("AAA", 123);
          map.put("BBB", 456);
          map.put("CCC", 789);
          map.put("DDD", 333);
          map.put("EEE", 444);
          //11、Set keySet():返回所有key构成的Set集合
          Set set = map.keySet();
          Iterator iterator = set.iterator();
          while (iterator.hasNext()){
              System.out.println(iterator.next());
          }
          //12、Collection values():返回所有value构成的Collection集合
          Collection values = map.values();
          System.out.println(values);
          //13、 Set entrySet():返回所有key-value对构成的Set集合
          Set entrySet = map.entrySet();
          Iterator iterator1 = entrySet.iterator();
          while (iterator1.hasNext()){
              Map.Entry entry = (Map.Entry)iterator1.next();
              System.out.println("key = "+ entry.getKey() + ",value = " + entry.getValue());
          }
      }
      

    Map存储数据的结构分析

    • Map集合存储的是key-value键-值对,如上遍历map时的三个方法中,keySet()方法的返回值是Set,values()方法的返回值是CollectionentrySet()的返回值中的泛型是Map.Entry,那么我们可以用一张图形象的概括:

      image-20200817220326795

    实现类

    HashMap

    • HashMap允许使用null键和null值,不记录映射的顺序。

    • HashMap的存储结构:

      • JDK 7及以前版本:HashMap是数组+链表结构;
      • JDK 8版本及以后:HashMap是数组+链表+红黑树实现。

    LinkedHashMap

    • LinkedHashMapHashMap 的子类,在HashMap存储结构的基础上,使用了一对双向链表来记录添加
      元素的顺序,维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。

      static class Entry<K,V> extends HashMap.Node<K,V> {
       		 //多出来的before, after 可以记录添加的元素的先后顺序
           Entry<K,V> before, after;
           Entry(int hash, K key, V value, Node<K,V> next) {
              super(hash, key, value, next);
           }
      }
      

    TreeMap

    • TreeMap存储数据时,要求key必须是由同一个类创建的对象,它会根据 key-value 对进行排序, 可以保证所有的 key-value 对处于有序状态;
    • TreeMapKey 的排序分为自然排序和定制排序。
      • 自然排序:Key 必须实现 Comparable 接口并重写compareTo()方法;
      • 定制排序:创建 TreeMap 时,传入一个 Comparator 对象,对象重写compare()方法。
      • 详情见:集合1中的treeSet实现类。

    Hashtable

    • Hashtable是线程安全的,不允许使用 null 作为 keyvalue,不能保证其中 key-value 对的顺序。

    Properties

    • Properties 类是 Hashtable 的子类,它主要用于处理属性文件,由于属性文件文件中的key
      value 都是字符串类型,故Properties 里的 keyvalue 也都是字符串类型。

    Collections工具类

    概述

    • Collections 是一个操作 SetListMap 等集合的工具类;
    • Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作;
    • Collections 提供了对集合对象实现同步控制等方法。

    常用方法

    方法的返回值 方法名 方法的描述
    static void reverse(List<?> list) 反转 List 中元素的顺序
    static void shuffle(List<?> list) 对 List 集合元素进行随机排序
    static <T extends Comparable<? super T>>void sort(List<T> list) 根据元素的自然顺序对指定 List 集合元素按升序排序
    static <T> void sort(List<T> list, Comparator<? super T> c) 根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
    static void swap(List<?> list, int i, int j) 将指定 list 集合中的 i 处元素和 j 处元素进行交换
    static <T extends Object & Comparable<? super T>>T max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定集合中的最大元素
    static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) 根据 Comparator 指定的顺序,返回给定集合中的最大元素
    static int frequency(Collection<?> c, Object o) 返回指定集合中指定元素的出现次数
    static <T> void copy(List<? super T> dest, List<? extends T> src) 将src中的内容复制到dest中
    static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) 使用新值替换 List 对象的所有旧值
    static <T> Collection<T> synchronizedCollection(Collection<T> c) 返回由指定集合支持的同步(线程安全)集合
    static <T> List<T> synchronizedList(List<T> list) 返回列表支持同步(线程安全)列表
    static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 同步(线程安全)Map
    static <T> Set<T> synchronizedSet(Set<T> s) 同步(线程安全)Set
    • 代码试验如下

      @Test
      public void testMap3(){
          List list = new ArrayList();
          list.add(123);
          list.add(456);
          list.add(789);
          list.add(-111);
          list.add(0);
          System.out.println(list);
          //1、reverse(List):反转 List 中元素的顺序
          Collections.reverse(list);
          System.out.println(list);
          //2、shuffle(List):对 List 集合元素进行随机排序
          Collections.shuffle(list);
          System.out.println(list);
          //3、sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
          Collections.sort(list);
          System.out.println(list);
          //4、sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
          Collections.sort(list, new Comparator() {
              @Override
              public int compare(Object o1, Object o2) {
                  if (o1 instanceof Integer && o2 instanceof Integer){
                      int i = (Integer)o1;
                      int j = (Integer)o2;
                      return -Integer.compare(i,j);
                  }
                  return 0;
              }
          });
          System.out.println(list);
          //5、swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
          Collections.swap(list,1,3);
          System.out.println(list);
      }
      
      @Test
      public void testMap4(){
          List list = new ArrayList();
          list.add(123);
          list.add(456);
          list.add(789);
          list.add(-111);
          list.add(0);
          //6、Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
          System.out.println(Collections.max(list));
          //7、Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
          System.out.println(Collections.max(list,new Comparator(){
              @Override
              public int compare(Object o1, Object o2) {
                  if (o1 instanceof Integer && o2 instanceof Integer){
                      int i = (Integer)o1;
                      int j = (Integer)o2;
                      return -Integer.compare(i,j);
                  }
                  return 0;
              }
          }));
          //8、int frequency(Collection,Object):返回指定集合中指定元素的出现次数
          System.out.println(Collections.frequency(list, 123));
          //9、void copy(List dest,List src):将src中的内容复制到dest中
          List dest = Arrays.asList(new Object[list.size()]);
          Collections.copy(dest,list);
          System.out.println(dest);
          //10、boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
          Collections.replaceAll(list,789,799);
          System.out.println(list);
          //11、创建线程安全的集合
          List list1 = Collections.synchronizedList(list);
      }
      

    原创不易,欢迎转载,转载时请注明出处,谢谢!
    作者:潇~萧下
    原文链接:https://www.cnblogs.com/manongxiao/p/13587239.html

  • 相关阅读:
    重复点击的解决方案
    判断window.open的页面是否已经被关
    npm run dev 报错 版本太低
    :after 写三角形 border
    input text 在苹果微信浏览器中有上上阴影
    input实时监听
    pre强制 自动换行
    解决iphone safari上的圆角问题
    ACM: 强化训练-Roads in the North-BFS-树的直径裸题
    ACM: 强化训练-Inversion Sequence-线段树 or STL·vector
  • 原文地址:https://www.cnblogs.com/manongxiao/p/13587239.html
Copyright © 2020-2023  润新知