”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Item 更喜欢原始类型而不是打包的原始类型

Item 更喜欢原始类型而不是打包的原始类型

发布于2024-11-11
浏览:729

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

原始类型与原始类型打包原始类型

  • 基本类型:int、double、boolean 等
  • 打包基元类型:整数、双精度、布尔值等
  • Java 有双重类型系统:原始类型和引用类型(对象)。
  • 每个基本类型都有一个对应的包装类。

主要区别

  • 身份与身份价值:
    原语:它们没有身份;具有相同值的两个基元始终相等。
    打包:它们是对象并且有一个标识;两个对象可以具有相同的值但不同的标识。

  • 空值:
    基元: 始终有一个默认值(例如,int 为 0)。
    Packed: 可能为 null,如果处理不当可能会导致 NullPointerException 异常。

  • 表现:
    原语:在时间和空间上更高效。
    打包: 由于创建额外对象而引入开销。

混合基元和包时的常见问题

  • 1.身份而不是价值比较
  • 当比较使用==打包的对象时,您正在比较对象引用,而不是值。这可能会导致意想不到的结果。

有问题的示例:

Comparator naturalOrder = (i, j) -> (i 



问题: 比较 i == j 比较引用,而不是值。
不正确的行为:naturalOrder.compare(new Integer(42), new Integer(42)) 返回 1 而不是 0。

解决方案:
使用 Integer.
类的 CompareTo 方法或实用程序方法

Comparator naturalOrder = Integer::compare;

或者,修正原来的比较器:

Comparator naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i 



2.自动拆箱和 NullPointerException
当使用可以为 null 的打包类型时,如果对象为 null,自动拆箱可能会引发异常。

有问题的示例:

Integer i = null;
if (i == 42) {
    System.out.println("Inacreditável");
}

问题: i 为空;与 42 比较时,发生 null 自动拆箱,导致 NullPointerException.
解决方案:尽可能使用原始类型。

int i = 0;
if (i == 42) {
    System.out.println("Inacreditável");
}

3.由于自动装箱/拆箱导致性能下降
在密集型操作中无意中使用包装类型可能会由于自动装箱和不必要的对象创建而导致性能下降。

有问题的示例:

Long sum = 0L;
for (long i = 0; i 



问题: sum 是一个压缩的 Long;在每次迭代中,都会发生自动装箱/拆箱。

影响:代码速度慢得多,内存使用量过多。
解决方案:
在密集操作中使用局部变量的原始类型。

Long sum = 0L;
for (long i = 0; i 



何时使用封装类型

  • 集合:不能在泛型集合中使用原始类型(例如列表)。
  • 泛型参数:泛型类型不支持原始类型(例如ThreadLocal)。
  • 需要对象的 API:某些 API 需要对象而不是原始类型。

良好实践

  • 首选原始类型:只要有可能,就使用原始类型以实现简单性和效率。
  • 谨防自动装箱/拆箱:自动装箱可减少冗长,但可能会引入微妙的错误。
  • 避免在 Wrapped 中与 == 进行比较:使用 equals() 等方法或比较展开的值。
  • 检查空值:使用封装类型时,请注意它们可能为空并导致 NullPointerException。

概括
原始类型:
更简单、更快。
它们不能为空。
他们没有身份(只有价值)。

打包类型:
需要在集合和通用 API 中使用。
它们可以为空。
他们有对象标识。

版本声明 本文转载于:https://dev.to/giselecoder/item-61-de-preferencia-aos-tipos-primitivos-em-vez-dostipos-primitivos-empacotados-34fk?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-16
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-04-16
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-16
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-04-16
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-16
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-16
  • 如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    如何将多种用户类型(学生,老师和管理员)重定向到Firebase应用中的各自活动?
    Red: How to Redirect Multiple User Types to Respective ActivitiesUnderstanding the ProblemIn a Firebase-based voting app with three distinct user type...
    编程 发布于2025-04-16
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-04-16
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-04-16
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-16
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-04-16
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-16
  • 三.js加载本地3D模型时为何报“跨域请求仅支持HTTP”错误?
    三.js加载本地3D模型时为何报“跨域请求仅支持HTTP”错误?
    在three.js中加载错误:“仅支持HTTP”的Cross Origin请求“ 尝试将本地的3D模型合并到您的三个.js应用程序中时,使用JSONLOADER,您可能会遇到“ Cross fors fors fors”。由于模型的位置与Web浏览器所采用的HTTP协议之间的差异。您的模型可能是使...
    编程 发布于2025-04-16
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-04-16
  • PHP数据库迁移管理技巧
    PHP数据库迁移管理技巧
    [2 如何管理PHP 中的数据库迁移 数据库迁移是应用程序开发的重要组成部分,因为它们允许开发人员以一致且结构化的方式对数据库架构进行版本控制和管理更改。在PHP中,可以手动进行管理数据库迁移,但是使用自动化该过程的迁移工具更有效且易于错误。迁移工具提供了一种有组织的方法来处理模式更...
    编程 发布于2025-04-16

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3