size:
1、数组中第一次没有元素的位置
2、数组中有多少元素
构造方法中使用泛型:
构造方法可以为类中的属性初始化,如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,构造方法的定义与之前并无不同,不需要像声明类那样指定泛型
删除数组元素:
判断所传索引的合法性:
if(index<0||index>=size)
throw new IllegalArgumentException(“参数不合法”);
将引用赋值为空 (进行垃圾回收) 。
简单复杂度分析:
大O描述的是算法的运行时间和输入数据之间的关系,如O(n)时间和元素个数成线性关系。渐进时间复杂度,描述n趋近无穷的情况。
1、添加操作:
addLast(e) O(1);addFirst(e) O(n);add(index e) O(n/2)=O(n)采用平均复杂度,时间复杂度期望;动态数组resize() O(n);总的来说添加操作的时间复杂度为O(n),这里我们一般指最坏的情况。
2、删除操作:
3、修改操作:
set(index) O(1)。
4、查询操作:
get(index) O(1)
contains(e) O(n)
find(e) O(n)
增删操作若只对最后一个元素操作依然是O(n),因为resize(最坏情况需要扩容).
5、resize复杂度分析
最坏情况有时意义不大,最坏情况不会每次都出现,考虑均摊复杂度
6、复杂度震荡
addLast和removeLast每次调用都会触发resize。解决(Lazy方案):扩容时变为原来的一倍,缩容时由容积的1/4触发resize,容积减半.
注:缩容时容积不能为0.
队列出队:
首先判断队列是否为空。
将引用赋值为空 (进行垃圾回收)
注意复杂度震荡
循环队列遍历时的两种方法:
for(int i=0;i<size;i++){//将原队列中的元素复制到一个新队列
newData[i]=data[(i+front)%data.length];
}
for(int i=front;i!=tail;i=(i+1)%data.length){
sbr.append(data[i]);
}