Java源码分析(二)Double
本篇是源码分析的第二篇,上篇我们一起分析了Integer类的源码,本篇一起学习下Double类的源码,看下其实现。
一、Double类图
首先,相比Integer,Double类的源码只有1000+行代码。如下是Integer及其关联类/接口的类图:
通过Integer类的类图,我们总结下它的特点:
- Double类继承自抽象类Number
- Double类实现了Comparable接口
- Double类使用final修饰,因此不可以有子类(不能被继承)
二、String转Double
同Integer类似,在实际工作中,我们用的比较多的,仍然是String转Double。Java也是给我们提供了两个方法:
1、Double.parseDouble
public static double parseDouble(String s) throws NumberFormatException {return FloatingDecimal.parseDouble(s);}
可以看到,parseDouble并非在Double类中实现的,而是借助FloatingDecimal类去实现:
public static double parseDouble(String s) throws NumberFormatException {return readJavaFormatString(s).doubleValue();}
readJavaFormatString方法返回ASCIIToBinaryConverter:
static ASCIIToBinaryConverter readJavaFormatString( String in ) throws NumberFormatException {...}
而ASCIIToBinaryConverter接口有两个方法,分别是doubleValue()和floatValue(),显而易见,分别是转double和转float的方法:
interface ASCIIToBinaryConverter {double doubleValue();float floatValue();}
2、Double.valueOf
另一种方法是Double.valueOf,需要注意的是,valueOf每次都是new一个Double,也就是一个新的对象。
public static Double valueOf(String s) throws NumberFormatException {return new Double(parseDouble(s));}
为什么Double不像Integer搞个缓存呢?浮点数不像整型,比如1和2之间就有无数个浮点数,那么又如何去实现类似IntegerCache的缓存呢?显然是不现实的!
三、isNaN
需要注意的一点,Double内部定义了一个非法的double值,即NaN:
/*** A constant holding a Not-a-Number (NaN) value of type* {@code double}. It is equivalent to the value returned by* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.*/public static final double NaN = 0.0d / 0.0;
相应的,在很多情况下,确实会产生NaN的double值,因此在使用一个double值做一些运算时,记得使用Double.isNaN去判断下该非法值并做相应的异常处理:
/*** Returns {@code true} if the specified number is a* Not-a-Number (NaN) value, {@code false} otherwise.** @param v the value to be tested.* @return {@code true} if the value of the argument is NaN;* {@code false} otherwise.*/public static boolean isNaN(double v) {return (v != v);}
如下代码示例:
public static void main(String[] args) {String s = "NaN";double d = 0d;try {d = Double.parseDouble(s);} catch (NumberFormatException e) {System.out.println(e.getMessage());return;}if (Double.isNaN(d)) {System.out.println(d);return;}d = d * 2.0d;System.out.println(d);}
四、一道题目
那么,看下这道题目输出是什么呢?
public class DoubleTest {public static void main(String[] args) {Double d1 = 100d;Double d2 = 100d;System.out.println(d1 == d2);}
}
答案是false。原因则是上面提到的,valueOf每次都是new一个Double对象。
相比Integer的源码,Double源码相对简单一些。但是需要特别注意使用double时isNaN的判断,否则程序可能产生意想不到的错误。
相关文章:
Java源码分析(二)Double
本篇是源码分析的第二篇,上篇我们一起分析了Integer类的源码,本篇一起学习下Double类的源码,看下其实现。 一、Double类图 首先,相比Integer,Double类的源码只有1000行代码。如下是Integer及其关联类/接口的类图&#…...
文件上传漏洞之条件竞争
这里拿upload-labs的第18关做演示 首先先看代码 $is_upload false; $msg null;if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_name $_FILES[upload_file][name];$temp_file $_FILES[upload_file][tmp_name];$file_ext substr($file_name,strrpos($file_…...
javacv基础04-图像色彩空间转换函数Imgproc.cvtColor()(彩图转灰度图示例)
opencv python 实现方式参考 opencv-19 图像色彩空间转换函数cv2.cvtColor() javacv 中的函数 Imgproc.cvtColor(image, grey, Imgproc.COLOR_BGR2GRAY); 参数说明: image: 原始图像新灰度图转换参数:多种转换方式参考上面链接地址内容 javacv 实现方式…...
Spring Boot进阶(60):5种判断线程池任务是否全部完成的方案 | 实用技巧分享!
1. 前言🔥 多线程编程在现代软件开发中非常常见且重要,而线程池是多线程编程的常用技术。在使用线程池时,通常需要判断线程池中的任务是否全部完成,以便决定程序继续执行的下一步操作。本文将介绍5种判断线程池任务是否全部完成的…...
Git相关介绍和操作
Git 是一个版本控制系统,它可以记录代码的变更历史,并允许多人协同开发。下面是 Git 的基本概念和使用方式: 仓库(Repository):Git 仓库用于存储代码的版本历史,包括代码变更、注释、作者、时间…...
IDEA配置热启动
1.背景 开发过程中,当写完一个功能我们需要运行应用程序测试,可能这个小功能中存在多个小bug,我们需要改正后重启服务器,这无形之中拖慢了开发的速度增加了开发时间,SpringBoot提供了spring-boot-devtools,…...
【附安装包】Fireworks CS6安装教程
软件下载 软件:Fireworks版本:CS6语言:简体中文大小:165.87M安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.0GHz 内存4G(或更高)下载通道①百度网盘丨下载链接:https://pan.baidu.c…...
深度学习-4-二维目标检测-YOLOv3理论模型
单阶段目标检测模型YOLOv3 R-CNN系列算法需要先产生候选区域,再对候选区域做分类和位置坐标的预测,这类算法被称为两阶段目标检测算法。近几年,很多研究人员相继提出一系列单阶段的检测算法,只需要一个网络即可同时产生候选区域并…...
通俗理解DDPM到Stable Diffusion原理
代码1:stabel diffusion 代码库代码2:diffusers 代码库论文:High-Resolution Image Synthesis with Latent Diffusion Models模型权重:runwayml/stable-diffusion-v1-5 文章目录 1. DDPM的通俗理解1.1 DDPM的目的1.2 扩散过程1.3 …...
如何基于自己训练的Yolov5权重,结合DeepSort实现目标跟踪
网上有很多相关不错的操作demo,但自己在训练过程仍然遇到不少疑惑。因此,我这总结一下操作过程中所解决的问题。 1、deepsort的训练集是否必须基于逐帧视频? 我经过尝试,发现非连续性的图像仍可以作为训练集。一个实例࿰…...
C#_委托详解
委托是什么? 字面理解:例如A要建一栋别墅,找到B建筑施工队,请B来建筑别墅。 委托类型规定方法的签名(方法类型):返回值类型、参数类型、个数、顺序。 委托变量可以用来存储方法的引用&#x…...
R包开发-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)
目录 4-添加C函数 5-编辑元数据 6-启用Roxygen,执行文档化。 7-单元测试 8-在自己的计算机上安装R包: 9-程序发布 参考: 为什么要写这篇文章的更新日期?因为R语言发展很快,很多函数或者方式,现在可以使…...
基于数据湖的多流拼接方案-HUDI实操篇
目录 一、前情提要 二、代码Demo (一)多写问题 (二)如果要两个流写一个表,这种情况怎么处理? (三)测试结果 三、后序 一、前情提要 基于数据湖对两条实时流进行拼接࿰…...
Spring MVC 四:Context层级
这一节我们来回答上篇文章中避而不谈的有关什么是RootApplicationContext的问题。 这就需要引入Spring MVC的有关Context Hierarchy的问题。Context Hierarchy意思就是Context层级,既然说到Context层级,说明在Spring MVC项目中,可能存在不止…...
【C++ 学习 ⑱】- 多态(上)
目录 一、多态的概念和虚函数 1.1 - 用基类指针指向派生类对象 1.2 - 虚函数和虚函数的重写 1.3 - 多态构成的条件 1.4 - 多态的应用场景 二、协变和如何析构派生类对象 2.1 - 协变 2.2 - 如何析构派生类对象 三、C11 的 override 和 final 关键字 一、多态的概念和虚…...
合宙Air724UG LuatOS-Air LVGL API控件--进度条 (Bar)
进度条 (Bar) Bar 是进度条,可以用来显示数值,加载进度。 示例代码 – 创建进度条 bar lvgl.bar_create(lvgl.scr_act(), nil) – 设置尺寸 lvgl.obj_set_size(bar, 200, 20); – 设置位置居中 lvgl.obj_align(bar, NULL, lvgl.ALIGN_CENTER, 0, 0) …...
图神经网络与分子表征:番外——基组选择
学过高斯软件的人都知道,我们在撰写输入文件 gjf 时需要准备输入【泛函】和【基组】这两个关键词。 【泛函】敲定计算方法,【基组】则类似格点积分中的密度,与计算精度密切相关。 部分研究人员借用高斯中的一系列基组去包装输入几何信息&am…...
rabbitmq笔记-rabbitmq客户端开发使用
连接RabbitMQ 1.创建ConnectionFactory,给定参数ip地址,端口号,用户名和密码等 2.创建ConnectionFactory,使用uri方式实现,创建channel。 注意: Connection可以用来创建多个channel实例,但c…...
13.Oracle中nvl()与nvl2()函数详解
Oracle中nvl()与nvl2()函数详解: 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值; 函数nvl2(expression1,expression2,expression3)根据参数1是否为null返回参数2或参数3的值 1.nvl:根据参数1是否为null返回参数…...
设置某行被选中并滚动到改行
<el-table :data"tableDamItem" ref"singleTable" stripe style"width: 100%" height"250" highlight-current-row v-on:row-click"handleTableRow"></el-table>/*** 设置表格行被选中,并滚动到该行* param po…...
智能部署copaw:借助快马ai生成能理解自然语言的下载助手
最近在折腾一个叫copaw的工具时,发现手动下载部署特别麻烦,尤其是遇到网络波动和依赖冲突的时候。于是尝试用AI辅助开发的方式,通过自然语言描述需求,让InsCode(快马)平台的AI模型帮我生成一个智能化的下载部署助手。整个过程意外…...
CentOS7 下 Go 多版本管理与无缝升级指南
1. 为什么需要Go多版本管理? 在CentOS7系统上开发Go项目时,经常会遇到这样的尴尬:新项目需要用最新版Go的特性,而老项目必须跑在特定旧版本上才能兼容。我去年就踩过这个坑——用Go 1.21写完的微服务,部署到生产环境发…...
【大模型工程实践③】RAG 基础架构与完整实现
【大模型工程实践③】RAG 基础架构与完整实现:从0到1跑通 作者:AI学习者 | 来源:大模型工程实践学习系列 | 更新:2026年3月 【理论要点速览】 学习本篇前,建议先掌握以下核心理论(点击跳转): ① 为什么需要RAG? ② RAG vs Fine-tuning vs Long Context的决策框架 ③ …...
GCC编译选项详解与工程实践指南
GCC编译选项深度解析与工程实践指南1. 编译选项基础概念1.1 编译过程与选项作用GCC编译过程分为预处理、编译、汇编和链接四个阶段。编译选项通过控制这些阶段的行为,实现不同的编译目标:# 完整编译流程示例 gcc -E main.c -o main.i # 预处理 gcc -S…...
别再死记硬背了!用Python脚本+Modbus Poll工具,5分钟搞懂Modbus功能码怎么用
用PythonModbus Poll实战:5分钟解锁功能码核心逻辑 第一次接触Modbus协议时,那些晦涩的功能码总让我头疼——01H、03H、05H这些十六进制代码就像天书,文档里的理论描述看完就忘。直到我发现用Python脚本配合Modbus Poll工具进行实操测试&…...
【PAT甲级真题】- Is It a Binary Search Tree (25)
题目来源 Is It a Binary Search Tree (25) 题目描述点击链接自行查看 注意点: 这里的二叉搜索树大于等于插到右边 思路简介 一道二叉树模板题(6202年了应该不会还有人不会写二叉树吧bushi ) 一开始想到前序遍历不可能确定一棵树还以为题目…...
Pixel Fashion Atelier保姆级教程:如何将生成结果无缝导入Aseprite进行二次编辑
Pixel Fashion Atelier保姆级教程:如何将生成结果无缝导入Aseprite进行二次编辑 1. 教程概述 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的像素风格图像生成工具,特别适合创作复古RPG风格的时尚设计。本教程将手把手教你如何将生成…...
ms-swift微调框架入门:快速掌握LoRA微调与模型合并技巧
ms-swift微调框架入门:快速掌握LoRA微调与模型合并技巧 1. 引言 在当今大模型技术快速发展的背景下,如何高效地对大型语言模型进行微调成为了许多开发者和研究者的关注焦点。ms-swift作为一款强大的微调框架,提供了丰富的功能和技术支持&am…...
实战构建开放数据可视化平台,从采集到展示的全流程开发指南
今天想和大家分享一个完整的开放数据可视化项目实战经验。这个项目从数据采集到最终展示,涵盖了全流程开发的关键环节,特别适合想积累真实项目经验的朋友参考。 项目背景与目标 开放数据正在成为数字化转型的重要资源,但很多开发者面对海量…...
Python子解释器隔离全解密(从PyThreadState到_PyInterpreterState):20年源码级剖析,首次公开CPython内部隔离边界图谱
第一章:Python子解释器隔离的演进脉络与核心挑战Python长期以来依赖全局解释器锁(GIL)保障线程安全,但这也限制了真正的并行执行能力。为突破这一瓶颈,CPython自3.12起正式引入子解释器(subinterpreters&am…...
