【问题标题】:Java Byte/byte array space efficiency comparisonJava字节/字节数组空间效率比较
【发布时间】:2013-03-25 04:35:40
【问题描述】:

我需要为大量 8 位值创建一个节省空间的二维数组。我开始使用几层抽象和泛型来编写我的类,以允许代码重用。一旦我开始实现具体类,我就想到我不能将原始类型作为泛型类参数传递,我必须使用包装类。因为我关心空间效率,所以我需要知道:一个Byte 的空间效率与使用原始类的数组相比有什么区别byte 数组

【问题讨论】:

  • 但是为什么要在 8 位值上使用泛型呢?如果显式存储 8 位值,不同类型的用途是什么?
  • @giorashc 我以后可能想以与我当前存储 8 位值相同的独特方式存储 objectsints,二维数组是具体的存储实现,但类的数据结构访问控制是独一无二的。

标签: java generics space-efficiency


【解决方案1】:

是的,与对应的 Wrapper 类对象相比,基元是轻量级的。

你可以在这里阅读: Primitives vs Wrappers

【讨论】:

  • 谢谢 Giorashc,我同时也在尝试这样做。我仍然需要知道如何在这个网站上创建链接!
  • 只需点击地球图标,粘贴您的链接,确认,然后填写括号之间的说明
  • @INdoknight 查看常见问题解答。
【解决方案2】:

根据http://www.javamex.com/tutorials/memory/object_memory_usage.shtml

字节[] 大小 ~= 12 + 长度

Byte[] 大小 ~= 12 + 20 * 长度(20 = 16 + 4 1 Byte 对象的大小 + 4 字节引用)

因此,Byte[] 占用的内存可能是 byte[] 的 20 倍。它实际上是最大值,这取决于您创建字节的方式。 new Byte 始终是一个新对象,Byte.valueOf 始终是一个缓存实例。它还取决于 CPU,对于 x64,每个引用占用 8 个字节。

【讨论】:

  • 我不知道Byte 对象是否被缓存,或者只是整数,但即使不是,我认为对于任何大小的Byte 数组,都可以使用静态@987654324 @ 保存每个值的实例;其开销将固定在 ~4096 字节,每个使用缓存实例的 Byte[] 数组通常每个条目占用 4 个字节。
  • 对 16 个字节的 Byte 对象的每个引用是 4 个字节。至于缓存,这取决于您如何创建它。 new Byte 始终是一个新对象。
  • @Evgeniy Dorofeev:在没有压缩 OOP 的 64 位 JVM 上,引用占用 8 个字节。
【解决方案3】:

观看另一个问题: Wrappers of primitive types in arraylist vs arrays

double 与 Double 的最大问题是后者增加了一些内存开销——在 Sun 32 位 JVM 上每个对象 8 字节,在其他 JVM 上可能或多或少。然后您需要另外 4 个字节(在 64 位 JVM 上为 8 个)来引用该对象。

因此,假设您有 1,000,000 个对象,差异如下:

双[1000000]

每个条目 8 个字节;总计 = 8,000,000 字节

双[1000000]

每个对象实例 16 个字节 + 每个引用 4 个字节;总计 = 20,000,000 字节

这是否重要在很大程度上取决于您的应用程序。除非您发现自己的内存不足,否则请假设这无关紧要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2014-11-02
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多