Java基础-集合(二)
迭代器Iterator
- 所有集合类均未提供相应的遍历方法,而是把把遍历交给迭代器完成。迭代器为集 合而生,专门实现集合遍历
- 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和Iterator的关系
public interface ListIterator<E> extends Iterator<E>
都可以遍历List
ListIterator和Iterator的区别
- 使用范围不同
- Iterator可以应用于更多的集合,Set、List和这些集合的子类型。
- 而ListIterator只能用于List及其子类型。
- 遍历顺序不同
- Iterator只能顺序向后遍历; ListIterator还可以逆序向前遍历
- Iterator可以在遍历的过程中remove();ListIterator可以在遍历的过程中remove()、add()、set()
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能
使用泛型
- 起因
- JDK1.4以前类型不明确:
- 装入集合的类型都被当作Object对待,从而失去自己的实际类型。
- 从集合中取出时往往需要转型,效率低,容易产生错误。
- 解决办法:泛型,在定义集合的时候同时定义集合中对象的类型
- 好处:增强程序的可读性和安全性
Collections
- 专门用来操作集合的工具类
- 构造方法私有,禁止创建对象
- 提供一系列静态方法实现对各种集合的操作
- 具体操作:搜索、复制、排序、线程安全化等
- 常用方法
Collections.addAll(list, "aaa","bbb","ccc","ccc");
int index = Collections.binarySearch(list, "ccc");
Collections.copy(list2, list);
Collections.fill(list3, "888");
String max = Collections.max(list4);
String min = Collections.min(list4);
Collections.reverse(list4);
List list5 = Collections.synchronizedList(list4);
旧的集合类
Vector
- 实现原理和ArrayList相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
- 两者的主要区别如下
- Vector是早期JDK接口,ArrayList是替代Vector的新接口
- Vector线程安全,效率低下;ArrayList重速度轻安全,线程非安全
- 长度需增长时,Vector默认增长一倍,ArrayList增长50%
Hashtable
- 实现原理和HashMap相同,功能相同,底层都是哈希表结构,查询速度快,很多情况下可互用
- 两者的主要区别如下
- Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
- Hashtable继承Dictionary类,HashMap实现Map接口
- Hashtable线程安全,HashMap线程非安全
- Hashtable不允许null值,HashMap允许null值
新的线程同步集合类
- 早期集合类Vector、Hashtable:线程安全的,是怎么保证线程安排的,使用synchronized修饰方法
- 为了提高性能,使用ArrayList、HashMap替换,线程不安全,但是性能好。使用ArrayList、
HashMap,需要线程安全怎么办呢?- 使用
Collections.synchronizedList(list);Collections.synchronizedMap(m);
解决 - 底层使用synchronized代码块锁
- 虽然也是锁住了所有的代码,但是锁在方法里边,并所在方法外边性能可以理解为稍有提高吧。 毕竟进方法本身就要分配资源的
- 使用
- 在大量并发情况下如何提高集合的效率和安全呢?
- 提供了新的线程同步集合类,委员
java.util.concurrent
包下,使用Lock锁 -
ConcurrentHashMap、CopyOnWriteArrayList 、CopyOnWriteArraySet
: - 注意 不是
CopyOnWriteHashSet
- 提供了新的线程同步集合类,委员