优化的变量声明基元与空对象

卡皮尔

我有一个名为Location的类,它具有2种类型的信息,一种是nodeID(整数),另一种是diskPosition(长整数)。我的应用程序需要创建此Location类的许多对象,但是大多数时候,我会为Location类中的这两个变量之一分配默认值(例如-1)。

我的问题是“我应该将这些nodeID和diskPosition声明为Integer和Long并分配默认值null而不是将它们保持为原始值并将默认值分配为-1)”

我担心的是我的Location对象占用的内存量,我想将其最小化。

以下是Location类的代码段:

public class Location
{
    private int     nodeID  = -1;
    private long    diskPos = -1;

    public Location(long diskPos)
    {
        this.diskPos = diskPos;
    }

    public Location(Node node)
    {
        this.nodeID = node.getNodeID();
    }

    // Test main method to elaborate usage of Location object
    public void main(String[] args)
    {
        Map<Integer, Location> cellIDToLocationMap = new HashMap<Integer, Location>();

        // Consider there is a list of nodes which is obtained from somewhere
        List<Node> nodeList = getNodeList();

        Location loc = null;
        for (int i = 1; i <= 10000; i++)
        {
            if (i % 2 == 0)
                loc = new Location(nodeList.get(i));
            else
                loc = new Location(i);

            // Put in map
            cellIDToLocationMap.put(i, loc);
        }
    }
}
克里斯

答案取决于您创建了多少个实例以及nodeIDanddiskPos的分布让我们看一下数字,假设使用32位JVM(或使用指针压缩的64位)。这些值可能仍然与您的JVM实现不匹配,但是对于HotSpot,它们应该是正确的。

随着intlong一个Location实例需要24个字节。使用IntegerLong,取决于。Location情况下需要16个字节,IntegerLong对象可能采取各16,除非它们是共享的。如您所说,如果其中之一在null大多数时间都保持-1(或),则不会占用任何内存,因此总共16或32个字节。无论IntegerLong实例共享依赖于价值和JVM设置。由于diskPos需要很长时间,因此实例被缓存的可能性很小。

因此答案是:原始= 24字节,装箱很可能为32字节。保持原始。

可以,如果你使用实施共同的接口不同类别获得内存消耗降到每个实例16个字节。我不会这样做是为了节省内存(您甚至需要注意数百万个实例),但是对于更具可读性的代码,因为对于字段-1之一,Location它实际上是联合类型,并且您可能拥有代码像这样:

if (location.getNodeId() >= 0) {
    // do something with node id
} else {
    // do something with diskPos
}

面向对象的设计将使您将不同的行为纳入各自的类中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL我可以声明基于另一个变量的变量数据类型

来自分类Dev

Java通用方法声明基础

来自分类Dev

优化-用于语句和变量声明

来自分类Dev

如何在大张旗鼓中声明带有未命名基元的对象?

来自分类Dev

extern变量声明是否还声明(对象)实体?

来自分类Dev

尝试使用自定义类的对象时,字段变量声明为空错误

来自分类Dev

当场对象创建与变量声明

来自分类Dev

变量对象中的函数声明

来自分类Dev

当场对象创建与变量声明

来自分类Dev

是将基元数组分配给变量作为对象(通过引用)还是通过值?

来自分类Dev

C ++ 11向工厂声明基类的朋友

来自分类Dev

C ++ 11向工厂声明基类的朋友

来自分类Dev

使用IIFE声明基因剔除视图模型的好处

来自分类Dev

如何键入“基元的递归对象”?

来自分类Dev

自动优化对于L缓存对象的变量?

来自分类Dev

在Typescript中向其添加函数之前,如何将一个变量声明为空对象?

来自分类Dev

处理对象和基元的Java函数

来自分类Dev

java按值传递基元与对象

来自分类Dev

包含未声明变量作为值的对象变量

来自分类Dev

在Scala中声明一个空变量

来自分类Dev

如何使用空值声明日期时间变量

来自分类Dev

Swift 撤消功能,先前声明的变量始终为空

来自分类Dev

空检查对象中的解构变量

来自分类Dev

使用“优化”声明

来自分类Dev

使用“优化”声明

来自分类Dev

如何声明新的运算符“!??” (测试对象不为空)

来自分类Dev

Powershell 声明对象为空,但我可以看到值

来自分类Dev

变量声明,它是否创建对实际对象或副本的引用?

来自分类Dev

使用内联对象方法调用与声明新变量

Related 相关文章

热门标签

归档