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);
    }
    

猜你喜欢

转载自blog.csdn.net/W_ryxj000/article/details/108313120