Java映射(含源码)

在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种实现映射接口的类,其中最常用的是HashMapTreeMapLinkedHashMap。下面是这些实现的简要介绍和它们之间的区别,以及一个简单的例子来展示如何使用它们。

HashMap

  • HashMap是最常用的映射实现之一。
  • 它存储键值对,但不保证映射的顺序。
  • 允许使用null作为键或值。
  • 它是非同步的,如果多线程同时访问它并且至少有一个线程修改了映射结构,它必须保持外部同步。

TreeMap

  • TreeMap基于红黑树(Red-Black tree)实现。
  • 它按照键的自然顺序或构造时提供的Comparator进行排序。
  • 不允许使用null作为键,但允许使用null作为值。
  • 同样是非同步的。

LinkedHashMap

  • LinkedHashMapHashMap的一个子类,可以预测迭代的顺序。
  • 它通过维护一个双向链表来保持插入顺序或者访问顺序。
  • 允许使用null作为键或值。
  • 非同步。

示例代码

以下是一个简单的例子,展示如何使用HashMap来存储和访问键值对:

import java.util.HashMap;
import java.util.Map;public class MapExample {public static void main(String[] args) {// 创建HashMap实例Map<String, Integer> map = new HashMap<>();// 向映射中添加键值对map.put("Alice", 30);map.put("Bob", 25);map.put("Charlie", 35);// 通过键访问值System.out.println("Alice's age: " + map.get("Alice"));// 遍历映射中的所有键值对for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}

这个例子展示了如何创建一个HashMap实例,向其中添加一些键值对,然后通过键访问值,并遍历映射中的所有键值对。类似地,你可以使用TreeMapLinkedHashMap根据你的需要选择不同的行为特征,如排序或保持插入顺序。在Java面试中,常常会遇到涉及算法、数据结构和编程逻辑的问题。这里提供三个示例题目,它们分别关注数组操作、字符串处理和数据结构的使用,都是大厂面试中可能遇到的类型。每个示例都包括问题描述、解决方案及其源码。

1. 合并区间

问题描述
给定一个区间的集合,区间内以数组形式给出[start, end],合并所有重叠的区间,并返回一个不重叠的区间数组。

示例
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 合并为 [1,6].

解决方案

import java.util.Arrays;
import java.util.LinkedList;public class MergeIntervals {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));LinkedList<int[]> merged = new LinkedList<>();for (int[] interval : intervals) {// 如果列表为空,或者当前区间与上一个区间不重叠,直接添加if (merged.isEmpty() || merged.getLast()[1] < interval[0]) {merged.add(interval);} else {// 否则,有重叠,合并区间merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);}}return merged.toArray(new int[merged.size()][]);}public static void main(String[] args) {MergeIntervals solution = new MergeIntervals();int[][] intervals = {{1,3},{2,6},{8,10},{15,18}};int[][] mergedIntervals = solution.merge(intervals);for (int[] interval : mergedIntervals) {System.out.println(Arrays.toString(interval));}}
}

2. 字符串的排列

问题描述
给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。

换句话说,第一个字符串的排列之一是第二个字符串的子串。

示例
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).

解决方案

public class CheckInclusion {public boolean checkInclusion(String s1, String s2) {if (s1.length() > s2.length()) return false;int[] s1Map = new int[26];int[] s2Map = new int[26];for (int i = 0; i < s1.length(); i++) {s1Map[s1.charAt(i) - 'a']++;s2Map[s2.charAt(i) - 'a']++;}for (int i = 0; i < s2.length() - s1.length(); i++) {if (matches(s1Map, s2Map)) {return true;}s2Map[s2.charAt(i + s1.length()) - 'a']++;s2Map[s2.charAt(i) - 'a']--;}return matches(s1Map, s2Map);}private boolean matches(int[] s1Map, int[] s2Map) {for (int i = 0; i < 26; i++) {if (s1Map[i] != s2Map[i]) {return false;}}return true;}public static void main(String[] args) {CheckInclusion solution = new CheckInclusion();String s1 = "ab", s2 = "eidbaooo";System.out.println(solution.checkInclusion(s1, s2)); // 输出:true}
}

3. 最小栈

问题描述
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

解决方案

import java.util.Stack;public class MinStack {private Stack<Integer> stack;private Stack<Integer> minStack;public MinStack() {stack = new Stack<>();minStack = new Stack<>();}public void push(int val) {stack.push(val);if (minStack.isEmpty() || val <= minStack.peek()) {minStack.push(val);}}public void pop() {if (stack.pop().equals(minStack.peek())) {minStack.pop();}}public int top() {return stack.peek();}public int getMin() {return minStack.peek();}public static void main(String[] args) {MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);System.out.println(minStack.getMin()); // 返回 -3minStack.pop();System.out.println(minStack.top());    // 返回 0System.out.println(minStack.getMin()); // 返回 -2}
}

这些示例题目和解决方案旨在提供一种面向对象的编程方法,并展示Java在处理数据结构和算法问题方面的能力。通过这些练习,你可以加深对Java编程的理解并提升解决问题的能力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter中GetX的用法(路由管理)

目录 前言 一.安装 二.从一个计时器开始 三.Getx路由管理 1.普通路由导航 1.导航到新的页面 2.关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西 3.进入下一个页面&#xff0c;但没有返回上一个页面的选项&#xff08;用于SplashS…

python读取文件中相对路径和绝对路径

如果python执行文件和要读取的文件在同一目录&#xff0c;也就是同一个文件夹里&#xff0c;代码中就不必添加文件的路径。如果说要读取的文件在另外一个文件夹里&#xff0c;而这个文件夹又和pythou文件在同一个文件夹里&#xff0c;就要在代码中添加目标文件的路径&#xff0…

如何实现扩展Spring MVC框架的消息转换器?

扩展 Spring MVC 框架的消息转换器通常涉及编写自定义的 HttpMessageConverter 实现。HttpMessageConverter 是 Spring MVC 中用于处理 HTTP 请求和响应的消息转换器接口&#xff0c;它负责将 HTTP 请求中的数据转换为 Java 对象&#xff0c;并将 Java 对象转换为 HTTP 响应的数…

【STM32定时器 TIM小总结】

STM32 TIM详解 TIM介绍定时器类型基本定时器通用定时器高级定时器常用名词时序图预分频时序计数器时序图 定时器中断配置图定时器定时 代码调试 TIM介绍 定时器&#xff08;Timer&#xff09;是微控制器中的一个重要模块&#xff0c;用于生成定时和延时信号&#xff0c;以及处…

Vue3+TypeScript 学习回顾,温故而知新

文章简介&#xff1a; &#xff08;1&#xff09;简介&#xff1a; 在 Vue3 中编码规范如下&#xff1a; 编码语言: JavaScript代码风格: 组合式API选项式、API简写形式: setup语法糖 &#xff08;2&#xff09;复习内容&#xff1a; 1.核心: ref、reactive、computed、w…

路由器端口转发远程桌面控制:一电脑连接不同局域网的另一电脑

一、引言 路由器端口转发&#xff1a;指在路由器上设置一定的规则&#xff0c;将外部的数据包转发到内部指定的设备或应用程序。这通常需要对路由器进行一些配置&#xff0c;以允许外部网络访问内部网络中的特定服务和设备。端口转发功能可以实现多种应用场景&#xff0c;例如远…

写个树型穿梭框

以下是一个简单的树型穿梭框的示例代码&#xff08;使用HTML、CSS和JavaScript&#xff09;&#xff1a; HTML部分&#xff1a; <div id"tree"><ul><li><span>节点1</span><ul><li><span>节点1.1</span><…

游戏引擎中的动画基础

一、动画技术简介 视觉残留理论 - 影像在我们的视网膜上残留1/24s。 游戏中动画面临的挑战&#xff1a; 交互&#xff1a;游戏中的玩家动画需要和场景中的物体进行交互。实时&#xff1a;最慢需要在1/30秒内算完所有的场景渲染和动画数据。&#xff08;可以用动画压缩解决&am…

QT 状态机的使用

QT 状态机的使用场景&#xff1a; QT 状态机适用于需要管理复杂状态和状态转换的场景&#xff0c;例如游戏开发、UI界面控制、自动化控制系统等。它可以帮助组织和管理程序中的各种状态&#xff0c;并定义状态之间的转换规则&#xff0c;使程序逻辑清晰、易于维护。 QT 状态机…

iOS 开发 block 等待 block 或 block 等待

block 等待 在 iOS 开发中&#xff0c;如果你想要一个 block&#xff08;闭包&#xff09;等待执行完成&#xff0c;通常意味着你想要同步地执行这个 block&#xff0c;而不是异步地。然而&#xff0c;block 本身并不直接支持同步等待&#xff0c;因为它们是作为函数对象来设计…

用SeaTunnel从SQL Server向Elasticsearch同步数据

文章目录 引言I 步骤1.1 环境准备1.2 配置JDBC插件1.3 编写SeaTunnel任务配置II Enable Sql Server CDC引言 SeaTunnel 的官网 https://seatunnel.apache.org/ Support SQL Server Version: server:2008 (Or later version for information only)Supported DataSource Info: …

抖去推无人直播+矩阵托管+AI文案撰写一体化工具如何开发搭建

一、 开发和搭建抖去推无人直播矩阵托管AI文案撰写一体化工具需要以下步骤&#xff1a; 确定功能需求&#xff1a;确定抖去推无人直播、矩阵托管和AI文案撰写的具体功能需求&#xff0c;如直播推流、直播管理、托管服务、AI文案生成等。 技术选型&#xff1a;选择适合开发该工…

LeetCode 395. 至少有K个重复字符的最长子串

解题思路 一道滑动窗口题型&#xff0c;不过滑动窗口的长度是不同种类元素的个数。 这里需要定义两个变量 cnt,overk。overk表示的是满足大于k的字符数, cnt表示的是该窗口中不同元素的个数且cnt>1&&cnt<26。 相关代码 class Solution {public int longestSub…

动手学习深度学习之环境配置

创建conda虚拟环境 下载anaconda&#xff0c;安装到计算机&#xff0c;修改镜像源到国内 show_channel_urls: true channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/- http://mirrors.tu…

52. 携带研究材料(第七期模拟笔试)

52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 时间限制&#xff1a;1.000S 空间限制&#xff1a;128MB 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的…

CSS3技巧38:3D 翻转数字效果

博主其它CSS3 3D的文章&#xff1a; CSS3干货4&#xff1a;CSS中3D运用_css 3d-CSDN博客 CSS3干货5&#xff1a;CSS中3D运用-2_中3d-2-CSDN博客 CSS3干货6&#xff1a;CSS中3D运用-3_css3d 使用-CSDN博客 最近工作上烦心的事情太多&#xff0c;只有周末才能让我冷静一下 cod…

LeetCode 每日一题 2024/3/11-2024/3/17

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 3/11 2129. 将标题首字母大写3/12 1261. 在受污染的二叉树中查找元素3/13 2864. 最大二进制奇数3/14 2789. 合并后数组中的最大元素3/15 2312. 卖木头块3/16 2684. 矩阵中移…

HTTPS(超文本传输安全协议)工作过程

一、简述HTTPS HTTPS超文本传输协议&#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#x…

对建造者模式的理解

目录 一、为什么需要建造者模式&#xff1f;1、场景12、场景23、解决上述场景的办法&#xff1a;建造者模式 二、练习1、题目描述 【[来源](https://kamacoder.com/problempage.php?pid1084)】2、输入描述3、输出描述4、输入示例5、输出示例6、参考 三、思考1、一般常用的是lo…

vue 实现下载pdf格式的文件

第一步 安装下载插件 npm install html2canvas jspdf --save第二步 给vue原型上面挂载一个下载页面pdf的方法&#xff1b;在项目工具方法存放文件夹utils中创建htmlToPdf.js文件&#xff0c;代码如下 // 导出页面为PDF格式 import html2Canvas from html2canvas import JsP…