Collections
Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合。
public class Demo {public static void main(String[] args) {List<String> list =new ArrayList<>();list.add("apple");list.add("peel");list.add("banana");System.out.println("排序前"+list); //排序前[apple, peel, banana]Collections.sort(list);System.out.println("排序后"+list); //排序后[apple, banana, peel]Collections.shuffle(list);System.out.println("洗牌后"+list); //洗牌后[peel, apple, banana]ArrayList<Integer> list1 = new ArrayList<>();for (int i = 0; i<5; i++){list1.add(i);}System.out.println("洗牌前"+list1); //洗牌前[0, 1, 2, 3, 4]Collections.shuffle(list1);System.out.println("洗牌后"+list1); //洗牌后[4, 3, 2, 1, 0]List<Integer> list2 = Collections.unmodifiableList(list1); //不可变操作!// 立刻扔掉mutable的引用://list1 = null;list1.add(7);System.out.println(list1); //[4, 2, 3, 0, 1, 7]System.out.println(list2); //[4, 2, 3, 0, 1, 7] list1增删会影响list2,但list2不可以增删操作!}}
因此,如果我们希望把一个可变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代码如下:
public class MM {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("apple");list.add("peer");list.add("banana");Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();System.out.println(s);}System.out.println();}}
