Java 集合 Collection
使用Java 集合框架的情况:并不知道程序运行时需要多少对象 需要更复杂方式存储对象
Iterator 迭代器
Collection 是 List 和 Set的父接口
Collection接口:
存储一组不唯一,无序的对象。
常用方法:
add(),int size(),contains(), remove(), clear(), isEmpty(), iterator()(迭代器方法)
toArray()
List接口:
储存一组不唯一,有序(插入顺序)的对象
ArrayList 实现类
数组作为底层存储方式。
常用方法:
除继承父类接口的一些方法外
add(int,Obj), addAll(), removeAll(),
set(), get() , …
实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
(没用泛型的时候list.add§;p是Object类型)
add的逻辑:
1.插入前先判断容量是否越界,是则扩容。
1)扩容后比数组最大长度大,则是int的最大值最为数组长度,还没达到数组最大长度,则是数组最大长度
2)正常来说扩容1.5倍 ,如果扩容1.5倍以后还不够,则直接把当前长度赋值给数组新长度
3)如果是新数组 把长度与10比较 大的赋值给新数组长度
2.不需要扩容则直接插入
由于底层是数组,遍历方便,随机访问方便、改动对应方便
LinkedList 实现类
链表作为底层存储方式
常用方法:
除继承父类接口的一些方法外:
addFirst(), addLast(), removeFirst(),removeLast()
getFirst(),getLast()
链表:多个Node节点互相存储地址,以下一个Node的地址存储
遍历不方便,插入和删除元素时效率比较高
LinkedList 和 ArrayList 异同点:
相同点:
同为List实现类,元素有序,不唯一 ,长度可变
共有Collection及List 的通用方法
不同点:
ArrayList:数组作为底层储存方式,可随元素个数分配不同大小的数组,遍历元素访问元素效率高,插入和删除元素比较差。
LinkedList:双向链表作为底层存储方式,根据Node对象中的Node属性next 和 prev 来确定顺序 遍历不方便 插入 删除元素效率高
ArrayList 和LinkedList 的遍历方法:
1.fori
2.增强for
List list=new ArrayList();
for(Object obj : list){
sout(obj);
}
3.迭代器
Iterator ite=list.iterator();
while(ite.hasNext){
sout(ite.next());
}