Java中有类似sizeof的方法吗?

新手上路,请多包涵

Java 中是否有任何内置方法来查找任何数据类型的大小?有什么办法可以找到尺寸吗?

原文由 Ankit Sachan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 645
2 个回答

没有。标准 Java SE 类库中没有这样的方法。

设计者的观点是 Java 不需要它,因为该语言不需要应用程序1知道需要为原始值、对象或具有给定元素数量的数组保留多少空间。

您可能认为 sizeof 运算符对于需要知道其数据结构占用多少空间的人很有用。但是,您也可以使用 Java 内存分析器简单可靠地获取此信息以及更多信息,因此不需要 sizeof 方法。


之前的评论者指出 sizeof(someType)4 更具可读性。如果您接受可读性论点,那么补救措施就在您手中。简单地定义一个这样的类……

 public class PrimitiveSizes {
    public static int sizeof(byte b) { return 1; }
    public static int sizeof(short s) { return 2; }
    // etcetera
}

…并静态导入它…

 import static PrimitiveSizes.*;

或者定义一些命名常量;例如

public static final int SIZE_OF_INT = 4;

或者(Java 8 及更高版本)使用 Integer.BYTES 常量,等等。


为什么 Java 设计者没有在标准库中实现它?我的猜测是:

  • 他们认为没有必要,
  • 他们认为没有足够的需求,并且
  • 他们认为不值得付出努力。

还有一个问题是下一个需求将是一个 sizeof(Object o) 方法,这充满了技术困难。

上面的关键词是“他们”!


1 - 程序员可能需要知道才能设计节省空间的数据结构。但是,我无法想象为什么在运行时通过方法调用在应用程序代码中需要这些信息。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 JavaWorld 中的文章

一个肤浅的答案是 Java 不提供任何类似于 C 的 sizeof() 的东西。但是,让我们考虑一下为什么 Java 程序员可能偶尔需要它。

AC 程序员自己管理大多数数据结构内存分配,而 sizeof() 对于了解要分配的内存块大小是必不可少的。此外,就对象初始化而言,像 malloc() 这样的 C 内存分配器几乎什么都不做:程序员必须设置所有对象字段,这些字段是指向更多对象的指针。但总而言之,C/C++ 内存分配效率很高。

相比之下,Java 对象分配和构造是捆绑在一起的(不可能使用已分配但未初始化的对象实例)。如果 Java 类定义了引用更多对象的字段,通常在构造时设置它们。因此,分配 Java 对象通常会分配大量相互关联的对象实例:对象图。再加上自动垃圾收集,这一切都太方便了,可以让您感觉永远不必担心 Java 内存分配细节。

当然,这只适用于简单的 Java 应用程序。与 C/C++ 相比,等效的 Java 数据结构往往占用更多的物理内存。在企业软件开发中,接近当今 32 位 JVM 上的最大可用虚拟内存是一个常见的可伸缩性约束。因此,Java 程序员可以从 sizeof() 或类似的东西中获益,以关注他的数据结构是否变得太大或包含内存瓶颈。幸运的是,Java 反射允许您很容易地编写这样的工具。

在继续之前,我将放弃对本文问题的一些常见但不正确的回答。谬误:不需要 Sizeof() 因为 Java 基本类型的大小是固定的

是的,Java int 在所有 JVM 和所有平台上都是 32 位的,但这只是对这种数据类型的程序员可感知宽度的语言规范要求。这样的 int 本质上是一种抽象数据类型,可以通过 64 位机器上的 64 位物理内存字进行备份。非原始类型也是如此:Java 语言规范没有说明类字段应如何在物理内存中对齐,也没有说明布尔数组不能作为 JVM 中的紧凑位向量来实现。谬误:您可以通过将对象序列化为字节流并查看生成的流长度来衡量对象的大小

这不起作用的原因是因为序列化布局只是真实内存布局的远程反映。一种简单的方法是查看字符串如何序列化:在内存中每个字符至少为 2 个字节,但在序列化形式中字符串是 UTF-8 编码的,因此任何 ASCII 内容占用一半的空间

原文由 Ramesh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题