十五.JAVA.MAP.工具类,泛型

发布时间 2023-12-25 08:39:14作者: とんぽ
  • 嵌套类/内置类/内部类/内部接口

    • K : key V : value E : element R : ReturnType T : type

  • Map<K, V> : 存储的是键值对。每个键值对成为映射项(Entry);键唯一,值是可重复的;每个键最多只能映射到一个值。

    • HashMap : 键采用哈希表结构,允许null键null值,线程不安全

      • LikedHashMap<K, V> :采用 哈希表 + 链表 结构,保证键的插入顺序和迭代顺序一致

      • Hashtable<Object,Object> :键采用哈希表结构,允许null键null值,线程安全

      • Properties : 表示了一个持久的属性集。Properties 可保存在流中或从流中加载.性列表中每个键及其对应值都是一个字符串。

    • TreeMap : 键采用二叉树结构,对键进行排序

      • 自然排序 : Comparable<T> : 要求实体类实现该接口

      • 自定义排序 : Comparator<T> : 不需要实体类实现该接口,需要编写比较器

      • treeMap.forEach((k, v) >System.out.println(k + " ::: " + v));
  • //  V put(K key, V value) : 当键是第一次存入map时,返回 null ;
    // 如果不是第一次,用新值取代旧值,并将旧值作为返回值返回
    map.put('d', 4);
    // int size() 映射项的个数,返回此映射中的键-值映射关系数。
    System.out.println("map.size() = " + map.size());
    // V get(Object key)       根据键获取值
    // 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
    // Set<K> keySet() : 将所有的键提取出来存到 Set 中,返回此映射中包含的键的 Set 视图。
    // 删
    // V remove(Object key)
    // 果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
    Integer remove = map.remove(null);
    // void clear()
    // 从此映射中移除所有映射关系(可选操作)。
    // boolean containsKey(Object key)
    // 果此映射包含指定键的映射关系,则返回 true。
    System.out.println("map.containsKey('d')="+map.containsKey('d'));
    // boolean containsValue(Object value)
    // 如果此映射将一个或多个键映射到指定值,则返回 true。
    System.out.println("map.containsValue(1)="+map.containsValue(1));
    // boolean isEmpty()
    // 如果此映射未包含键-值映射关系,则返回 true。
    // JDK8.0新增
    // static <K,•V> Map<K,•V> copyOf•(Map<? extends K,•? extends V> map) 返回的是不可变映射
    //Map的遍历方式
    map.forEach((key, value2) -> {
          System.out.println(key + " ^_^ " + value2);
    });
    // default V getOrDefault•(Object key, V defaultValue) 8.0
    map.getOrDefault('a', 3306)
    // default V putIfAbsent•(K key, V value) : 存在就不添加,也不修改值,并且返回指定的键对应的值; 不存在时才添加
    Integer integer = map.putIfAbsent('n', 143);
    // default boolean remove•(Object key, Object value) : 根据键和值进行移除,必须该映射项的键和值完全匹配,才能移除掉
    boolean flag = map.remove('A', 1);
    // default V replace•(K key, V value)
    Integer replace = map.replace('e', 3333);
    // default boolean replace•(K key, V oldValue, V newValue)
    boolean replace1 = map.replace('Y', 25, 5555);
    // default void replaceAll•(BiFunction< K,• V,• V> function)
    map.replaceAll((k, v) -> v += 10);

泛型:操作的数据类型不确定的问题

  • 类的自定义泛型

    • 普通函数可以访问类上定义的泛型

    • 静态函数时不能访问类上定义的泛型

  • ? : 通配符

    • 上限: 从父类开始向下进行限制 ? extends E E 和 E的子类型

    • 下限: 从父类开始向下进行限制 ? super E E 和 E的父类型

  • 数组 ---> 集合 : 转换后不能使用集合的增删功能 , 否则 UnsupportedOperationException

    • Arrays : static <T> List<T> asList(T... a)

    • 返回一个受指定数组支持的固定大小的列表。

    • 引用型数组 : 转换后,数组中的元素作为集合中元素进行存储

    • 基本数据类型数组 : 转换后 , 数组本身作为集合的元素进行存储

  • 集合 ---> 数组,Collection 接口

    • // Object[] toArray() Object[] objects = list.toArray(); for (Object o : objects) { System.out.println("o = " + o); } // <T> T[] toArray(T[] a)

      String[] strings1 =  list.toArray(new String[0]);
      // Stream : 1.获取Stream 2.中间操作 3.终止操作 :forEach()是终止操作之一
      Stream<String> stream = Arrays.stream(strings1);// 获取到的Stream对象只能使用一次
      stream.forEach(System.out::println);
      // stream.forEach(System.out::println);// Stream对象第二次使用 会有 : IllegalStateException
      Arrays.stream(strings1).forEach(System.out::println);
    •