番石榴表与2D数组

时间:2014-04-20 12:27:13

标签: java arrays guava

如果我事先知道数组的大小,使用Guava Table实现和2D数组有什么区别?

一个比另一个更有效吗?怎么样? 它会对运行时间产生影响吗?

2 个答案:

答案 0 :(得分:6)

最明显和最关键的区别是数组始终使用int s进行索引,而Table可以使用任意对象进行索引。

考虑Table Example from the Guava site

Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
weightedGraph.put(v1, v2, 4);
...

此处的索引通过Vertex个对象进行。如果您想对数组执行相同操作,则必须向getIndex类添加一些Vertex方法,并像这样访问数组

double array[][] = new double[4][5];
array[v1.getIndex()][v2.getIndex()] = 4;

这很不方便,特别难以维护 - 尤其是当索引可能会发生变化时(或者必须添加/删除顶点时,尽管您提到的情况并非如此)。

此外,Guava表允许将作为单独的实体获取。在2D数组中,您始终可以访问数组的一个或一个 - 具体取决于您如何解释数组的2个维度。该表允许以Map

的形式访问两者

关于性能:在某些情况下,您的性​​能会出现明显的差异。特别是当您有一个大型 2D primitive 类型的数组(intdouble等)时,替代方案将是一个包含相应的参考类型(IntegerDouble等)。但同样,当数组/表格非常大时,这只会是显而易见的。

答案 1 :(得分:3)

除了Marco13所说的内容之外,请阅读:https://stackoverflow.com/a/6105705/1273080

  

集合在各方面都优于对象数组   可想而知。

这同样适用。当您需要一些基本的高性能结构时,2D数组是一个低级工具。但是,数组没有有意义的方法,没有行为,没有任何内容,因此通常是类中的底层数据结构,它们会为它们添加一些行为。使用2D固定大小的阵列执行此操作,您将最终得到...一个番石榴式Table

此外,Table可以是2D数组,也可以是Map<R, Map<C, V>>,将来我们也可能有可调整大小的Table实现 - 所有这些都在一个界面内。

关于性能 - 你应该总是采用更高级的方法来使代码尽可能可读和清晰,然后衡量性能,只有在问题出现时才采用不同的方法。