一. 什么是集合类?
二. Collection接口
2.1 Collection子接口(List接口和Set接口)
2.1 Collection的常用方法
三. 迭代器(Iterator)
3.1 关于迭代器
3.2 迭代其的用法
3.3 迭代器的简化:增强for循环
3.4 使用迭代器向集合添加元素
四. List接口
4.1 List接口的方法
4.2 List接口的实现类
4.3 List遍历的方法
4.4 并发修改异常
一. 什么是集合类?
放了方便对多个对象操作,需要一个能对对象存储的容器,它得具备:1、可以存不同的对象类型,2、容器的长度可变(放多少个对象进来就有多大);
就酱~~ 满足这要求的容器就是集合啦;特点如下图~
二. Collection接口
Collection:集合框架的顶层接口。表示一组对象,这些对象也称为 collection 的元素。
2.1 Collection子接口
Collection有两个子接口,他们的特点是:
List接口:可存放重复的元素,元素存取是“有序”的;
Set接口:不可以存放重复的元素,通常元素存取是“无序”的,也有一些实现类是“有序”的。
注意:上方提到的“有序,无序”指的是存放元素时是否会记住元素的存放顺序;并非对元素进行“排序”。
2.2 Collection接口中的常用方法【返回类型 方法名(形参)】
添加操作
- boolean add(boject e):确保此 collection 包含指定的元素(可选操作)。
- boolean addAll(Collectiong c):将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
删除操作
- void clear():移除此 collection 中的所有元素(可选操作)。
- boolean remove(object o):从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
- boolean removaAll(Collection c): 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
查询操作
- int size():返回此 collection 中的元素数
判断操作
- boolean isEmpty():如果此 collection 不包含元素,则返回 true。
- boolean contains(Object obj):如果此 collection 包含指定的元素,则返回 true。
- boolean containsAll(Collection c):如果此 collection 包含指定 collection 中的所有元素,则返回 true。
迭代操作
- Iterator iterator():返回在此 collection 的元素上进行迭代的迭代器。
三. 迭代器:Iterator
3.1 关于迭代器
迭代是取出集合中元素的一种方式,因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器;迭代器的next方法返回值类型是Object,所以要记得类型转换。
迭代器读取元素示意图:
1 Collection c = new ArrayList(); //创建集合对象
2 Iterator it = c.iterator(); //获取此集合的迭代器
3 while(it.haxNext()){ //遍历这个集合
4 Object o = it.next();
5 }
说明:
1、迭代器不保证取出元素的顺序和存入的顺序一致,“有些”是靠集合实例本身保证的;
2、迭代器本身是一个接口,该方法返回的是一个迭代器实例对象,通常使用的是接口多态使用迭代器;
3、迭代器中常用的两个方法是:
boolean hasNext():判断是否有下一个元素;
boolean next();取出下一个元素。
3.2 迭代器的两种用法
1 //迭代器用法一
2 for(Iterator iter = iterator();iter.hasNext();){
3 System.out.println(iter.next());
4 }
5
6 //迭代器用法二
7 Iterator iter = l.iterator();
8 while(iter.hasNext()){
9 System.out.println(iter.next());
10 }
3.3 增强for循环:迭代器的一种简化方法
1 //for(数据类型 迭代变量名:集合对象)
2 for(Object obj : c){ 3 //do something with obj
4 }
3.4 如何使用迭代器添加集合元素?
iterator接口没有添加元素的方法,但是它的子接口ListIterator有,故:用ListIterator迭代,迭代器添加元素。(集合本身迭代,使用集合本身方法添加元素,如add
四. List接口
4.1 List接口方法
特有方法
- void add(int index,Object element):在列表的指定位置插入指定元素(可选操作)。
- Object get(int index):返回列表中指定位置的元素。
- Object set(int index,Object element):用指定元素替换列表中指定位置的元素(可选操作)。
4.2 List接口的实现类
- ArrayList:线程不安全,查询速度块,底层用的是数组,增删慢;
- LinkedList:线程不安全,链表结构,增删速度快,查询慢;
- Vector:线程安全,但速度慢,已被ArrayList替代
4.3 List接口遍历的方法
1. 迭代器遍历
1 //迭代器遍历list
2 Iterator it = list.iterator(); 3 while(it.hasNext()){ 4 Object obj = it.next(); 5 System.out.println(obj); 6 }
2. 增强for循环
1 //增强for循环遍历集合
2 for(Object obj : list){ 3 System.out.println(obj); 4 }
3. 普通for循环配合get方法
1 //普通for循环,获取指定位置的元素
2 for(int i = 0;i<list.size();i++){ 3 System.out.println(list.get(i)); 4 }
4.4 并发修改异常
在使用迭代器遍历ArrayList的时候,若使用集合本身的方法修改了集合,将导致并发修改异常:ConcurrentModificationException,故需注意:
- 使用迭代器遍历,使用迭代器删除元素
- 使用集合本身遍历,使用集合本身方法删除元素
vector类
Vector类是1.0就已经有的,在1.2被整合到集合框架中,其中的大部分方法都和ArrayList相同,但它是线程安全的,所以效率要低,特有方法:
- void addElement(E obj):将指定的组件添加到此向量的末尾,将其大小增加1。
- void removeElement():从此向量中移除全部组件,并将其大小设置为零。
- elements():返回此向量的组件的枚举。
LinkedList类
LinkedList类底层使用的是链表结构保存数据,绝大多数方法和ArrayList相同,只不过多了一些对首尾元素操作的方法
LinkedList底层使用的是链表,但是自己维护了一个索引,所以提供了get(int index)的方法来通过索引获取元素,但此方法的效率很低,一般不使用
小结:List接口的实现类选择
是否需要线程安全: 如果是,可以选择Vector,但是可以通过其他方式让其他两种类也达到线程安全的,所以一般也不会使用Vector;
如果不是,考虑是增删多还是查询多,增删多:使用LinkedList;查询多:使用ArrayList