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();
}
}