Java的集合类主要是 Collection 接口 和 Map 接口
Collection:单列集合(存放单个对象)
Map:双列集合(存放Key-value 键值对)
Collection接口:
1. Collection的实现子类可以存放多个元素,每个元素可以是Object
2. 有些Collection的实现子类可以存放重复的元素,有些不可以
3. 有些Collection的实现子类是有序的(List),有些是无序的(Set)
Collection接口的常用方法:
1. add(); //只要是Object 的子类就可以添加
2. remove(); //可以根据下标删除元素,也可以根据value删除元素
3. contains(); //查找元素是否存在,返回true,false
4. size();
5. isEmpty();
6. clear();
7. addAll(Collection c);
8. containsAll(Collection c);
9. removeAll( Collection c);
Collection接口的遍历方式 -> 使用Iterator 迭代器
Collection接口 实现了 Iterable接口; 只要是实现了Collection接口的类 都可以使用iterator 方法来遍历
通过iterator() 方法 返回一个Iterator 对象
iterator.hasNext(); //判断是否还有下一个元素
iterator.next(); // 下移,并返回元素
步骤:
1. 获取迭代器
Iterator iterator = collection.iterator();
while( iterator.hasNext()){
Object obj = iterator.next();
}
退出while循环,指针指向最后一个元素,如果再次使用next方法就会抛出异常
Object obj = iterator.next(); //此时会抛出NoSuchElementException 异常
如果想要再次遍历,需要重置迭代器
iterator = collection.iterator();
增强for循环 (只能用于遍历 集合 和 数组)
for ( 元素类型 元素名 : 集合名或数组名 ){
对元素操作;
}
增强for循环的底层还是Iterator迭代器
List 常用方法: 实现List接口的类包括:XxxxList,Stack,Vector
实现List接口的集合中元素有序(添加和取出的顺序是一致的),可以重复
实现List接口的集合 支持 索引,底层是数组
list.add(index, value); //在index位置插入value,没有返回值
list.add(index, Collection col); //在index位置插入col的所有元素,返回boolean
list.get(index); //返回index位置的值
list.indexOf(Object obj); // 返回obj在list中第一次出现的下标
list.lastIndexOf( Object obj);
list.remove(index); //移除index位置的元素,并返回该元素值
list.set( index, value); //设置index位置的元素为value,相当于替换
list.sublist( fromIndex, endIndex); //返回 [fromIndex, endIndex) 之间的子list; 左闭右开
ArrayList 可以放入null, 并且可以多个
ArrayList是由数组来实现存储的
ArrayList基本等同于Vector, 但ArrayList是线程不安全的!
ArrayList源码分析:
1. ArrayList底层维护了一个Object类型的数组elementData[]
2. 当创建ArrayList 对象时,如果使用的是无参构造器,则初始的elementDate 容量为0, 第一次添加数据时,则将容量扩大到10,如果需要再次扩容,则扩容为当前容量的1.5倍。
3. 如果使用的是指定大小的构造器( ArrayList(int) ),则初始化elementData的容量为指定大小,如果需要扩容,则直接扩容为elementData容量的1.5倍
Vector:
1. vector 底层也是一个对象数组, Object[] elementData;
2. vector 是线程安全的
3. 扩容机制: 使用无参构造器,默认初始化容量为10,满后,按2倍扩容; 使用有参构造器,满后,直接按2倍扩容
LinkedList:
1. 底层实现了 双向链表 和 双端队列的特点
2. 可以添加任意元素(可以重复),包括null
3. 线程不安全
4. LinkedList 底层维护了一个双向链表
LinkedList 底层维护了两个属性,first 指向 首节点, last 指向 尾节点
每个节点(Node对象),里面维护了prev,next,item属性, prev指向前一个节点,next指向下一个节点
所以 LinkedList 添加和删除元素不是通过数组完成的,相对来说效率高。
ArrayList 和 LinkedList的区别:
1)如果改和差的操作多,选ArrayList(注意是线程不安全的)
2)如果增删的操作多,选LinkList