我知道可以通过以下两种方式声明ArrayList的实例:
ArrayList<String> list = new ArrayList<String>();
和
List<String> list = new ArrayList<String();
我知道使用后一个声明提供了将实现从一个List子类更改为另一个子类的灵活性(例如,从ArrayList更改为LinkedList)。
但是,两者的时间和空间复杂性有何不同?有人告诉我,前一个声明最终会使堆内存耗尽。为什么会这样?
编辑:执行添加,删除和包含等基本操作时,两种实现的性能是否不同?
答案 0 :(得分:0)
数据结构的空间复杂性以及不同操作的时间复杂性都是特定于实现的。对于上面列出的两个选项,您使用的是相同的数据结构实现,即ArrayList<String>
。您在等号的左侧声明它们的类型不会影响复杂性。正如你所说的那样,在等号左边的类型更通用只允许交换实现。
答案 1 :(得分:0)
决定对象行为的是它的实际类/实现。在您的示例中,list
仍为ArrayList
,因此行为不会发生变化。
使用List<>
声明而不是ArrayList<>
意味着您将只使用List
接口可见的方法,如果以后需要其他类型的列表,它将会很容易改变它(你只需将呼叫改为new
)。这就是我们经常喜欢它的原因。
示例:您首先使用ArrayList
,但后来发现您经常需要删除列表中间的元素。因此,您会考虑切换到LinkedList
。如果您到处使用List
接口(在getter / setter等中),那么代码中唯一的变化就是:
List<String> list = new LinkedList<>();
但是如果你使用ArrayList
,那么你需要重构你的getter / setter签名,潜在的公共方法等。