Java映射(含源码)
在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种实现映射接口的类,其中最常用的是HashMap、TreeMap和LinkedHashMap。下面是这些实现的简要介绍和它们之间的区别,以及一个简单的例子来展示如何使用它们。
HashMap
HashMap是最常用的映射实现之一。- 它存储键值对,但不保证映射的顺序。
- 允许使用
null作为键或值。 - 它是非同步的,如果多线程同时访问它并且至少有一个线程修改了映射结构,它必须保持外部同步。
TreeMap
TreeMap基于红黑树(Red-Black tree)实现。- 它按照键的自然顺序或构造时提供的
Comparator进行排序。 - 不允许使用
null作为键,但允许使用null作为值。 - 同样是非同步的。
LinkedHashMap
LinkedHashMap是HashMap的一个子类,可以预测迭代的顺序。- 它通过维护一个双向链表来保持插入顺序或者访问顺序。
- 允许使用
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实例,向其中添加一些键值对,然后通过键访问值,并遍历映射中的所有键值对。类似地,你可以使用TreeMap或LinkedHashMap根据你的需要选择不同的行为特征,如排序或保持插入顺序。在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编程的理解并提升解决问题的能力。
相关文章:
Java映射(含源码)
在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种…...
JMeter 面试题及答案整理,最新面试题
JMeter中如何进行性能测试的规划和设计? 进行JMeter性能测试的规划和设计主要遵循以下几个步骤: 1、确定测试目标: 明确性能测试的目的和目标,比如确定要测试的系统性能指标(如响应时间、吞吐量、并发用户数等&#…...
lua脚本的基础内容
官方地址:http://luajit.org/ 官方wiki地址:http://wiki.luajit.org/Home 推荐书籍: OpenResty 最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/ lua基础文档:https://www.runoob.com/l…...
MySQL语法分类 DDL(1)
DDL(1)(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…...
苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片
苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…...
Lua中文语言编程源码-第三节,更改lualib.h Lua标准库, 使Lua支持中文关键词(与所有的基础库相关)
源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lualib.h,是Lua的标准库模块。 Lua标准库一共有有个10个库,base, 基本用不着改,所以没加中文名称。 函数声明宏名英文库名中文库…...
Vue | 使用 ECharts 绘制折线图
目录 一、安装和引入 ECharts 二、使用 ECharts 2.1 新增 div 盒子 2.2 编写画图函数 2.3 完整代码结构 三、各种小问题 3.1 函数调用问题 3.2 数据格式问题 3.3 坐标轴标签问题 3.4 间隔显示标签 参考博客:Vue —— ECharts实现折线图 本文是在上…...
NVENC 视频编码器 API 编程指南 ( 中文转译 )
基于 NVIDIA Kepler™ 和更高版本 GPU 架构的 NVIDIA GPU 包含基于硬件的 H.264/HEVC/AV1 视频编码器(以下简称 NVENC)。NVENC 硬件采用 YUV/RGB 作为输入,并生成符合H.264/HEVC/AV1 标准的视频比特流。可以使用 NVIDIA 视频编解码器 SDK 中提…...
媒体发稿:澳门媒体发稿7个流程
推广平台澳门是一个重要的度假旅游娱乐终点,都是媒体领域热议的话题。对于澳门的媒体发稿营销推广要求,大家提供了一个简单易用的套餐系统软件,帮助大家在澳门媒体上发表推广文章。下面我们就根据7个阶段,详解构建这一套餐推广平台…...
Spring Web MVC入门(2)
学习Spring MVC Postman介绍 在软件工程中, 我们需要具有前后端分离的思想, 以降低耦合性. 但是在测试后端代码时,我们还得写前端代码测试,这是个令人头疼的问题. 那么我们如何测试自己的后端程序呢, 这就用到了一个工具: Postman. 界面介绍: 传参的介绍 1.普通传参, 也就…...
tomcat 实现会话绑定
Tomcat 后端服务器实现 Session ID会话保持 基础架构: 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试: 此时刷新,会话ID一直在变,这样不好 如何解决呢? 不好的是确定ip之后,会一直在一台机上…...
Android Studio中快速修改包名
Android Studio中快速修改包名 假设原包名是com.abc.efg, 新包名是com.aaa.bbb 1、点击齿轮图标,把Compact Middle Packages前面的对勾取消,如果没有就忽略此步 2、在左侧项目栏中,选择Android, App-->java-->com,下面可以看…...
solr/ES 分词插件Jcseg设置自定义词库
步骤: 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置: 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径,我们这个配置可以自定义…...
嵌入式硬件设计(一)|利用 NodeMCU-ESP8266 开发板和继电器结合APP“点灯•blinker”制作Wi-Fi智能开关(附有关硬件详细资料)
概述 本文主要讲述利用 NodeMCU-ESP8266 开发板和继电器通过手机 APP “ 点灯 • Blinker ” 制作一款能够由手机控制的WiFi 智能开关,从而实现智能物联。NodeMCU 是基于 Lua 的开源固件,ESP8266-NodeMCU是一个开源硬件开发板,支持WiFi功能&a…...
CSS扩展选择器
文章目录 1. 并集选择器2. 交集选择器3. 后代选择器4. 子代选择器5. 兄弟选择器5.1. 相邻兄弟选择器5.2. 通用兄弟选择器 6. 属性选择器7. 伪类选择器7.1. 动态伪类7.2. 结构伪类7.3. 否定伪类 8. 伪元素选择器9. Google 改进案例 1. 并集选择器 选中多个选择器对应的元素。一…...
知名Web3投资基金a16z合伙人Jane Lippencott确认出席Hack.Summit() 2024区块链开发者大会
在区块链技术的风起云涌和Web3生态的蓬勃发展中,知名a16z Crypto的合伙人Jane Lippencott已确认出席即将于2024年4月9日至10日在香港数码港举行的Hack.Summit() 2024区块链开发者大会。作为亚洲首次举办的Hack.Summit(),此次大会将为全球区块链开发者及业…...
电脑那个部件坏了或者是哪个软件需要修复来看价钱
电脑维修价格表是多少? 价格取决于计算机的哪个部分损坏或哪个软件需要修复。 由于电脑中的部件非常多,而且会以各种奇怪的方式出现问题,下面我们就来看看具体的充电方法。 电脑维修价格表: 1. 重新安装系统。 安装XP系统通常需…...
GiT: Towards Generalist Vision Transformer through Universal Language Interface
GiT: Towards Generalist Vision Transformer through Universal Language Interface 相关链接:arxiv github 关键字:Generalist Vision Transformer (GiT)、Universal Language Interface、Multi-task Learning、Zero-shot Transfer、Transformer 摘要 …...
纽约时报起诉OpenAI和微软将决定未来LLM的发展
《纽约时报》诉OpenAI和微软案对未来LLM发展的重大影响 案件背景 《纽约时报》(NYT)近期对OpenAI和微软提起诉讼,指控OpenAI未经授权使用其受版权保护的内容来训练其AI模型,包括ChatGPT。NYT声称,OpenAI使用了数百万篇其文章,这…...
IntelliJ IDEA 面试题及答案整理,最新面试题
IntelliJ IDEA中的插件系统如何工作? IntelliJ IDEA的插件系统工作原理如下: 1、插件架构: IntelliJ IDEA通过插件架构扩展其功能,插件可以添加新的功能或修改现有功能。 2、安装和管理: 通过IDEA内置的插件市场下载…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
