Java中是否有任何类似大小的方法?

2022-08-31 11:03:52

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


答案 1

不。在标准的 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 - 程序员可能需要知道才能设计出空间高效的数据结构。但是,我无法想象为什么在运行时通过方法调用在应用程序代码中需要这些信息。


答案 2

摘自 JavaWorld 中的文章

一个肤浅的答案是Java没有提供像C的sizeof()这样的东西。但是,让我们考虑一下为什么Java程序员偶尔会想要它。

C程序员自己管理大多数数据结构内存分配,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内容占用的空间是一半。


推荐