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());
 }