1.时间复杂度角度分析数组(Array)查询效率
数据结构:数组
数组优点:基于index下标查询效率比较高
数组缺点:而根据元素值下标查询效率是非常低的
1.基于数组元素值查询和基于index下标查询的时间复杂度的计算
- 基于index下标查询:只需查询一次,我们可以根据下标直接定位到数组里对应的下标值,找到该下标对应的元素,时间复杂度为O(1)
- 基于数组元素值查询:我们通过循环遍历比较进行查询,查询一次时间复杂度为O(n),假设我们的元素存放在index=5的位置上,那么我们需要比较6次,因为数组下标是从0开始,所以这个时候O(n)中n=6(因为需要查询6次),最终才找到我们的元素值对用的index位置。
总结:
:
- 基于数组index下标查询的效率是非常高的,时间复杂度为O(1)
- 根据数组元素值进行查询的效率是非常慢的,时间复杂度为O(n)
2.ArrayList的add()、get方法、remove方法如何实现
通过ArrayList底层的无参构造函数可以得出,默认底层初始化了一个空数组
add方法如何实现:
- 判断集合容量是否装得下
- 如果装不下则扩容,以1.5倍扩容,将原来数组的容量拷贝到新的数组
get方法如何实现:
- 直接提供根据index下标查询,效率非常高
remove方法如何实现:
- 查找到删除对应的index下标位置后index+1,到最后index元素值向前移动一位
3.Vector和ArrayList集合区别
相同点:
- Vector和ArrayList集合默认的初始容量都是10
- 底层都是基于数组实现
- 都是List接口下的子类
不同点:
- ArrayList集合线程不安全,Vector线程是安全的
- ArrayList每次扩容的容量是原来容量的1.5倍,Vector每次扩容的容量是原来容量的2倍
- Vector扩容时可以自己设置扩容的容量大小,ArrayList则不可以
- ArrayList是通过懒加载的形式初始化容量,Vector直接通过构造函数初始化容量
懒加载形式:真正需要的时候才会加载(ArrayList中只有调用了add方法底层数组才会开始加载容量,不调用add方法底层数组容量依旧为0)