我正在对ArrayList类进行一些研究,作为学校项目的一部分。
在Oracle网站的Java API文档中,它提到除了给定的少数操作之外的所有操作都是“大致线性时间”。
构造函数没有被列为给定少数的一部分,但我很难看到这个:
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
是线性时间。我在这里错过了什么吗?
答案 0 :(得分:3)
它是线性的,因为数组声明是O(n),如本问题所示:Java: what's the big-O time of declaring an array of size n?
答案 1 :(得分:1)
在您发布的代码中,发生了以下三种情况之一。
如果initialCapacity>0
,elementData = new Object[initialCapacity];
如果initialCapacity==0
,elementData = EMPTY_ELEMENTDATA;
如果initialCapacity<0
,则抛出异常。
除了数字1之外的所有这些操作都需要恒定时间,因为不需要对集合进行迭代。
Number 1需要线性时间,因为声明大小为n
的数组需要O(n)时间。我不会重写整个理由,因为有一篇关于SO的文章覆盖了这个地方。一般概念:这是因为必须为每个n
项分配空间。
我希望得到帮助。 :)