我有一个名为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);
}
}
}
答案取决于您创建了多少个实例以及nodeID
anddiskPos
值的分布。让我们看一下数字,假设使用32位JVM(或使用指针压缩的64位)。这些值可能仍然与您的JVM实现不匹配,但是对于HotSpot,它们应该是正确的。
随着int
和long
一个Location
实例需要24个字节。使用Integer
和Long
,取决于。的Location
情况下需要16个字节,Integer
和Long
对象可能采取各16,除非它们是共享的。如您所说,如果其中之一在null
大多数时间都保持-1(或),则不会占用任何内存,因此总共16或32个字节。无论Integer
或Long
实例共享依赖于价值和JVM设置。由于diskPos
需要很长时间,因此实例被缓存的可能性很小。
因此答案是:原始= 24字节,装箱很可能为32字节。保持原始。
你可以,如果你使用实施共同的接口不同类别获得内存消耗降到每个实例16个字节。我不会这样做是为了节省内存(您甚至需要注意数百万个实例),但是对于更具可读性的代码,因为对于字段-1之一,Location
它实际上是联合类型,并且您可能拥有代码像这样:
if (location.getNodeId() >= 0) {
// do something with node id
} else {
// do something with diskPos
}
面向对象的设计将使您将不同的行为纳入各自的类中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句