首页 > 编程语言 >【Java集合】双列集合HashMap的概念、特点及使用

【Java集合】双列集合HashMap的概念、特点及使用

时间:2023-12-11 17:01:47浏览次数:44  
标签:map Java HashMap age 集合 public name

上篇文章讲了Map接口的概念,通过他提供的接口方法,我们学习了如何使用以及对Map集合的遍历

HashMap 概念

HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,该集合的键和值允许为空,但键不能重复,且集合中的元素是无序的。

特点

HashMap底层是由哈希表结构组成的,其实就是“数组+链表”的组合体,数组是HashMap的主体结构,链表则主要是为了解决哈希值冲突而存在的分支结构。正因为这样特殊的存储结构,HashMap集合对于元素的增、删、改、查操作表现出的效率都比较高。

结构

在java1.8以后采用数组+链表+红黑树的形势来进行存储,通过散列映射来存储键值对,如下图:

  • 在初始化时将会给定默认容量为16

  • 对key的hashcode进行一个取模操作得到数组下标

  • 数组存储的是一个单链表

  • 数组下标相同将会被放在同一个链表中进行存储

  • 元素是无序排列的

  • 链表超过一定长度(TREEIFY_THRESHOLD=8)会转化为红黑树

  • 红黑树在满足一定条件会再次退回链表

看到这个图,是不是挺熟悉!没错,这个就是我们在讲Set时,它的内存结构图,当时我们说 HashSet的底层就是 Map集合,只不过Set只使用了Map集合中的Key,没有使用Value而已。

小练习

在之前我们已经讲了不少Map的使用方法,本篇中就不做过多解释了,来上了个小练习,在体会下它的使用。

每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。

注意,学生姓名相同并且年龄相同视为同一名学生。

编写学生类:

    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.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);
        }
    }

编写测试类:

    public class HashMapTest {
        public static void main(String[] args) {
            //1,创建Hashmap集合对象。
            Map<Student,String>map = new HashMap<Student,String>();
            //2,添加元素。
            map.put(newStudent("lisi",28), "上海");
            map.put(newStudent("wangwu",22), "北京");
            map.put(newStudent("zhaoliu",24), "成都");
            map.put(newStudent("zhouqi",25), "广州");
            map.put(newStudent("wangwu",22), "南京");
            
            //3,取出元素。键找值方式
            Set<Student>keySet = map.keySet();
            for(Student key: keySet){
                Stringvalue = map.get(key);
                System.out.println(key.toString()+"....."+value);
            }
        }
    }

当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap集合来存放。

你还在苦恼找不到真正免费的编程学习平台吗?可以试试云端源想!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费!点这里即可查看

LinkedHashMap

我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?

在HashMap下面有一个子类LinkedHashMap,它继承自HashMap。特别的是,LinkedHashMap在HashMap的基础上维护了一个双向链表,可以按照插入顺序或者访问顺序来迭代元素。此外,LinkedHashMap结合了HashMap的数据操作和LinkedList的插入顺序维护的特性,因此也可以被看做是HashMap与LinkedList的结合。它是链表和哈希表组合的一个数据存储结构。把上个练习使用LinkedHashMap的使用一下

    publicclass LinkedHashMapDemo {
        publicstaticvoid main(String[] args) {
    
            //Map<String, String> map = new HashMap<String, String>();
            
            LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
            map.put("马云", "阿里巴巴");
            map.put("马化腾", "腾讯");
            map.put("李彦宏", "百度");
            Set<Entry<String, String>> entrySet = map.entrySet();
            for (Entry<String, String> entry : entrySet) {
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
        }
    }

总结

本系列文章写到这里,为大家介绍集合家族的知识,基本上就可以告一段落了。

在这个系列文章中,我们讲述了单列和双列集合的家族体系以及简单的使用。集合中不少的实现类,我们并未讲述,大家下来可以通过java的API文档,去学习使用。还是那句话,熟能生巧!只看不练,假把式!

本系列以上内容,都是在实际项目中,会经常碰到这些概念的使用,当然了,文中的内容可能也不是尽善尽美的,如有错误,可以私信,探讨!
happy ending!

标签:map,Java,HashMap,age,集合,public,name
From: https://www.cnblogs.com/ydyxcode/p/17894814.html

相关文章

  • java接口
    一、概述 二、接口特点三、接口的成员特点 四、类和接口的关系五、抽象类和接口的关系示例: ......
  • 七,JAVA面向对象
    对象用类来描述对象,将对象的共同特征进行抽取而形成类大象:类属性:鼻子眼睛:变量行为:跑,拔树:函数同一个类中。成员函数可以直接访问其他成员类与类之间的访问:需要创建对象格式:类名对象名=new类名();Carcar=newCar();//对象名.成员名car.run();c......
  • java多态
    一、概述 示例: 二、多态种成员的访问特点 三、多态的优缺点 四、多态种的转型 示例: ......
  • java抽象类
    一、概述二、抽象类的特点  示例: 三、抽象类的成员特点 ......
  • java中的数据库连接池
    常见的连接池的优缺点:HikariCP优点:性能出色,尤其在高并发负载下表现良好内存消耗低,占用系统资源较少具有自动化的连接池维护和统计功能缺点:需要JDK7或以上版本支持配置选项相对较少,有些高级的配置需要通过代码实现Tomcat连接池优点:支持负载均衡和Failover,......
  • java修饰符
    一、包  二、导包 三、修饰符1、权限修饰符2、状态修饰符final  示例: 3、static  ......
  • java高级笔记汇总
    一、理论知识背诵汇总篇1、Java常用类System类Date类(日期类)DateFormat类(日期格式化类)SimpleDateFormat类Math类Random类BigInteger(大整数)类BigDecimal(大小数)类Timer定时器2、枚举(将类的对象固定下来)只能使用它的对象,而不能增加和修改枚举的属性3、单例模式一个类......
  • 基于Java 的商城网站系统设计与实现(8000字论文)
    摘要随着我国经济活力的不断提升和互联网的快速发展,信息的重要性正在显现出来。电子商务作为经济发展的重要一环取得了突飞猛进的发展。由于具有高效便捷的优点,网上购物已经成为一种不可或缺的新型生活方式,近年来各大互联网企业纷纷布局电子商务,获得了巨大成功。而对于这些平台来......
  • ChatGPT叫你如何在centos中配置javapath变量
    当使用vim编辑器时,你可以按照以下步骤来编辑bash配置文件:打开~/.bashrc文件:bashvim~/.bashrc或者,如果你选择在系统级别配置,可以使用:bashsudovim/etc/environment在vim中编辑文件:移动光标到文件末尾,按下i进入插入模式,然后添加以下行:bashexportJ......
  • java中的三目运算符
    格式:变量=condition?value1:value2condition是一个布尔表达式,如果为true,则返回value1,否则返回value2比如:变量a的赋值,如果x>y,则a=1,否则,a=2用ifelse代码如下:1importjava.util.Random;2publicclassTest3{3publicstaticvoidmain(String[]args){4......