Collection 接口的常用方法
▪ 集合作为容器应该具有的功能(增,删,改,查),
▪ 不一定全有。
▪ 集合的基本操作:增加,删除,判断,取出
序号 | 方法名 | 作用 |
1 | add(Object obj) | 添加,存储的是对象的引用 |
2 | size() | 容器中元素的实际个数 |
3 | remove(Object obj) clear() removeAll(Collection<?> c) retainAll(Collection<?> c) | 删除 |
4 | contains(Object obj) isEmpty() | 判断元素 |
5 | iterator() | 遍历元素 |
List不Set接口
▪ Collection 接口存储一组不唯一,无序的对象
▪ List 接口存储一组不唯一,有序(插入顺序)的对象
▪ Set 接口存储一组唯一,无序的对象
▪ Map接口存储一组键值对象,提供key到value的映射
List接口的实现类
▪ List特点:有序,不唯一(可重复)
▪ ArrayList实现了长度可变的数组,在内存中分配连续的空间。
– 优点:遍历元素和随机访问元素的效率比较高
– 缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低
▪ LinkedList采用链表存储方式。
– 优点:插入、删除元素时效率比较高
– 缺点:遍历和随机访问元素效率低下
List接口特有的方法
▪ 凡是可以操作索引的方法都是该体系特有方法
序号 | 方法名 | 作用 |
1(增) | add(index,element) addAll(index,Collection) addAll(Collection) | 在指定索引的位置上插入元素 在指定的引的位置上插入整个集合的元素 在结束插入整个集合的元素 |
2(删) | remove(index) | 根据索引删除指定的元素 |
3(改) | set(index,element) | 使用element替换指定索引位置上的元素 |
4(查) | get(index) subList(from,to) listIterator() | 获取元素 |
Iterator 接口
▪ 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
▪ Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
▪ Iterator接口定义了如下方法:
boolean hasNext(); //判断是否有元素没有被遍历
Object next();//返回游标当前位置的元素并将游标移动到下一个位置
void remove();//删除游标左面的元素,在执行完next之后该
//操作只能执行一次
▪ 所有的集合类均未提供相应的遍历方法,而是把遍历交给迭代器
完成。迭代器为集合而生,与门实现集合遍历
▪ Iterator是迭代器设计模式的具体实现
▪ Iterator方法
– boolean hasNext():判断是否存在另一个可访问的元素
– Object next():返回要访问的下一个元素
– void remove():删除上次访问返回的对象
▪ 可以使用Iterator遍历的本质是什么?
– 实现Iterable接口
▪For-each循环
–增强的for循环,遍历array或Collection的时候相当简便
–无需获得集合和数组的长度,无需使用索引访问元素,无需循环条件
–遍历集合时底层调用Iterator完成操作
▪For-each缺陷
–数组:
▪不能方便的访问下标值
▪不要在for-each中尝试对变量赋值,只是一个临时变量
–集合:
▪不使用Iterator相比,不能方便 的删除集合中的内容
▪For-each总结
–除了简单的遍历并读出其中的内容外,不建议使用增强for
ListIterator的作用解决并发操作异常
▪ 在迭代时,不可能通过集合对象的方法(al.add(?))操作集合中的元素,会发生并发修改异常。所以,在迭代时只能通过迭代器的方法操作元素,但是Iterator的方法是有限的,只能进行判断(hasNext),取出(next),删除(remove)的操作,如果想要在迭代的过程中进行向集合中添加,修改元素等就需要使用ListIterator接口中的方法
序号 | 方法名 | 作用 |
1(增) | addFirst(Object obj) addLast(Object obj) offerFirst(Object obj) offerLast(Object obj) | 添加头 添加尾 1.6版本之后的加头,尾巴 |
2(删) | removeFirst() removeLast(); pollFirst() pollLast() | 删除头 获取元素并删除元素 删除尾 1.6版本之后的删头,删尾 |
3(查) | getFirst() getLast() peekFirst() peekLast() | 获取头 获取尾 获取元素但不删除 1.6版本之后的获取头,获取尾 |
▪ ArrayList
– 遍历元素和随机访问元素的效率比较高
– 插入、删除等操作频繁时性能低下
▪ LinkedList
– 插入、删除元素时效率较高
– 查找效率较低
Set接口中的实现类
▪ Set接口
– Set接口存储一组唯一,无序的对象
– (存入和取出的顺序不一定一致)
– 操作数据的方法不List类似,Set接口不存在get()方法
▪HashSet:采用Hashtable哈希表存储结构
–优点:添加速度快,查询速度快,删除速度快
–缺点:无序
–LinkedHashSet
▪ 采用哈希表存储结构,同时使用链表维护次序
▪有序(添加顺序)
▪TreeSet
–采用二叉树(红黑树)的存储结构
–优点:有序(排序后的升序)查询速度比List快
–缺点:查询速度没有HashSet快
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals方法来完成。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals方法
TreeSet
– 采用二叉树(红黑树)的存储结构
– 优点:有序(排序后的升序)查询速度比List快
– 缺点:查询速度没有HashSet快
泛型
▪ 为什么需要泛型
▪ 解决数据类型操作不统一产生的异常
▪ 使用泛型可以更好的去保护数据类型
▪ 泛型类的定义
…..
package cn.mashibing.demo;
public class Point2<T> {//此处可以随便写标识符号,T是type的简称,也可以写a,b,c
private T var;//var的类型由T指写,由外部指定
public T getVar() {//返回值的类型由外部指定
return var;
}
public void setVar(T var) {//参数的类型由外部指定
this.var = var;
}
} …..