在单个二维数组中存储多种数据类型

时间:2011-02-24 08:55:47

标签: java multidimensional-array

我需要在二维数组中存储多种数据类型(如int或string)。使用Object[][]确实可以解决问题。但这是一个很好的方法吗?

Object[][]数组如何保留堆空间?我的意思是,根据哪种数据类型?是否会导致任何资源浪费?

我试图做这样的事情: -

Object[][] dataToBeWritten={ {"Pami",34,45}, {"Ron","x",""}, {"spider","x",""} };

修改:如果存在任何更好的选择,您可以提出更好的选择..

4 个答案:

答案 0 :(得分:3)

请参阅How to calculate the memory usage of a Java arrayMemory 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不包含此类信息。