两个基本功不足导致的bug

作为程序员,基本功不好,可能会在工作中经常碰到一些看起来很隐蔽的 bug,乍看没毛病,自己半天还找不到问题所在。

但是,如果基本功扎实的同学可能一眼就能看出来。

一、HashMap 取不到值

Map<Integer, Integer> map = new HashMap<>();
resMap.put(1, 1);
System.out.println(map.get(1L));
System.out.println(map.get(1));

大家可以看下,上面的代码输出是什么?我稍后公布答案。

1、源码分析

HashMap的get方法源码如下(已增加自己的注释):


public V get(Object key) {Node<K,V> e;return (e = getNode(hash(key), key)) == null ? null : e.value;
}/*** Implements Map.get and related methods.** @param hash hash for key* @param key the key* @return the node, or null if none*/
final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;// 如果map不为空if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {// 如果直接通过传进来的key找到了值,直接返回// 1)比较传进来key的hash值和在map中对应位置找到的结点的hash值是否一致// 2)比较传进来的key对象和在map中对应位置找到的结点的key对象(object)是否相等if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k))))return first;// 如果通过hash找到的结点的下一个节点不为空,说明是链表if ((e = first.next) != null) {// 如果是红黑树,直接红黑树查找if (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key);// 如果是普通链表,链表遍历查找do {if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))return e;} while ((e = e.next) != null);}}// 上述都不满足,返回nullreturn null;
}

如果传的 key 对应的 hash 值,能够匹配到 map 中的结点(只能说 hash 表(map)中这个位置有东西),还需要进行下面两个判断。

1)比较传进来 key 的 hash 值和在 map 中对应位置找到的结点的 hash 值是否一致

2)比较传进来的 key 对象和在 map 中对应位置找到的结点的key对象(object)是否相等。

看了上述源码分析之后,我们公布答案:

null
1

最终的差异就是

(k = first.key) == key || (key != null && key.equals(k))

这段代码,相当于 Objects.equals(key, k)

这里比较的是,map 中存储的对象的key,命名为k,以及get方法传给map的 key,命名为 key。

相当于比较new Integer(1)new Long(1L),我们知道它们是两个不同的对象,所以结果肯定不相等。所以 key 是1L的时候,结果是 null

2、结论

Map 获取值的时候,key类型不匹配,获取不到value。

二、日期计算

大家可以看看下面这段代码,分别输出的是什么?

long nowTime = new Date().getTime();
System.out.println(nowTime);
System.out.println(new Date(nowTime - 7 * 24 * 60 * 60 * 1000));
System.out.println(new Date(nowTime - 25 * 24 * 60 * 60 * 1000));
System.out.println(new Date(nowTime - 30 * 24 * 60 * 60 * 1000));
System.out.println(new Date(nowTime - 60 * 24 * 60 * 60 * 1000));

我们可以把代码扔给 GPT,看它是否能识别其中的 bug。

上面的代码中,存在一个潜在的问题。Date 的构造函数中传入的时间戳参数是 long 类型,而 days * 24 * 60 * 60 * 1000 的计算结果是 int 类型,存在可能的整数溢出问题。
因为 days 和其他整数相乘后超过了 int 类型能表示的范围,所以这会导致计算的结果出现错误。
修复的代码可以将 int 类型的计算结果强制转换为 long 类型,确保计算的精度不会丢失。修复后的代码如下:

int days = Integer.valueOf(daysStr);
long millisecondsInDay = (long) days * 24 * 60 * 60 * 1000;
Date startDate = new Date(System.currentTimeMillis() - millisecondsInDay);

这样就可以避免由于整数溢出而导致的计算错误。

所以,这里的知识点是 int 数组进行计算结果是 int 类型,而 int 类型的范围是 21 亿(2^31 - 1)左右。

如果用来计算时间戳,很容易就会越界,导致非预期结果。

三、总结一下

虽然,非科班、培训出身、转行的程序员,可能会存在基本功不好的情况,但是在 AI 时代,这些相关的 bug 能够更快的解决。

只要你会用 AI,这些有固定答案的领域很容易被 AI 取代。

我们更需要的是深入思考、创造性等,只有人能干的事情。

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

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

相关文章

Scikit-Learn逻辑回归(二)

Scikit-Learn逻辑回归二&#xff1a;多项式与正则化 1、多项式回归回顾1.1、逻辑回归为什么要使用多项式1.2、多项式回归及原理 2、逻辑回归与多项式 1、多项式回归回顾 本文接上篇&#xff1a;Scikit-Learn逻辑回归(一) 上篇中&#xff0c;我们详细介绍了逻辑回归的概念、原理…

哪种造型更适合铸铁焊接平台——河北北重厂家专业设计制造

哪种造型更适合焊接平台取决于具体的需求和条件。以下是一些常见的焊接平台造型供参考&#xff1a; 平面平台&#xff1a;这是最简单的造型&#xff0c;适合进行标准的焊接工作。平面平台提供了稳定的工作表面&#xff0c;便于操作和移动。 运输平台&#xff1a;如果需要频繁移…

spring boot 如何升级 Tomcat 版本

在Spring Boot应用程序中升级内嵌的Tomcat版本通常涉及以下几个步骤&#xff1a; 1. 确定当前使用的Tomcat版本 首先&#xff0c;你需要确定你的Spring Boot应用程序当前使用的Tomcat版本。这可以通过查看项目的pom.xml或build.gradle文件来完成&#xff0c;其中会列出所有的…

计算机网络2 TCP/IP协议

目录 1 前言2 传输层2.1 端口号2.2 UDP2.3 TCP 3 网络层3.1 IP 4 数据链路层4.1 以太网4.2 ARP 5 DNS6 NAT 1 前言 2 传输层 2.1 端口号 端口号又分为&#xff1a; 知名端口&#xff1a;知名程序在启动之后占用的端口号&#xff0c;0-1023。 HTTP, FTP, SSH等这些广为使用的…

Netty(2)-编写简单的Netty应用程序

本篇将讲述如何书写简单的Netty服务端和客户端。 1. 编写服务端 所有的Netty服务器都需要以下两部分&#xff1a; 至少一个ChannelHandler&#xff0c;该组件实现了服务器对从客户端接收的数据的处理&#xff0c;即它的业务逻辑。引导&#xff0c;配置服务器的启动代码。至少…

【CKA模拟题】查找集群中使用内存最高的node节点

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesFind the Node that consumes the most MEMORY in all cluster(currently we have single cluster). Then, store the result in the …

Linux实战笔记(四) 后台运行

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Linux 系统怎么在后台运行命令 0、序言 很多时候&#xff0c;特别是在连接服务器进行开发时&#xff0c;通常会遇到以下问题&#xff1a; 运行一些命令时&#xff0c;终端被阻塞&#xff0c;无法执行其他操作运行一些命令…

云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度

作者&#xff1a;周静、吴宇奇、泮圣伟 在应用开发测试验证通过后、进行生产发布前&#xff0c;为了降低新版本发布带来的风险&#xff0c;期望能够先部署到灰度环境&#xff0c;用小部分业务流量进行全链路灰度验证&#xff0c;验证通过后再全量发布生产。本文主要介绍如何通…

大数据安全分析相关与安全分析的场景

数据采集与预处理 数据源是大数据分析的基础和前提&#xff0c;进行安全分析需要收集的数据源&#xff1a; 日志数据&#xff1a;设备与系统的日志和安全告警信息流量数据&#xff1a;网络流量数据、包括netflow数据和全流量镜像数据支持数据&#xff1a;资产信息、账号信息、漏…

springboot网站开发如何配置log4j日志插件

springboot网站开发如何配置log4j日志插件&#xff01;为了便于服务器等环境下的错误情况的排查根源&#xff0c;还是很有必要使用日志插件的&#xff0c;它可以记录下我们提前埋下的锚点信息。 在遇到故障&#xff0c;查看这些锚点记录的日志信息&#xff0c;可以快速高效的解…

低压MOS在无人机上的应用-REASUNOS瑞森半导体

一、前言 无人机的结构由机身、动力系统、飞行控制系统、链路系统、任务载荷等几个方面组成的。 无人机动力系统中的电机&#xff0c;俗称“马达”&#xff0c;是无人机的动力来源&#xff0c;无人机通过改变电机的转速来改变无人机的飞行状态。即改变每个电机的速度&#xf…

Uni App中遇到的跨域问题

通过与多年开发经验的h5前端沟通后&#xff0c;可以对某些事情更加明确&#xff0c;才此期间&#xff0c;会和后端、运维同学产生密不可分的交集&#xff0c;成了谁来改的问题。 明确&#xff1a;跨域99%由后台来配置&#xff0c;如果在本地开发&#xff0c;可以手动配置&…

VB.NET 中的委托(Delegate)是什么?它们的作用是什么?

VB.NET 中的委托&#xff08;Delegate&#xff09;是什么&#xff1f;它们的作用是什么&#xff1f; 在VB.NET中&#xff0c;委托&#xff08;Delegate&#xff09;是一种类型&#xff0c;它可以用来引用方法。委托可以看作是函数指针的一种类型安全版本&#xff0c;在编译时提…

【Django开发】前后端分离美多商城项目第3篇:用户部分,1. 后端接口设计:【附代码文档】

美多商城项目4.0文档完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;美多商城&#xff0c;项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业。项目准备&#xff0c;配置1. 修改settings/dev.py 文件中的路径信息,2. INS…

数据结构--二叉树(超详细)

目录 1. 树概念及结构 1.1树概念 1.2树的表示 2. 二叉树概念及结构 2.1概念 2.2数据结构中的二叉树 2.3特殊的二叉树 2.4二叉树的存储结构 2.4.1顺序存储 2.4.2链式存储 2.5二叉树的性质 3. 二叉树顺序结构及概念 3.1二叉树的顺序结构 3.2堆的概念及结构 3.3堆的…

【Golang星辰图】数据管理利器:Go编程语言中的数据库和搜索引擎综合指南

高效数据处理&#xff1a;Go编程语言中的数据库和全文搜索引擎详细介绍 前言 Go编程语言是一种强大、类型安全且高效的编程语言&#xff0c;它在处理数据库和搜索引擎方面有着广泛的应用。本篇文章将详细介绍几个Go编程语言中常用的数据库和全文搜索引擎&#xff0c;包括Go-b…

uinapp开发-PHP语言-后端安装说明-适用于圈子-陪玩-交友-校园-团购-外卖-分销等多系统-APP小程序H5多端皆有!

后端安装说明 全新安装客户&#xff0c;按此安装调试步骤&#xff0c;请按顺序&#xff1a; ** 后台安装步骤及说明 ** 1、在服务器里安装宝塔。下载www.bt.cn。 宝塔安装完毕后&#xff0c;安装环境&#xff0c;Nginx或者Apache 请选择PHP7.3 数据库mysql5.6。 NGINX 1.22.1轻…

matlab ICP配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、结果展示1、原始点云2、配准结果3、配准误差本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统…

前端框架推荐 Arco Design

Arco Design - 企业级产品的完整设计和开发解决方案 预览地址&#xff1a;Arco Design Pro - 开箱即用的中台前端/设计解决方案 一 开发 有vue3、React版本。 文档地址&#xff1a;Arco Design - 企业级产品的完整设计和开发解决方案 还配有对应脚手架&#xff1a;GitHub -…

【网络安全】CobaltStrike 使用

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 Cobalt Strike是一款渗透测试神器&#xff0c;Cobalt Strike已经不再使用MSF而是作为单独的平台使…