- ArrayList 是长度可变的数组,并实现了迭代器。
- 可以存储不同类型的数据(因为在存储值类型的时候依然采用未装箱的模式,即只存储引用地址。比如存储int 8,会封装为integer,导致性能下降),数组不可以。
- 虽然可以存储不同的数据类型,但是可以通过泛型来规范。使用泛型也可以抵消装箱的性能消耗
- ArrayList的默认顺序就是插入顺序,可以使用Collections.sort来重新排序。一种是数组内的对象实现Comparable接口,一种是实现java.util.Comparator作为sort参数
- sort 在jdk6中是合并排序,在jd7中是timsort
- 增:只在末尾插入的话,O(1),如果是中间插入的话,O(n)
- 删:通过下标删除的话,O(n), 通过值删除的话 ,O(n^2)
- 改:O(1)
- 查:因为ArrayLis的实现就是一个一维数组,所以可以快速通过下标读取数据,O(1),但是如果是遍历查找的话,为O(n)
- 迭代器:remove的时候会还是会O(n) ,这是数组本身的限制。
如果使用嵌套类的话,编译器其实无法知道这个迭代器到底是谁的。但是内部类从属于对象,所以没有语义问题。
从迭代器设计模式来考虑的话,从属于对象,对外部类封闭也是极好的
ps:泛型的好处
- 类型安全(Type Safety):使用泛型定义的类型,在使用时仅能使用指定的类型或类型的衍生类型。
- 性能(Performance):泛型移除了运行时类型检测,消除了装箱和拆箱的开销。
- 可重用(Reusability):泛型打破了数据结构与存储数据类型之间的紧耦合。这提高了数据结构的可重用性