如果我事先知道数组的大小,使用Guava Table实现和2D数组有什么区别?
一个比另一个更有效吗?怎么样? 它会对运行时间产生影响吗?
答案 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 类型的数组(int
,double
等)时,替代方案将是一个包含相应的参考类型(Integer
,Double
等)。但同样,当数组/表格非常大时,这只会是显而易见的。
答案 1 :(得分:3)
除了Marco13所说的内容之外,请阅读:https://stackoverflow.com/a/6105705/1273080。
集合在各方面都优于对象数组 可想而知。
这同样适用。当您需要一些基本的高性能结构时,2D数组是一个低级工具。但是,数组没有有意义的方法,没有行为,没有任何内容,因此通常是类中的底层数据结构,它们会为它们添加一些行为。使用2D固定大小的阵列执行此操作,您将最终得到...一个番石榴式Table
。
此外,Table
可以是2D数组,也可以是Map<R, Map<C, V>>
,将来我们也可能有可调整大小的Table
实现 - 所有这些都在一个界面内。
关于性能 - 你应该总是采用更高级的方法来使代码尽可能可读和清晰,然后衡量性能,只有在问题出现时才采用不同的方法。