![](/img/trans.png)
[英]What is the difference between ArrayList<?>, ArrayList, ArrayList<Object>?
[英]What is the difference in time & space complexity between declaring an ArrayList object and a List object?
我知道可以通过以下两种方式声明ArrayList的实例:
ArrayList<String> list = new ArrayList<String>();
和
List<String> list = new ArrayList<String();
我知道使用后一种声明可以灵活地将实现从一个List子类更改为另一个List子类(例如,从ArrayList到LinkedList)。
但是,两者的时间和空间复杂度有何不同? 有人告诉我,前一个声明最终将使堆内存用完。 为什么会这样?
编辑:在执行基本操作(如添加,删除和包含)时,两种实现方式的性能是否有所不同?
数据结构的空间复杂度以及对其进行不同操作的时间复杂度都是特定于实现的。 对于上面列出的两个选项,您正在使用相同的数据结构实现,即ArrayList<String>
。 将它们声明为等号左侧的类型不会影响复杂性。 如您所说,在等号左侧键入更通用的类型仅允许交换实现。
决定对象行为的是对象的实际类/实现。 在您的示例中, list
仍然是ArrayList
,因此行为不会改变。
使用List<>
声明而不是ArrayList<>
意味着您将只使用通过List
接口可见的方法,并且如果以后需要另一种类型的列表,则更改它很容易(您只需更改调用到new
)。 这就是为什么我们经常喜欢它。
示例 :首先使用ArrayList
但随后发现您经常需要删除列表中间的元素。 因此,您将考虑切换到LinkedList
。 如果在各处(使用getter / setter等)都使用List
接口,则代码中的唯一更改将是:
List<String> list = new LinkedList<>();
但是如果您使用ArrayList
,那么您将需要重构您的getter / setter签名,潜在的公共方法等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.