集合框架简要概括:
注:图片出自《Core Java SE 9 for the Impatient》
所有的集合接口都是泛型类型的,鼓励在代码中尽可能地使用接口,通常Collection、List、Map就足够了。
例如:在构造一个ArrayList后,将引用储存在一个List类型的变量中:
List<String> words = new ArrayList<>();
接口简单概括
List
List是一个有序的集合。ArrayList类和LinkedList类实现了List接口。LinkedList插入操作很快————你只需要"拼接"节点即可。但是要达到链表中间会很缓慢,因为你需要从头节点开始遍历所有节点。ArrayList实现了RandomAccess接口,用来表明其支持快速(通常是固定时间)随机访问,并且ArrayList用for或者foreach访问更快。
Set
在Set中,元素不会被插入特定的位置,并且不允许重复元素,可以高效地检测一个值是不是它的元素,当顺序无关紧要时,Set很有用。
HashSet和TreeSet类都是实现了Set接口,如果想按顺序遍历集合,则可以使用TreeSet。
Map
Map储存键值对,HashMap和TreeMap都实现了Map接口,HashMap类不保证映射的顺序,特别是它不保证该顺序恒久不变,如果需要按顺序访问键的话,则使用TreeMap。
使用getOrDefault()获取键值更好
例子:获取一个键对应的值
Map<String, Integer> counts = new HashMap<>();
counts.put("Alice", 1);
//如果键不存在的话,则get方法将会返回null,int不能为null,当get的返回值进行拆箱操作时,会导致NullPointerException。
int count = counts.get("Alice");
改进版:
//这样,如果键不存在,也会返回0。
int count = counts.getOrDefault("Alice", 0);
迭代器
Collection的父接口Iterable<T>定义了一个方法:Iterator<T> iterator()
可以用它来访问所有元素:
Collection<String> coll =...;
Iterator<String> iter = coll.iterator();
while (iter.hasNext()){
String element = iter.next();
//处理element
}
这个例子中,可以直接使用foreach:
for(String element : coll){
//处理element
}
Iterator接口也提供了一个remove方法,可以移除之前访问的元素。
while (iter.hasNext()){
String element = iter.next();
if(element fulfills the condition)
iter.remove();
}
然而,使用removeIf方法更容易:
coll.removeIf(e -> e fulfills the condition)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。