Collections

Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. List<String> list =new ArrayList<>();
  4. list.add("apple");
  5. list.add("peel");
  6. list.add("banana");
  7. System.out.println("排序前"+list); //排序前[apple, peel, banana]
  8. Collections.sort(list);
  9. System.out.println("排序后"+list); //排序后[apple, banana, peel]
  10. Collections.shuffle(list);
  11. System.out.println("洗牌后"+list); //洗牌后[peel, apple, banana]
  12. ArrayList<Integer> list1 = new ArrayList<>();
  13. for (int i = 0; i<5; i++){
  14. list1.add(i);
  15. }
  16. System.out.println("洗牌前"+list1); //洗牌前[0, 1, 2, 3, 4]
  17. Collections.shuffle(list1);
  18. System.out.println("洗牌后"+list1); //洗牌后[4, 3, 2, 1, 0]
  19. List<Integer> list2 = Collections.unmodifiableList(list1); //不可变操作!
  20. // 立刻扔掉mutable的引用:
  21. //list1 = null;
  22. list1.add(7);
  23. System.out.println(list1); //[4, 2, 3, 0, 1, 7]
  24. System.out.println(list2); //[4, 2, 3, 0, 1, 7] list1增删会影响list2,
  25. list2不可以增删操作!
  26. }
  27. }

因此,如果我们希望把一个可变List封装成不可变List,那么,返回不可变List后,最好立刻扔掉可变List的引用,这样可以保证后续操作不会意外改变原始对象,从而造成“不可变”List变化了

Iterator

Iterator是一种抽象的数据访问模型。使用Iterator模式进行迭代的好处有:

  • 对任何集合都采用同一种访问模型;
  • 调用者对集合内部结构一无所知;
  • 集合类返回的Iterator对象知道如何迭代。

Java提供了标准的迭代器模型,即集合类实现java.util.Iterable接口,返回java.util.Iterator实例。

如果我们自己编写了一个集合类,想要使用for each循环,只需满足以下条件:

  • 集合类实现Iterable接口,该接口要求返回一个Iterator对象;
  • 用Iterator对象迭代集合内部数据。
  • Iterator对象有两个方法:boolean hasNext()判断是否有下一个元素,E next()返回下一个元素。因此,使用Iterator遍历List代码如下:

    1. public class MM {
    2. public static void main(String[] args) {
    3. List<String> list = new ArrayList<>();
    4. list.add("apple");
    5. list.add("peer");
    6. list.add("banana");
    7. Iterator<String> it = list.iterator();
    8. while (it.hasNext()){
    9. String s = it.next();
    10. System.out.println(s);
    11. }
    12. System.out.println();
    13. }
    14. }