jdk8集合框架图
1,集合类分为List列表,Set集合,Map映射,工具类
2,特征
- List:有序队列,每个元素都有它的索引
- Set:不允许重复值的集合,实现方法有HashSet和TreeSet
HashSet:依赖于HashMap,实际上通过HashMap实现
TreeSet:依赖于TreeMap,实际上是通过TreeMap实现 - Map:是一个映射接口,级key-value键值对
AbstractMap是一个抽象类,实现了Map接口中的大部分API,而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。 - Hashtable:虽然继承于Dictionary,但是实现了Map接口
附带两张ide生成的类图
注意:
由于Collection接口继承了Iterable接口,所以Collection接口可以直接使用Iterator迭代器。即List和Set可以直接调用iterator()方法,返回迭代器。
然而Map接口是没有继承iterable接口的,所以map是不能直接使用iterator迭代器。但是map接口依赖了Collection接口,换句话说,map内的方法返回结果继承了Collection接口。例如values,keySet,entrySet方法返回Collection接口的数据结构,所以,可以通过这些方法将数据读出来,然后使用迭代器。代码如下:
public class MyLocalTest {
public static void main(String[] args) throws Exception{
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
Map<String,Integer> intMap = new HashMap<>();
intMap.put("one",1);
intMap.put("two",2);
intMap.put("three",3);
intMap.put("four",4);
// list
// 常见写法
// Iterator<Integer> listIterator = intList.iterator();
// while (listIterator.hasNext()){
// int item = listIterator.next();
// if(item == 2) listIterator.remove();
// }
// 1.8后提供了封装的方法removeIf,传入一个方法,可以更简洁
intList.removeIf(item->item==2);
// map
// 常规写法
// Iterator<Map.Entry<String,Integer>> mapIterator = intMap.entrySet().iterator();
// while (mapIterator.hasNext()){
// Map.Entry<String,Integer> itemMap = mapIterator.next();
// if("two".equals(itemMap.getKey())){
// mapIterator.remove();
// }
// }
// 使用removeIf的写法
intMap.entrySet().removeIf(item->"two".equals(item.getKey()));
// 打印结果
System.out.println("list result:");
intList.forEach(System.out::println);
System.out.println("map result:");
intMap.forEach((k,v)->System.out.println("key:"+k+",value:"+v));
}
}
输出结果:
另外,removeIf方法,其实就是使用了iterator迭代器。源码如下:
这个方法位于Collection接口当中。接口中可以写入默认方法(default),也是1.8新增的特性之一。