实现了Map接口的HashMap

HashMap 底层主要由以下几个部分组成:

  • 数组 (Node<K,V>[] table): 这是一个数组,存储的是链表的头节点。默认大小为 16。
  • 链表 (Linked List): 当发生哈希冲突时,即不同的键具有相同的哈希值,HashMap
    使用链表来解决冲突。链表的每个节点存储一个键值对。
  • 红黑树 (Red-Black Tree): 在 Java 8 之后,为了优化性能,当链表长度超过一定阈值(默认是 8)时,链表会转换为红黑树,从而提高查询速度。

在这里插入图片描述

基础用法:

package study;

import java.util.HashMap;

public class day01_Collection_Map {
    public static void main(String[] args) {
        // TODO 集合 - Map
        // HashMap: Hash + Map
        // 数据存储和HashSet一样,是无序的
        HashMap map = new HashMap();

        // TODO 添加数据
        map.put("zhangsan", "1");
        map.put("lisi", "2");
        map.put("wangwu", "3");
        map.put(545454, "www");
        System.out.println(map);
        // TODO 修改数据
        // put方法也可以修改数据,返回值就是被修改的值
        System.out.println(map.put("zhangsan", 4.0));
        System.out.println(map);

        // TODO 查询数据,根据key去查value
        System.out.println(map.get("zhangsan"));

        // TODO 删除数据
        map.remove("zhangsan");
        System.out.println(map);
    }
}

电话簿小练习:

package study;

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

public class day01_Collection_Map_进阶 {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        Object preObj;
        preObj = map.put("a", "0");
        System.out.println(preObj);
        preObj = map.put("a", "1");
        System.out.println(preObj);

        // putIfAbsent 不存在才能放,存在不能放
        preObj = map.putIfAbsent("b", "2");
        System.out.println(preObj);
        preObj = map.putIfAbsent("b", "3");
        System.out.println(preObj);
        System.out.println(map);

        // replace替换修改 存在才能修改,不存在也并不会新增
        preObj = map.replace("b", "4");
        System.out.println(preObj);
        System.out.println(map);
        preObj = map.replace("x", "555");
        System.out.println(preObj);
        System.out.println(map);

        // TODO 获取map集合中所有的key
        Set set = map.keySet();
        for (Object k : set) {
            System.out.println(map.get(k));
        }
        System.out.println(map.containsKey("b"));

        Collection values = map.values();
        System.out.println(values.contains("4"));
        System.out.println(map.containsValue("4"));
    }
}

// 电话联系人信息
class Contact {
    private String name;
    private String phoneNumber;

    public Contact(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    @Override
    public String toString() {
        return "姓名: " + name + ", 电话:" + phoneNumber;
    }
}

// 电话簿类管理联系人
class PhoneBook {
    private HashMap<String, Contact> contactsDict;

    public PhoneBook() {
        contactsDict = new HashMap<>();
    }

    // 添加联系人
    public void addContact(String name, String phoneNumber) {
        Contact contact = new Contact(name, phoneNumber);
        contactsDict.put(name, contact);
    }

    // 删除联系人
    public void removeContact(String name) {
        contactsDict.remove(name);
    }

    // 根据名字查找联系人
    public Contact findContact(String name) {
        return contactsDict.get(name);
    }

    // 根据名字修改他的电话, 返回他之前的contact信息
    public Contact updateContact(String name, String phoneNumber) {
        Contact newContact = new Contact(name, phoneNumber);
        Object objResult = contactsDict.replace(name, newContact);
        if (objResult == null) {
            System.out.println("电话簿里查无此人");
            return null;
        } else {
            System.out.println("更新完成,更新后的信息:");
            System.out.println(contactsDict.get(name));
            return (Contact) objResult; // 返回更新前的联系人信息
        }
    }


    // 打印全部联系人
    public void printAllContacts() {
        if (contactsDict.isEmpty()) System.out.println("没有联系人");
        Set<Map.Entry<String, Contact>> entries = contactsDict.entrySet();
        for (Map.Entry<String, Contact> entry : entries) {
            System.out.println(entry.getValue());
        }
    }
}

class Test {
    public static void main(String[] args) {
        // 创建电话簿实例
        PhoneBook phoneBook = new PhoneBook();

        // 添加联系人
        System.out.println("添加联系人:");
        phoneBook.addContact("Alice", "123-456-7890");
        phoneBook.addContact("Bob", "234-567-8901");
        phoneBook.addContact("Charlie", "345-678-9012");

        // 打印所有联系人
        System.out.println("\n电话簿中的联系人:");
        phoneBook.printAllContacts();

        // 查找联系人
        System.out.println("\n查找联系人 Bob:");
        Contact foundContact = phoneBook.findContact("Bob");
        if (foundContact != null) {
            System.out.println("找到联系人: " + foundContact);
        } else {
            System.out.println("找不到联系人 Bob");
        }

        // 更新联系人电话
        System.out.println("\n更新联系人 Charlie 的电话:");
        Contact previousContact = phoneBook.updateContact("Charlie", "987-654-3210");
        if (previousContact != null) {
            System.out.println("之前的联系人信息: " + previousContact);
        }

        // 再次打印所有联系人
        System.out.println("\n更新后的电话簿中的联系人:");
        phoneBook.printAllContacts();

        // 删除联系人
        System.out.println("\n删除联系人 Alice:");
        phoneBook.removeContact("Alice");

        // 最后打印所有联系人
        System.out.println("\n删除后的电话簿中的联系人:");
        phoneBook.printAllContacts();
    }
}

结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/759062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程一级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 3 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1级,那他可以选择的认证语言有几种?( ) A、…

C++ | Leetcode C++题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countPrimes(int n) {vector<int> primes;vector<int> isPrime(n, 1);for (int i 2; i < n; i) {if (isPrime[i]) {primes.push_back(i);}for (int j 0; j < primes.size() && i …

百度网盘下载速度慢的解决办法

目录 一、背景 二、解决办法 1、点击三个竖点&#xff0c;再点设置 2、点击传输&#xff0c;再点击去开启该功能 3、点击同意&#xff0c;开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时&#xff0c;你在使用百度网盘下载时&#xff0c;是否下载速度太…

isalnum()方法——判断字符串是否由字母和数字组成

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isalnum()方法用于判断字符串是否由字母和数字组成。isalnum()方法的语法格式如下&#xff1a; str.isalnum() 如果字符串中至少有一个字…

缺少msvcp140一键修复方法,快速解决msvcp140.dll丢失问题

日常中电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑运行软件时提示找不到msvcp140.dll。这个问题会导致软件无法启动运行&#xff0c;但只要我们了解其原因并采取相应的解…

六月,允许自己做自己,别人做别人

今天结束后&#xff0c;2024 就过去一半了。 年初的规划完成一半了吗&#xff1f;如果没有也没关系&#xff0c;做你自己继续前进。 家人来北京旅游&#xff0c;我累趴了 六月初&#xff0c;我搬家了&#xff0c;这次租了一整套房&#xff0c;是一个小俩居、还带一个小阁楼。…

鸿蒙如何打包应用程序

总结鸿蒙应用程序包 之前文章详细讲解了关于三种程序包的内容&#xff0c;现在简单总结一下&#xff1a; 1. 总结 首先需要搞清楚鸿蒙项目的模块Module的分类: Module分为“Ability”和“Library”两种类型 HAP HAP: Harmony Ability Package , 叫做鸿蒙Ability包。 “Abil…

静态时序分析:ideal_clock、propagated_clock以及generated_clock的关系及其延迟计算规则(二)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 生成时钟 上一节中&#xff0c;我们讨论了理想时钟和传播时钟的创建和使用&#xff0c;本节将讨论生成时钟及其与理想时钟和传播时钟的关系。 图1所示的是一个简…

权限维持-域环境单机版---映像劫持(多)

目录 映像位置: 测试&#xff1a;执行 notepad 成 cmd 配合GlobalFlag隐藏-->执行正常关闭后触发 映像位置: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe 测试&#xff1a;执行 notepad 成 cmd…

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…

VSCode + GDB + J-Link 单片机程序调试实践

VSCode GDB J-Link 单片机程序调试实践 本文介绍如何创建VSCode的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 安装调试插件 在 VSCode 扩展窗口搜索安装 Cortex-Debug插件 创建调试配置 在 Run and Debug 窗口点击 create a launch.json …

05 threeJs基础---阵列立方体和相机适配体验立方体

1.增加相机视角fov 注&#xff1a; 范围更大&#xff0c;意味着可以看到渲染范围更大&#xff0c;远小近大的视觉效果更明显 fov:眼球张开的角度&#xff0c;0时相当于闭眼。aspect:可视区域横纵比。near:眼睛能看到的最近垂直距离。far&#xff1a;眼睛能看到的最远垂直距离。…

12-Django项目--Ajax请求三

目录 路由 添加与编辑 视图函数 perform_list.html 路由 添加与编辑 视图函数 perform_list.html {% endblock %}{% block js %}<script>var DELETE_ID undefined;var MODIFY_ID undefined;$(function () {bindBtnAdd();bindBtnSave();bindBtnDelete();bindBtnDelet…

ESP32-S3[Wire.cpp:513] requestFrom(): i2cRead returned Error -1报错问题

前言&#xff1a; esp32本来是用的ESPWroom32&#xff0c;连接NFC模块&#xff0c;测试完功能是没有问题的&#xff0c;但是换成ESP32-S3&#xff0c;就会报这个错。 报错代码 EPSWroom32 ESP32-S3 解决办法 其实问题就出再ESP32-S3要多一步初始化I2C的代码&#xff0c;初始…

跟《经济学人》学英文:2024年6月22日这期 The exponential growth of solar power

The exponential growth of solar power will change the world An energy-rich future is within reach 原文&#xff1a; It is 70 years since AT&T’s Bell Labs unveiled a new technology for turning sunlight into power. The phone company hoped it could rep…

Python pip install模块时C++编译环境问题

pip install模块时C编译环境问题 在接触和使用python后&#xff0c;常常会通过pip install命令安装第三方模块&#xff0c;大多数模块可以直接安装&#xff0c;但许多新同学仍会遇见某些模块需要实时编译后才能安装&#xff0c;如报错信息大概是缺乏C编译环境&#xff0c;本文则…

黄子韬揭秘徐艺洋与EXO的不解之缘

黄子韬揭秘&#xff1a;徐艺洋与EXO的不解之缘在娱乐圈的繁华与喧嚣中&#xff0c;总有一些不为人知的故事&#xff0c;它们或温馨、或励志&#xff0c;或是感叹命运的奇妙。近日&#xff0c;黄子韬在一档热门综艺节目中意外爆料&#xff0c;揭开了徐艺洋与EXO之间鲜为人知的秘…

认识100种电路之放大电路

在电子技术的广袤世界中&#xff0c;放大电路犹如一颗璀璨的明珠&#xff0c;发挥着至关重要的作用。那么&#xff0c;为什么电路需要放大&#xff1f;放大的原理又是什么&#xff1f;实现放大又需要用到哪些元器件以及数量如何呢&#xff1f;接着往下看&#xff0c;会解开你的…

企业im(即时通讯)作为安全专属的移动数字化平台的重要工具

企业IM即时通讯作为安全专属的移动数字化平台的重要工具&#xff0c;正在越来越多的企业中发挥着重要的作用。随着移动技术和数字化转型的发展&#xff0c;企业对于安全、高效的内部沟通和协作工具的需求也越来越迫切。本文将探讨企业IM即时通讯作为安全专属的移动数字化平台的…

【Python系列】Python 项目 Docker 部署指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…