JAVASE高级 day_8 集合7:Map的具体实现

本文介绍了Map的映射关系、常见操作和遍历方法,提及泛型擦除概念。详细阐述了Map的具体实现,如HashMap在JDK1.8前后的不同存储结构,LinkedHashMap用双向链表记录添加顺序,TreeMap可保证元素有序。还介绍了操作集合的工具类Collections及其多种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map概述

Map:映射关系

特点:

map中的元素是以键值对的形式存在
键是不可以重复 值是可以重复的
不保证存取顺序

常见操作:

添加 删除 修改 判断是否空 判断是否包含某一个键 判断是否包含某一个值 根据键获取值 获取键集(Set) 获取值集(Collection) 获取键值对的一个Set

遍历的方法:

1  获取键集   根据键 来获取值 
2  键值对集合 Map.Entry   再通过 Map.Entry 的getKey和getValue来获取的键值
public static void main(String[] args) {
    //Map集合键唯一,一个键对应一个键值,但是一个键值可以对应多个键
    Map map = new HashMap();
    //添加元素
    map.put("java","蓝桥");
    map.put(456,"world");
    map.put("hello","world");
    map.put(1.0,2.0);
    map.put(456,789);
    System.out.println(map);
    System.out.println("-----------------------");

    //使用泛型创建集合
    Map<String,String> map1 = new HashMap<>();
    //添加元素
    map1.put("10010","联通");
    map1.put("10086","移动");
    map1.put("119","火警");

    //添加map中的所有元素
    map1.putAll(map);

    //根据键修改值,这种修改必须保证所修改的键值对在map中存在相应的映射关系
    map1.replace("456","Hello");
    System.out.println(map1.get(456));
    System.out.println(map1);
}

泛型擦除

注意:在集合中 如果要使用泛型 都使用泛型 如果不使用泛型 那么都不要使用

泛型仅在编译期有效 在运行期是没有泛型的 称为泛型擦除

public static void main(String[] args) {
   List<String> list1 = new ArrayList<>();
   List<Integer> list2 = new ArrayList<>();
   Class  c1 = list1.getClass();
   Class c2 = list2.getClass();
   // 在运行期  List list1 = new ArrayList();   List  list2 = new ArrayList<>();
    System.out.println(c1);
    System.out.println(c2);
    System.out.println(c1 == c2);//true  运行期 得到的类型与泛型无关
}

Map的具体实现

HashMap

特点:

1 Hash是map所有实现类中使用频率最高的 实现类
2 基于哈希表的实现的Map接口
3 并允许null的值和null键
4 存取是无序的 
5 hashMap的键是不能重复

存储结构:

Jdk1.8前 HashMap使用的是数组+链表的实现
在这里插入图片描述
Jdk1.8及以后 HashMap采用的是数组 + 链表 + 红黑树的实现
在这里插入图片描述

HashMap源码分析

重要常量:
在这里插入图片描述
Jdk8以前:数组+ 链表 = 桶(bucket)

在map中 元素的存储位置是根据键的 hashCode来计算而得

Jdk8以后 采用的 数组+ 链表 + 红黑树

HashMap底层实现特点

1. HashMap  map = new HashMap()默认  创建一个长度为16得数组  但是 数组此时并不会立即创建
2. 负载因子为 0.75f
3. 当我们第一次去put的时候 才会初始化长度为16的数组
4. 数组的类型为Node类型
5. 形成链表的结构时,新添加的键值对在链表的尾部
6. 当数组中链表的长度>8 时  且map中数组的长度> 64时   此时会将链表转换为红黑树
7. 当红黑树的节点个数小于6的时候,就会转化为链表

LinkedHashMap

1 LinkedHashMap是HashMap的子类

2 在LinkedHashMap中,对于HashMap进行了扩展:使用了双向链表 来记录元素的添加顺序

3 基于特殊的结构,迭代顺序和插入顺序是一致的。

HashMap的Node
在这里插入图片描述
LinkedHash的Entry继承了HashMap的Node
在这里插入图片描述
在LinkedHashMap中,对于HashMap进行了扩展:
使用了双向链表 来记录元素的添加顺序

TreeMap

需要对存入其中的元素进行排序
TreeMap可以保证元素处于有序状态 有序–字典顺序
排序方式 :自然排序 定制排序

public static void main(String[] args) {
    Map<Student,String> map = new TreeMap<>(new Comparator<Student>() {
        @Override
        public int compare(Student st1, Student st2) {
            return st1.getAge() - st2.getAge();
        }
    });
    Student st1 = new Student("郭靖",22);
    Student st2 = new Student("黄蓉",23);
    Student st3 = new Student("杨过",21);
    Student st4 = new Student("小龙女",20);
    map.put(st1,"20201108");
    map.put(st2,"20201104");
    map.put(st3,"20201101");
    map.put(st4,"20201107");
    // 迭代
    Set<Map.Entry<Student,String>> entrySet  = map.entrySet();
    for(Map.Entry<Student,String>  entry : entrySet){
        Student key = entry.getKey();
        String value =entry.getValue();
        System.out.println(key  +"---"+ value );
    }
}

HashTable(了解)

1 采用hash表实现   和HashMap一样
2 不允许null键null值
3 是线程同步

Properties 后续再学习

Collections

是操作集合Set List Map的工具类
工具类中的方法都是静态的

方法

两个集合的拷贝

在这里插入图片描述

返回集合的最大(自然排序)的元素

在这里插入图片描述

反转

在这里插入图片描述

替换

在这里插入图片描述

对列表中的元素进行随机排序

在这里插入图片描述

对集合进行排序

在这里插入图片描述

交换集合的两个位置的元素

在这里插入图片描述

得到线程安全的集合List Set Map

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值