我需要在二维数组中存储多种数据类型(如int或string)。使用Object[][]
确实可以解决问题。但这是一个很好的方法吗?
Object[][]
数组如何保留堆空间?我的意思是,根据哪种数据类型?是否会导致任何资源浪费?
我试图做这样的事情: -
Object[][] dataToBeWritten={ {"Pami",34,45},
{"Ron","x",""},
{"spider","x",""}
};
修改:如果存在任何更好的选择,您可以提出更好的选择..
答案 0 :(得分:3)
请参阅How to calculate the memory usage of a Java array和Memory usage of Java objects: general guide。
例如,让我们考虑一个10x10的int数组。首先,“外部”数组有12个字节的对象标题,后跟10个元素的空格。这些元素是构成行的10个数组的对象引用。那就是12 + 4 * 10 = 52个字节,然后必须向上舍入到8的下一个倍数,得到56.然后,10行中的每一行都有自己的12字节对象头,4 * 10 = 40字节对于实际的整行行,再次使用4个字节的填充,使该行的总数达到8的倍数。因此总共得到11 * 56 = 616个字节。这比你只需依靠10 * 10 * 4 = 400字节就可以获得100个“原始”内注本身一样大。
我认为这只适用于Hotspot。对任何对象的引用,只是链接整数,每个对应4个字节,无论实际对象如何,或者对象为空。对象本身的备用需求是一个完全不同的故事,因为在数组创建时没有保留空间或类似的东西。
答案 1 :(得分:1)
所有对象都通过引用存储。因此存储了对堆内存的引用。因此,为数组分配的内存量是每个条目一个sizeof(引用)。
答案 2 :(得分:1)
一个对象数组基本上是一个指针数组。但是,这就是Java中任何非基本类型数组所得到的 - 一个对象数组和一个字符串数组,以及一个等长的机器人数组占用相同数量的空间。在初始化对象之前,不会分配实际对象的堆空间。
答案 3 :(得分:1)
替代:
使用适当的课程。您正试图采用静态类型语言采用一些动态方法。问题在于,Object[]
无法帮助读者了解他所阅读的内容。事实上,我甚至无法建议一个班级的设计,因为我无法理解你的榜样。什么是{"Pami",34,45}
以及这应该与{"spider","x",""}
有什么关系?
所以我认为这些信息就像foo一样你应该创建一个类Foo
并收集Foo[]
或List<Foo>
中的所有内容。
请记住:不仅评论存储有关您的代码的信息。类型系统包含有关您要完成的内容的有价值信息。 Object
不包含此类信息。