持续总结中!2024年面试必问 100 道 Java基础面试题(四十)

上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(三十九)-CSDN博客

七十九、Java泛型中的T、R、K、V、E分别指什么?

在Java泛型中,TRKVE 是类型参数的常见占位符,它们用来表示泛型类型中的类型变量。这些占位符通常用于泛型类、泛型接口或泛型方法的定义中,它们分别代表不同的类型,但在泛型的上下文中,它们是等价的,可以互换使用。以下是每个占位符的常见用法:

  1. T(Type)

    • T 是最常用的泛型类型参数占位符,代表任意类型。它通常用于表示泛型类或方法中的类型,可以是任何类或接口。
    public class GenericClass<T> {private T value;public GenericClass(T value) {this.value = value;}public T getValue() {return value;}
    }
  2. R(Return Type)

    • R 通常用于泛型方法的返回类型。它代表方法返回值的类型,这个类型可以由方法的泛型参数决定。
    public class UtilityClass {public static <R> R convertType(Object obj, Class<R> clazz) {// 转换obj到Class<R>指定的类型return null;}
    }
  3. KV

    • K 和 V 常用于表示键(Key)和值(Value)的类型,特别是在定义关联数组或映射(如 Map)时。
    public class Pair<K, V> {private final K key;private final V value;public Pair(K key, V value) {this.key = key;this.value = value;}// getters and other methods
    }
  4. E(Element)

    • E 通常用于表示元素类型,比如在定义一个可以存储任意类型元素的集合类时。
    public class ElementList<E> {private List<E> elements;public void addElement(E element) {elements.add(element);}// 其他方法
    }

这些泛型类型参数占位符的使用约定并非强制性的,它们只是常见的用法,目的是为了让代码更具可读性。开发者也可以使用其他任何有效的标识符作为泛型类型参数的名称,例如MyTypeInputTypeOutputType 等。

示例代码

public class Example<T, V> {private T id;private V name;public Example(T id, V name) {this.id = id;this.name = name;}public static <K, V> Map<K, V> createMap(K key, V value) {Map<K, V> map = new HashMap<>();map.put(key, value);return map;}public static void main(String[] args) {Example<Integer, String> example = new Example<>(1, "Example");Map<String, Integer> map = createMap("one", 1);}
}

在这个示例中,Example 类使用了 TV 作为泛型类型参数,而 createMap 静态方法使用了 KV 来创建一个 Map 对象。

总结来说,泛型类型参数的名称可以根据上下文和开发者的偏好来选择,关键是保持代码的清晰和一致性。

八十、Java金额计算怎么避免精度丢失?

在Java中进行金额计算时避免精度丢失是一个重要的考虑因素,因为错误的结果可能会导致财务错误或不准确的报告。以下是一些避免精度丢失的方法:

使用合适的数据类型

  1. BigDecimal

    • BigDecimal 类是Java提供的一个用于进行精确小数运算的类,它允许进行多精度的定点数运算,非常适合用于金额计算。
  2. doublefloat

    • double 和 float 类型是基于IEEE 754标准的浮点数,它们在表示非常大或非常小的数值时可能会有精度问题,因此不推荐用于精确的金额计算。

使用 BigDecimal 的最佳实践

  1. 避免使用构造器

    • 不推荐使用 BigDecimal 的构造器(如 BigDecimal(double))从 double 或 float 类型创建 BigDecimal 实例,因为这可能会引入初始的精度问题。
  2. 使用字符串构造器

    • 使用 BigDecimal(String) 构造器从字符串创建 BigDecimal 对象,这样可以确保数值的精确表示。
  3. 链式操作

    • 使用 BigDecimal 的链式方法调用,如 add()subtract()multiply() 和 divide() 等,来进行运算。
  4. 设置小数点后的位数

    • 在进行除法运算时,可以使用 setScale() 方法设置小数点后的位数和舍入模式。

示例代码

import java.math.BigDecimal;
import java.math.RoundingMode;public class MonetaryCalculation {public static void main(String[] args) {// 使用字符串构造BigDecimal对象BigDecimal amount1 = new BigDecimal("100.5");BigDecimal amount2 = new BigDecimal("2.5");// 进行加法和减法运算BigDecimal sum = amount1.add(amount2);BigDecimal difference = amount1.subtract(amount2);// 进行乘法和除法运算,并设置结果的小数点后位数BigDecimal product = amount1.multiply(amount2);BigDecimal quotient = amount1.divide(amount2, 2, RoundingMode.HALF_UP);System.out.println("Sum: " + sum);System.out.println("Difference: " + difference);System.out.println("Product: " + product);System.out.println("Quotient: " + quotient);}
}

在这个示例中,我们使用 BigDecimal 类进行了金额的加法、减法、乘法和除法运算。注意,我们使用字符串构造器创建 BigDecimal 对象,并在除法运算后设置了小数点后的位数和舍入模式。

注意事项

  • 避免类型转换:在进行金额计算时,避免将 BigDecimal 转换为 double 或 float 类型。
  • 舍入模式:在设置小数点位数时,选择合适的舍入模式非常重要,如 RoundingMode.HALF_UP 是最常用的模式之一。
  • 维护精度:在设计财务系统时,始终保持足够的精度以避免舍入误差的累积。

总结来说,为了避免Java中的金额计算精度丢失,推荐使用 BigDecimal 类,并遵循最佳实践,如使用字符串构造器创建对象,链式调用运算方法,并在需要时设置小数点后的位数和舍入模式。

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

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

相关文章

Babylon.js 7.0开发入门教程

Babylon.js 是一个功能强大的开源 3D 引擎&#xff0c;能够使用 JavaScript 渲染交互式 3D 和 2D 图形。它是为 Web 甚至 VR 创建游戏、演示、可视化和其他 3D 应用程序的绝佳选择。Babylon.js最新版本是7.0。 Babylon.js 是免费、开源和跨平台的&#xff0c;是 Unity 和 Unre…

LeetCode 每日一题 ---- 【1463.摘樱桃 II】

LeetCode 每日一题 ---- 【1463.摘樱桃 II】 1463.摘樱桃II方法&#xff1a;动态规划&#xff08;递推&#xff09; 1463.摘樱桃II 方法&#xff1a;动态规划&#xff08;递推&#xff09; 昨天是摘樱桃I&#xff0c;今天是II&#xff0c;与昨天的区别主要在于&#xff0c;今…

【进程替换】多进程程序替换原理 | 进程程序替换函数 | execlexecv | execlpexecvp

目录 多进程程序替换 多进程程序替换原理 进程程序替换函数详解 execl&execv execlp&execvp execle&execvpe execve 多进程程序替换 我们想要进程替换的同时不影响旧的进程&#xff08;使用多进程版&#xff09;fork创建子进程&#xff0c;让子进程去替换执…

2008NOIP普及组真题 4. 立体图

线上OJ&#xff1a; 一本通-1977&#xff1a;【08NOIP普及组】立体图 核心思想&#xff1a; 本题采用模拟方法一个一个画小方块&#xff08;虽然画的是立体空间的积木&#xff0c;但本质还是在二维平面上画图形&#xff09; 本题的难点在于&#xff1a; 1、如何确定二维平面画…

tengine-docker镜像制作

1.下载 wget https://tengine.taobao.org/download/tengine-3.0.0.tar.gz 或者直接下载这个包括下边两个配置文件了 https://download.csdn.net/download/cyw8998/89286114 2.编辑nginx.conf文件 #####user nobody; worker_processes 1;#error_log logs/error.log; #er…

浅析扩散模型与图像生成【应用篇】(二十三)——Imagic

23. Imagic: Text-Based Real Image Editing with Diffusion Models 该文提出一种基于文本的真实图像编辑方法&#xff0c;能够根据纯文本提示&#xff0c;实现复杂的图像编辑任务&#xff0c;如改变一个或多个物体的位姿和组成&#xff0c;并且保持其他特征不变。相比于其他文…

c语言题库之序列合并

文章目录 前言C语言题目&#xff1a;分析1. 合并逻辑2.图解合并逻辑 代码实现注意事项总结思考 前言 在编程中&#xff0c;我们经常遇到需要将两个有序序列合并为一个有序序列的问题。下面&#xff0c;我们就来详细探讨一下如何解决这个问题&#xff0c;包括输入处理、合并逻辑…

python 根据网址和关键词批量下载影像

最近用到了GLASS的LAI产品&#xff0c;但这个产品的文件夹分得很细&#xff0c;我需要的影像又有8个瓦片&#xff0c;一个一个点击很麻烦&#xff0c;于是探索了批量下载的方法 一、下载1幅 import requests import re import os import requests import re# 网页URLurl &…

深入理解Java HashSet类及其实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Java中什么是多态?多态的实现原理是什么?多态在Java中的意思实现方式是什么?多态在框架设计中有什么作用应用场景?

什么是多态&#xff1f; 多态是面向对象编程中的一个重要概念&#xff0c;它允许不同类的对象对同一消息做出响应。在 Java中&#xff0c;多态通常体现为子类对象可以替代父类对象的特性。这意味着你可以使用父类的引用来引用子类的对象。 多态的实现原理&#xff1a; 多态的…

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

Channel实现Flutter与原生平台之间的双向通信

文章目录 &#xff08;一&#xff09;通过MessageChannel实现Flutter与原生平台之间的双向通信Flutter端实现MessageChannel通信步骤&#xff1a;Android端实现MessageChannel通信步骤&#xff1a; &#xff08;二&#xff09;通过MethodChannel实现Flutter与原生平台之间的双向…

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

7-Zip命令行调用命令收集(20个)

列出压缩文件的内容: 7z l archive.7z 解压压缩文件到当前目录: 7z x archive.7z 解压压缩文件到指定目录: 7z x archive.7z -o"C:\path\to\extract" 创建新的压缩文件 (添加到archive.7z): 7z a archive.7z file_to_compress 创建包含多个文件的压缩文件: 7z a arc…

【JVM】了解JVM规范中的虚拟机结构

目录 JVM规范的主要内容 1&#xff09;字节码指令集(相当于中央处理器CPU) JVM指令分类 2&#xff09;Class文件的格式 3&#xff09;数据类型和值 4&#xff09;运行时数据区 5&#xff09;栈帧 6&#xff09;特殊方法 7&#xff09;类库 JVM规范的主要内容 1&#…

Vue3+ElementPlus+TS开发业务功能的问题汇总(持续更新)

1.开发表单弹框功能时遇到两个问题&#xff1a;加入了校验规则后&#xff0c;无论下拉框是否选择数据下面的红色提示都会触发显示不会自动隐藏 &#xff1b; 另外&#xff0c;新增的功能在提交后数据无法重置&#xff0c;这种在修改时可能会出现&#xff0c;但新增正常情况是不…

走进C++:C到C++的过渡

目录 什么是C呢&#xff1f; C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一&#xff1a;命名空间 命名空间有个强大的功能 如何使用 语法糖二&#xff1a;缺省参数 语法糖三&#xff1a;函数重载 语法糖四&#xff1a;引用 引用传参 引用返回 引用和…

【ZZULIOJ】1100: 求组合数(函数专题)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 马上要举办新生程序设计竞赛了&#xff0c;与以往不同的是&#xff0c;本次比赛以班为单位&#xff0c;为了全面衡量一个班级的整体水平&#xff0c;要求从一个班的m位同学中任选k位同学代表本…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制&#xff08;2&#xff09; 计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView&#xff0c;然后有好多行&#xff0c;再把要查询的行内容完整的传给 ad…