- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有什么充分的理由在 64 位 JVM 中使用 short 而不是 int 吗?
我的意思是,两者都将占用 32 位分配的内存。
本主题展示了整数如何能够更快地进行乘法等运算:[In java, is it more efficient to use byte or short instead of int and float instead of double?
我还知道基元数组更适合节省分配的内存。
除此之外,在这两种类型之间进行选择时还有什么需要考虑的吗?
最佳答案
除非您有非常特殊的用例,否则只需使用:
Integer
用于业务对象值、类的成员变量。 int
用于大量原始数据。 整数
对于大多数常见的面向业务的 Java 应用程序,常见的做法是仅使用 32 位 int
或 Integer
,无需进一步考虑,除非您知道自己会值超过 20 亿,在这种情况下使用 long
或 Long
。在现代传统硬件上,没有理由担心使用 short
/Short
。
但是既然你问“选择时还有什么需要考虑的吗”,这里有三种特殊情况:强制限制、移植 C 代码和替代硬件。
如果您想强制执行 short
或 Short
的限制,请使用这些类型。当您知道您应该只拥有小于大约 32,000 的值,并且希望编译器或运行时 JVM 强制执行该值时,请选择这些值。
例如,101 加 1:
short oneOhOnePlusOne = ( (short) 101 + (short) 1 ) ;
System.out.println( "oneOhOnePlusOne: " + oneOhOnePlusOne ) ;
102
接下来,尝试超出限制以查看编译器强制执行该限制。
short shortMaxPlusOne = ( Short.MAX_VALUE + (short) 1 ) ;
System.out.println( "shortMaxPlusOne: " + shortMaxPlusOne ) ;
error: incompatible types: possible lossy conversion from int to short
查看此code run live at IdeOne.com .
这些不同的数字类型可能被放入 Java 中,以便更容易地移植 C 代码,无论是在实践上还是在心理上都更容易。 Java 的发明者很清楚,在那个时代,大多数新编程语言的尝试都以失败告终,并被批评为“不像 C”。因此Objective-C (Java 的灵感),因此出现了 C++ 的怪物。 。
因此,事实上,如果您要移植 C 代码,请使用匹配的类型来复制行为。
顺便说一句……从技术上讲,C 并没有实际定义其数字类型的大小。实际上,几乎每个 C 实现都使用 Java 中的大小。
仅供引用,即使是最现代的语言,例如 Swift和 Kotlin具有 8、16、32 和 64 位整数的内置数字类型。
如果您的应用程序有可能在不基于 x86-64 的其他硬件上运行, ,那么您可能想使用这些类型。针对此类硬件的 Java 替代实现可能会针对较小的类型进行更好的优化。
Array of primitives are preferable for saving memory allocated
首先,不要为此感到压力。不要陷入premature optimization的陷阱。在具有大多数常见应用程序的传统硬件上,使用基元与对象、数组与集合相比所节省的内存都是微不足道的。使用适合您的编码上下文的类型(基元/对象)和结构(数组/集合)。
我的做法:
Integer
,而不是 int
)。我有两个原因。首先,我属于对象迷阵营,他们希望 Java 是纯粹的 OOP,没有任何原语。 (事实上,正在进行研究,看看基元是否会在遥远的 future 版本的 Java 中消失。)其次,我发现当我使用基元时,我最终需要在需要上下文的对象中使用它,例如集合。 关于Java 64 位 - 整数与短整型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150697/
这个问题在这里已经有了答案: Integer summing blues, short += short problem (5 个答案) 关闭 7 年前。 版本:Visual Studio Prof
我尝试执行以下代码: public class Test5 { /** * @param args */ public static void main(String[] args) {
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个简单的类型 data Day = Monday | Tuesday | Wednesday | Thursday | Friday 我是haskell的新手,所以我写==如下。 (==) :
如何实现“简短”和“详细”两个按钮? “短”应该是默认值,并显示页面的一个版本。单击“详细”按钮后,应显示该页面的另一个版本。 由于这有点难以解释,或许可以看下面的例子。 示例页面: 别管内容 需要j
有没有一种方法可以在 C# 中执行此操作,而无需为现有的每个 var 类型创建一个新方法来重载? $box = !empty($toy) : $toy ? ""; 我能想到的唯一方法是: if (t
我想使用 setInterval 创建一个节拍器。我希望能够达到 300 bpm 这样的高 bpm。即使文件足够短,可以根据需要播放多次,它也很容易 打嗝。此外,许多浏览器都存在短音频文件的问题——S
我们现在有一个正在生产中的应用程序,它会将 IAP 收据发送到我们的服务器,这些收据显然太短,而且我们的服务器没有经过 apple 的验证。 Apple 正确验证的长收据长度为 3192。短收据长度均
例如,许多软件使用的许可证 key 。我曾想过对一个序列进行密码签名,所以我可能有 4 个字节用于 ID,8 个字节用于签名,但我找不到合适的算法。 我需要的是攻击者无法轻易生成,但存储在大约 20
作为一个学生项目,我们正在构建一个机器人,它应该跑完规定的路线并捡起一个木制立方体。它的核心是一台运行 debian 的单板计算机,配备 ARM9,频率为 250MHz。因此 Controller 的
在将 short 转换为字节数组时,我在网上找到了以下解决方案,但不太理解所涉及的逻辑。 //buffer is an array of bytes, bytes[] buffer[position]
如何在 PHP namespace 环境中检查对象的类而不指定完整的命名空间类。 例如,假设我有一个对象库/实体/契约(Contract)/名称。 以下代码不起作用,因为 get_class 返回完整
我有一个 View 范围的托管 bean,其托管属性绑定(bind)到查询字符串参数。 JSF 给了我熟悉的异常: javax.faces.FacesException: Property reset
根据 this post我已经修复了对象检查器。有时代码可以很好地运行 10 个条目,使它们全部正确,有时它可以运行 5 个条目。有时它会导致条目错误。 在获取元素的内部文本时总是会失败。当它的 Y/
我正在编写一组工具,其中 C++ 应用程序使用 AES 加密标准对数据进行编码,而 Java 应用程序对其进行解码。据我所知, key 长度必须为 16 个字节。但是当我尝试使用不同长度的密码时,我遇
我有以下代码: short num_short = 1; int possible_new_short = 1; valid = 1; while (valid) { poss
因此,作为 C 的新手,我遇到了我的第一个 SIGSEGV 错误。它出现在一个简短的 C 程序中,该程序旨在成为“猜数字”游戏。它由一个比较两个数字的自定义函数和一个带有输入的 do-while 循环
我不是严格意义上的初级程序员,但我没有接受过数学以外的正规教育 - 所以这纯粹是业余爱好,可能是业余的。 我最近自己开发了一个算法来解决这个问题,但我想知道是否有任何相对简单的算法明显更高效/更快?
我正在使用短条件来区分记录列表中显示的值。 例如,如果我希望强调 ( ) 标识符大于 100 的客户的姓名,请执行以下操作: {# Displays the identifier of the c
我是一名优秀的程序员,十分优秀!