你真的用对了Map吗.md

本文通过几个简单的示例探讨了在 Java 中使用 Map 类型时可能遇到的问题,特别是针对 HashMap 的 get() 方法在处理未定义键时的行为。文章还介绍了如何避免 NullPointerException 的方法,并推荐了 map.getOrDefault() 的使用。
摘要由CSDN通过智能技术生成
Map我们经常使用,但是你真的会用吗?

这篇文章,我不是为了说明Map的实现原理是什么,我就是为了记录一个开发中遇到的问题,以及如何解决.

先来写一个简单的小demo:

public class TestMap {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        System.out.println("args = [" + map.toString() + "]");
    }
}

运行结果我就不截图了

args = [{111=111, 222=222, 333=333}]

Process finished with exit code 0

就是这样的,没有什么特殊的,下面我们在来看一个demo:

public class TestMap {
    public static void main(String[] args) {
        System.out.println("args = [" + getInteger("111") + "]");
    }

    public static int getInteger(String key){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        return map.get(key);
    }
}

运行结果为:

args = [111]

Process finished with exit code 0

也没有什么问题,但是刚我们调用getInteger(String key)
的时候传入的参数在Map里面没有呢?
看下面这个demo:

public class TestMap {
    public static void main(String[] args) {
        System.out.println("args = [" + getInteger("444") + "]");
    }

    public static int getInteger(String key){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);

        return map.get(key);
    }
}

运行结果:

Exception in thread "main" java.lang.NullPointerException
    at TestMap.getInteger(TestMap.java:15)
    at TestMap.main(TestMap.java:6)

Process finished with exit code 1

这时候会报一个空指针异常,为什么会有空指针异常呢?
这里涉及到一个JDK1.5之后的自动装箱拆箱机制.
原因大概可以这么说,看一段代码

    public static void main(String[] args) {
        Integer integer = 99;
        int i = integer;
        System.out.println(i);
    }

结果为:

99

Process finished with exit code 0

但是当代码改为这样:

public static void main(String[] args) {
    Integer integer = null;
    int i = integer;
    System.out.println(i);
}

结果为:

Exception in thread "main" java.lang.NullPointerException
    at TestMap.main(TestMap.java:7)

Process finished with exit code 1

其实就是拆箱失败,所以在Map使用的时候,返回值为基本数据类型的情况下,最后不要直接get().
下面给出一段提倡的使用方法:

public class TestMap {
    public static void main(String[] args) {
        /*Integer integer = null;
        int i = integer;
        System.out.println(i);*/

        System.out.println("args = [" + getInteger("444",-1) + "]");
    }

    public static int getInteger(String key,int defaultt){
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("111",111);
        map.put("222",222);
        map.put("333",333);
        if (map.containsKey(key)){
            return map.get(key);
        }

        return defaultt;
    }
}

返回结果:

args = [-1]

Process finished with exit code 0

这样就当key不存在的时候就不会报空指针异常了.

在JDK1.8中已经有这样的方法了:

map.getOrDefault(key,defaultt);
看一下源码:
    default V getOrDefault(Object key, V defaultValue) {
        V v;
        return (((v = get(key)) != null) || containsKey(key))
            ? v
            : defaultValue;
    }

实现原理差不多,此方法在JDK1.8中才有.

由于我无法直接访问具体的网页内容,但我可以根据项目名称《LicensePlateRecognition》(车牌识别)以及通常GitHub仓库中的README.md文件应包含的信息来帮助您撰写一份详细说明文档的基础框架。 --- # 车牌识别系统 (License Plate Recognition) ## 项目简介 本项目旨在开发一套高效的车牌自动识别软件或工具包,利用计算机视觉技术实现对图像或视频流中车辆牌照的快速定位与字符识别功能。适用于智能交通管理系统、停车场自动化管理等领域。 ## 技术栈 - **编程语言**:Python - **深度学习框架**:TensorFlow / PyTorch - **其他库支持**: - OpenCV用于图像预处理 - NumPy进行数值计算 - Matplotlib绘制图形结果 ## 数据集描述 训练数据来源于多种渠道,包括但不限于公开的数据集如[KITTI](http://www.cvlibs.net/datasets/kitti/) 和自建样本集合。每个数据点包含了原始图片及其对应的标签信息(车牌位置坐标及文字内容)。 ## 安装指南 1. 克隆该项目到本地 ```bash git clone https://github.com/pingxi1009/LicensePlateRecognition.git ``` 2. 创建虚拟环境并激活 ```bash python3 -m venv venv source venv/bin/activate # Linux/MacOS; For Windows use `venv\Scripts\activate` ``` 3. 安装依赖项 ```bash pip install -r requirements.txt ``` 4. 下载预训练模型权重文件至指定目录(可选) 5. 开始实验前,请确保所有依赖已正确安装并且版本兼容。 ## 快速开始 ```python from lpr import LicensePlateRecognizer model = LicensePlateRecognizer() image_path = 'path/to/image.jpg' result = model.predict(image_path) print(result) # {'bbox': [x, y, width, height], 'text': 'ABC123'} ``` ## 训练流程 1. 准备数据集,并将其划分为训练集、验证集和测试集; 2. 配置网络架构参数; 3. 设置损失函数、优化器等超参; 4. 进行多次迭代训练直至收敛; 5. 在验证集上评估性能指标; 6. 使用测试集做最终效果检验。 ## 模型评估 为了客观评价模型的好坏,我们采用了如下几个关键指标来进行综合考量: - 精确率(Precision) - 召回率(Recall) - F1分数 - 平均精度值 mAP(mean Average Precision) ## 致谢 感谢所有为该项目贡献代码或者提出宝贵意见的朋友! --- 请注意这只是一个基本模板,具体细节还需要结合实际项目情况进一步完善。希望这份文档能够对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值