Map集合体系(HashMap,LinkedHashMap,TreeMap)

这篇具有很好参考价值的文章主要介绍了Map集合体系(HashMap,LinkedHashMap,TreeMap)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.Map集合

2.hashMap集合

3.LinkedHashMap集合

4. TreeMap集合

Map集合体系(HashMap,LinkedHashMap,TreeMap),数据结构

1.Map集合

        Map集合是键值对集合

        格式:{key1=value1, key2=value2, key3=value3, ...}

        Map系列集合的特点都是由键决定的,值只是一个附属品,值不做要求

2.实现类有哪些?,各自有什么特点?

        HashMap:无序、不重复、无索引; (用的最多)

        LinkedHashMap:有序、不重复、无索引

        TreeMap:按照大小默认升序排序、不重复、无索引

3.Map的常用方法

        Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。

                        Map集合体系(HashMap,LinkedHashMap,TreeMap),数据结构

代码展示:

package com.itheima.day08.teacher.map01;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo01 {

    /*
      Map集合是什么?有什么特点?
         Map是双列集合,也叫键值对儿集合。
            里面的元素是一对儿一对儿的。这一对儿元素称为键值对对象,Entry对象。
            当存储多个 一一对应数据的时候,使用Map。
         特点:
            键唯一,值可以重复,每个键都只能找到自己对应的值。

      Map集合实现类有哪些?
         HashMap  键 唯一 无序  无索引 值无所谓
            LinkedHashMap 键 唯一 有序  无索引 值无所谓
         TreeMap
                  键 唯一 可排序  无索引 值无所谓
      Map集合常用方法:
           集合对象的创建
           一般采用空参构造
           Map<K,V>  泛型K表示键的类型 泛型V表示值的类型
          Map<键的类型,值的类型> map =  new 子类对象<>();
           增  删  改  查
            V put(K key,V value) 存放一对元素
              put有俩层 意思
                如果 键没有在集合中出现,此时put是添加。 V返回是null.
                    键在集合中出现了,此时put是修改。 V 返回的是被替换的值。
              HashMap中是可以存储 null值 null键

             boolean isEmpty() 集合是否为空 为空true

             int size() 查看键值对个数
             clear() 清空 集合中所有键值对全删了

             查  map特点 以键为准的
               V get(K key)根据键找值
             删
               V remove(K key)根据键删除当前的键值对关系
             包含
                boolean containsKey(K k)是否包含指定的键
                boolean containsValue(V v)是否包含指定值
             获取 键集  值集
             Set<K> keySet() 获取键集
             Collection<V> values() 获取值集
           集合的遍历

     */
    public static void main(String[] args) {
        //1:创建集合对象
        Map<String,Integer> map = new HashMap<>();//多态形势下研究 通用方法
        //2:集合里面当前没有内容
        System.out.println("当前集合是不是空的呢?"+map.isEmpty());
        //3:添加键值对元素到 集合中
        map.put("随便",3);
        map.put("记忆枕",30);
        map.put("大鹅",10000);
        map.put("叮当猫",0);
        map.put("随便",4);//修改
        //4:查看集合中元素个(对)数
        System.out.println("当前集合有:"+map.size()+"对元素");
        System.out.println(map);
        //5:清空集合--
//        map.clear();
//        System.out.println(map);
        //6:根据键找值 如果找不到 返回null 找到返回对应的值。
        System.out.println("大鹅的价格:"+map.get("大鹅"));
        System.out.println("大鸦的价格:"+map.get("大鸦"));
        //7:删除
        System.out.println("删除叮当猫:"+map.remove("叮当猫"));
        System.out.println("删除之后的集合:"+map);
        //8:包含 不包含false 包含是true
        System.out.println("是否包含叮当猫的键:"+map.containsKey("叮当猫"));
        System.out.println("是否包含大鹅的键:"+map.containsKey("大鹅"));
        System.out.println("是否包含价格为30的商品:"+map.containsValue(30));
        //9:获取键集和值集
        Set<String> keys = map.keySet();
        System.out.println(keys);
        Collection<Integer> values = map.values();
        System.out.println(values);

        //10:从上面方法中选择一下  能不能完成 键值对儿数据的遍历...

    }
}

4.Map的遍历方式(三种)

        1.键找值:keySet()获取所有的键集合,在用get(),通过键获取值遍历
        2.键值对:用entrySet() ,把键值合成一个整体在set集合里,遍历用getKey()和getValue()
        3.Lambda:用forEarch,里面new BIconsumer

代码展示:

package com.itheima.day08.teacher.map01;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo02 {
    /*
      Map集合遍历方式一:
         键找值
         步骤:
            先根据keySet()方法获取键集
            遍历键集得到每个键
            根据键找值 get(K k)
     */
    public static void main(String[] args) {
        // 准备一个Map集合。
        Map<String, Double> map = new HashMap<>();
        map.put("蜘蛛精", 162.5);
        map.put("蜘蛛精", 169.8);
        map.put("紫霞", 165.8);
        map.put("至尊宝", 169.5);
        map.put("牛魔王", 183.6);
        System.out.println(map);//查看内容不是遍历
        //遍历指的是 一个个取出来。
        //1:获取map集合的键集
        Set<String> keys = map.keySet();
        //2:遍历 增强for 得到每个键
        for (String key : keys) {
            //3:根据键 获取对应的值
            Double value = map.get(key);
            System.out.println(key+" : "+value);
        }

    }
}


-----------------
package com.itheima.day08.teacher.map01;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo03 {
    /*
      Map集合遍历方式二:(面向对象思想方式)
        键值对儿 方式......
           键值对儿对象 叫 Entry类型
        每一个 entry对象表示 一个键值对儿
       Set<Entry对象> entrySet()  获取 "键值对儿"(整体) 集合
       Entry理解为 封装了 键和值的一个特殊对象
           getKey() 获取该对象的键
           getValue()获取该对象的值
       Entry<K,V> K键的类型 V 值的类型
        Set<Map.Entry<K,V>> entrySet()

      步骤:
         1:map集合调用 entrySet()方法 得到 一个 存放 entry对象的 set集合
         2:遍历 存放entry对象的set集合 得到每一个 entry对象
         3:调用entry对象的 获取键的方法 获取值的方法 取出对应键值
     */
    public static void main(String[] args) {
        // 准备一个Map集合。
        Map<String, Double> map = new HashMap<>();
        map.put("蜘蛛精", 162.5);
        map.put("蜘蛛精", 169.8);
        map.put("紫霞", 165.8);
        map.put("至尊宝", 169.5);
        map.put("牛魔王", 183.6);
        System.out.println(map);
        // 1:map集合调用 entrySet()方法 得到 一个 存放 entry对象的 set集合
        Set<Map.Entry<String, Double>> entries = map.entrySet();
        //2:遍历 存放entry对象的set集合 得到每一个 entry对象
        for (Map.Entry<String, Double> entry : entries) {
            //entry就是存放 没对 键值的 对象
            // 3:调用entry对象的 获取键的方法 获取值的方法 取出对应键值
            String key = entry.getKey();
            Double value = entry.getValue();
            System.out.println(key+" : "+value);
        }


    }
}


------------------
package com.itheima.day08.teacher.map01;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

public class MapDemo04 {
    /*
      Map集合遍历方式三:
         JDK8之后 Lambda方式
         map集合在JDK8之后提供类一个
            forEach(处理键和值的接口)方法

     */
    public static void main(String[] args) {
        // 准备一个Map集合。
        Map<String, Double> map = new HashMap<>();
        map.put("蜘蛛精", 162.5);
        map.put("蜘蛛精", 169.8);
        map.put("紫霞", 165.8);
        map.put("至尊宝", 169.5);
        map.put("牛魔王", 183.6);
        System.out.println(map);

        map.forEach(new BiConsumer<String, Double>() {
            @Override
            public void accept(String k, Double v) {//底层用一个方法去接收了 每次遍历出来的键和值
                System.out.println(k+" : "+v);
            }
        });
        System.out.println("================");
        map.forEach((k,v)-> System.out.println(k+" : "+v));
    }
}

2.hashMap集合

        HashMap集合的底层原理

        1.HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。

                JDK8之前,哈希表 = 数组+链表

                JDK8开始,哈希表 = 数组+链表+红黑树

                哈希表是一种增删改查数据性能都较好的数据结构。

        2.实际上:原来学的Set系列集合的底层就是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

        3.HashMap如何实现键的唯一性的

                依赖hashCode方法和equals方法保证键的唯一。

                如果键要存储的是自定义对象,需要重写hashCode和equals方法。

代码演示:

        

package com.itheima.day08.teacher.map02;

import java.util.Objects;
/**
    学生类
*/
public class Student {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}



-------------
package com.itheima.day08.teacher.map02;

import java.util.HashMap;

/**
 * HashMap测试类
 */
public class HashMapDemo {

    public static void main(String[] args) {
        //创建一个 存储 学生对象--籍贯对应 关系的 集合
        HashMap<Student,String> map = new HashMap<>();
        //每次存一个学生对象--籍贯
        Student stu1 = new Student("小学", 15);
        Student stu2 = new Student("中学", 19);
        Student stu3 = new Student("高中", 22);
        Student stu4 = new Student("小学", 15);
        //stu1 来自 吉林  stu2 黑龙江  stu3 辽宁
        map.put(stu1,"吉林");
        map.put(stu2,"黑龙江");
        map.put(stu3,"辽宁");
        map.put(stu4,"热河");//  map集合特点  键唯一
             // 没有重写 hashcode equals时候  两次new 就是两个不同的对象。
             // 我们会认为 stu1 stu4 的 内容一样就是相同的对象---需要我们去重写键的hashCode equals方法

        map.forEach((k,v)->{
            System.out.println(k+"="+v);
        });
    }
}

3.LinkedHashMap集合

        LinkedHashMap集合的底层原理

        1.底层数据结构依然是基于哈希表实现的,只是每个键值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序)。

        2.实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。

package com.itheima.day08.teacher.map02;

import java.util.Objects;

/**
 * 学生类
 */
public class Student {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}



---------------
package com.itheima.day08.teacher.map02;

import java.util.HashMap;
import java.util.LinkedHashMap;

/**
 * LinkedHashMap测试类
 */
public class LinkedHashMapDemo {

    public static void main(String[] args) {
        //创建一个 存储 学生对象--籍贯对应 关系的 集合
        LinkedHashMap<Student,String> map = new LinkedHashMap<>();
        //每次存一个学生对象--籍贯
        Student stu1 = new Student("小学", 15);
        Student stu2 = new Student("中学", 19);
        Student stu3 = new Student("高中", 22);
        Student stu4 = new Student("小学", 15);
        //stu1 来自 吉林  stu2 黑龙江  stu3 辽宁
        map.put(stu1,"吉林");
        map.put(stu2,"黑龙江");
        map.put(stu3,"辽宁");
        map.put(stu4,"热河");//  map集合特点  键唯一
             // 没有重写 hashcode equals时候  两次new 就是两个不同的对象。
             // 我们会认为 stu1 stu4 的 内容一样就是相同的对象---需要我们去重写键的hashCode equals方法

        map.forEach((k,v)->{
            System.out.println(k+"="+v);
        });
    }
}

4. TreeMap集合

        TreeMap集合的底层原理

        1.TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。

        2.TreeMap集合同样也支持两种方式来指定排序规则

                让类实现Comparable接口,重写比较规则。

                TreeMap集合有一个有参数构造器,支持创建Comparator比较器对象,以便用来指定比较规则。     

package com.itheima.day08.teacher.map02;

import java.util.Objects;

/**
 * 学生类
 */
public class Student {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}



------------------
package com.itheima.day08.teacher.map02;

import java.util.Comparator;
import java.util.HashMap;
import java.util.TreeMap;

/**
 * TreeMap测试类
 */
public class TreeMapDemo {

    public static void main(String[] args) {
        //创建一个 存储 学生对象--籍贯对应 关系的 集合
        TreeMap<Student,String> map = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o2.getAge()-o1.getAge();
            }
        });
        //每次存一个学生对象--籍贯
        Student stu1 = new Student("小学", 15);
        Student stu2 = new Student("中学", 19);
        Student stu3 = new Student("高中", 22);
        Student stu4 = new Student("小学", 15);
        //stu1 来自 吉林  stu2 黑龙江  stu3 辽宁
        map.put(stu1,"吉林");
        map.put(stu2,"黑龙江");
        map.put(stu3,"辽宁");
        map.put(stu4,"热河");


        map.forEach((k,v)->{
            System.out.println(k+"="+v);
        });
    }
}

集合的嵌套:  指的是集合中的元素又是一个集合文章来源地址https://www.toymoban.com/news/detail-833039.html

到了这里,关于Map集合体系(HashMap,LinkedHashMap,TreeMap)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java学数据结构(3)——树Tree & B树 & 红黑树 & Java标准库中的集合Set与映射Map & 使用多个映射Map的案例

    1.B树,阶M,数据树叶上,根的儿子数在2和M之间,除根外,非树叶节点儿子为M/2和M之间; 2.B树的插入引起分裂,B树的删除,引起合并和领养; 3.红黑树,根是黑的,红色节点的儿子必须是黑的,所有路径的黑色节点数相同; 4.红黑树的插入,颜色翻转,单旋转,插入节点定

    2024年02月11日
    浏览(81)
  • Java----Hashmap,LinkedMap和TreeMap三者的区别

            其中map表示的意思为“映射”,HashMap,LinkedMap和TreeMap这三中类都是对Map接口的实现类,在数据插入方面,HashMap是无序插入,LinkedMap是有序插入,而TreeMap会根据键的值进行排序后再进行插入。在运行方面,前两个的运行速度较快,针对Map对象的存储会选择前两者,

    2024年02月13日
    浏览(44)
  • 【数据结构与算法】C++的STL模板(迭代器iterator、容器vector、队列queue、集合set、映射map)以及算法例题

    更多算法例题链接: 【数据结构与算法】递推法和递归法解题(递归递推算法典型例题) 什么是迭代器(iterator) 迭代器(iterator)的定义: 迭代器是一种检查容器内元素并遍历元素的数据类型。 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。 容器

    2024年04月14日
    浏览(50)
  • 【Java 数据结构】TreeMap和TreeSet的介绍

    目录 1、认识 TreeMap 和 TreeSet 2、TreeMap 的主要成员变量 3、TreeMap 的主要构造方法 4、TreeMap 和 TreeSet 的元素必须可比较 5、TreeMap 和 TreeSet 关于 key 有序  6、TreeMap 和 TreeSet 的关系  7、总结 TreeMap 和 TreeSet 是Java中利用搜索树实现的 Map 和 Set,它们的底层是红黑树,而红黑树是一

    2024年01月20日
    浏览(41)
  • 从零开始学习 Java:简单易懂的入门指南之HashMap及TreeMap源码解读(二十四)

    Tip: 1.TreeMap添加元素的时候,键是否需要重写hashCode和equals方法? 此时是不需要重写的。 2.HashMap是哈希表结构的,JDK8开始由数组,链表,红黑树组成的。既然有红黑树,HashMap的键是否需要实现Compareable接口或者传递比较器对象呢? 不需要的。 因为在HashMap的底层,默认是利用

    2024年02月07日
    浏览(50)
  • java集合之LinkedHashMap

    之前的文章,我们对HashMap进行了讲解。在之前的文章,我们了解到,HashMap是唯一且无序的。然而LinkedHashMap是有序的,并且也是唯一的。那这个是怎么实现有序的呢,接下来我们将慢慢讲述。 linkedHashMap的常用方法和hashmap的常用方法基本一致。都是put添加元素,remove移除元素

    2024年02月17日
    浏览(40)
  • 【数据类型】Collections.synchronizedMap 多线程Map,与HashMap的不同

    Collections.synchronizedMap 是 Java 中提供的工具方法,用于创建一个同步(线程安全)的 Map。 它接受一个现有的 Map 对象,并返回一个通过同步包装后的 Map 。 下面是一个简单的示例: 1、基础原理 Collections.synchronizedMap 是通过返回一个线程安全的 Map 包装器来实现的,它在对 Map

    2024年01月18日
    浏览(35)
  • HashMap的数据结构

    HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。 JDK1.8之前的HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要

    2024年02月07日
    浏览(45)
  • 《HashMap的数据结构》

    目录 HashMap概述:  数据结构的组成: 一个键值对是如何存入该结构中: HashMap中链表和红黑树的用途和转换方式 :                     HashMap是基于哈希表的Map接口实现的,它存储的内容是键值对key,value映射。 该类无序。         在JDK1.7及以前,HashMap的数据结构是有

    2024年02月07日
    浏览(42)
  • 【Java练习题汇总】《第一行代码JAVA》网络编程篇&集合体系篇&JDBC篇,汇总Java练习题——Socket 与ServerSocket、List和Set、Map~

    一、填空题 在类集中存放单值的最大父接口是___________ ,存放一对值的最大父接口是___________ 。 ___________ 接口保存的数据是不允许重复的,并且___________ 子类是可以排序的,根据___________ 排序。 Java 类集可以使用的输出方式是___________ 、___________ 、___________ 和___________ 。 在

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包