迭代器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
集合总结

Java基础-集合(二)_集合类