“对你的大脑进行一些训练怎么样?我希望它仍在正常工作。”
“之前,在容器和集合的表中,你看到相同的接口可以有多个实现。我现在告诉你为什么需要这样做。以及 ArrayList 与 LinkedList 有什么不同。”
“原因在于,集合可以通过不同的方式实现,没有一种实现始终是完美的。”在一种方法中,某些操作的速度很快,而另一些操作的速度却很慢。在另一种方法中,情况可能恰恰相反。没有完美的通用型解决方法。”
“因此,我们决定实现同一集合的多个版本。每个实现应针对一小组特定的操作进行优化。不同的集合就是这样产生的。我们将两个类作为示例进行研究:ArrayList 和 LinkedList。”
“在内部,ArrayList 是作为普通数组实现的。因此,在中间插入元素要求我们首先将所有后续元素移动一个位置,然后将新元素放入空闲插槽。获取和设置元素(get、set)的速度很快,因为这些操作只是处理相关的数组元素。”
“LinkedList 具有不同的内部结构。它是作为包含相互关联元素的列表实现的:一组不同的元素,每个元素存储对列表中下一个和上一个元素的引用。要将元素插入此类列表的中间位置,只需更改其未来邻近元素的引用即可。但是,要获取第 130 个元素,必须从 0 到 130 遍历每个对象。换句话说,get 和 set 操作的速度会很慢。。我们来看看下表:”
说明 | 操作 | ArrayList | LinkedList |
---|---|---|---|
获取元素 | get | 快 | 慢 |
设置元素 | set | 快 | 慢 |
添加元素(到列表末尾) | add | 快 | 快 |
插入元素(在任意位置) | add(i, value) | 慢 | 快 |
删除元素 | remove | 慢 | 快 |
“我明白了。现在我开始理解了。是否有任何标准或原则可以帮助我了解在特定情况下哪个集合最合适?”
“为简单起见,你可以遵循以下原则:如果经常要在集合中间插入(或删除)元素,最好使用 LinkedList。在所有其他情况下,ArrayList 更适用。”
“我们将在更高级别的课程中研究它们的结构,现在我们只需练习使用它们。”
GO TO FULL VERSION