一、集合是什么为什么要用集合1.1 什么是集合Java 集合是存放对象的容器用于存储、获取、操作一组对象数据。1.2 数组 vs 集合数组长度固定、类型单一、功能简单集合长度可变、类型灵活、功能强大增删改查、排序、筛选、遍历简单说数组是静态的集合是动态的。1.3 集合体系总览最重要的一张图Java 集合分为两大类Collection 接口单个元素存储List有序、可重复Set无序、不可重复Queue队列FIFOMap 接口键值对存储HashMapConcurrentHashMapTreeMapHashtable整体结构Collection ├─ List 有序可重复 │ ├─ ArrayList │ ├─ LinkedList │ └─ Vector ├─ Set 无序不可重复 │ ├─ HashSet │ ├─ LinkedHashSet │ └─ TreeSet └─ Queue 队列 Map 键值对 ├─ HashMap ├─ LinkedHashMap ├─ TreeMap ├─ Hashtable └─ ConcurrentHashMap二、Collection 接口通用方法所有 List / Set / Queue 都能用// 添加 add(E e) addAll(Collection? extends E c) // 删除 remove(Object o) clear() // 判断 contains(Object o) isEmpty() // 获取 size() iterator() // 迭代器遍历三、List 家族有序、可重复3.1 ArrayList最常用底层动态数组特点查询快、增删慢、线程不安全创建ListString list new ArrayList();常用 APIlist.add(A); list.add(1, B); // 指定位置插入 list.get(0); // 获取 list.set(0, C); // 修改 list.remove(0); // 删除 list.size(); list.isEmpty(); list.contains(A);三种遍历方式// 1. 普通 for for (int i 0; i list.size(); i) { System.out.println(list.get(i)); } // 2. 增强 for for (String s : list) { System.out.println(s); } // 3. 迭代器 IteratorString it list.iterator(); while (it.hasNext()) { System.out.println(it.next()); }使用场景大量查询、少量增删单线程环境。3.2 LinkedList底层双向链表特点增删快、查询慢、线程不安全API 与 ArrayList 几乎一致。特有方法addFirst() addLast() getFirst() getLast() removeFirst() removeLast()使用场景频繁头尾增删如队列、栈。3.3 Vector底层数组线程安全方法加 synchronized效率低基本不用。四、Set 家族无序、不可重复4.1 HashSet底层HashMap特点无序、不可重复、线程不安全创建SetString set new HashSet();APIset.add(A); set.remove(A); set.contains(A); set.size();去重原理先算 hashCode ()再用 equals () 比较所以自定义对象必须重写 hashCode 和 equals。4.2 LinkedHashSet继承 HashSet底层链表 哈希表有序插入顺序、不可重复4.3 TreeSet底层 TreeMap可排序自然排序 / 比较器排序TreeSetInteger set new TreeSet();五、Queue 队列FIFO 先进先出QueueString q new LinkedList(); q.offer(A); // 添加 q.poll(); // 取并删队头 q.peek(); // 查看队头六、Map 家族键值对 key-valuekey 不可重复value 可重复6.1 HashMap最常用底层数组 链表 红黑树JDK 1.8线程不安全创建MapString, Integer map new HashMap();常用 APImap.put(A, 1); map.get(A); map.remove(A); map.containsKey(A); map.containsValue(1); map.size(); map.isEmpty();三种遍历// 1. keySet for (String key : map.keySet()) { System.out.println(key - map.get(key)); } // 2. entrySet推荐 for (Map.EntryString, Integer entry : map.entrySet()) { System.out.println(entry.getKey() : entry.getValue()); } // 3. forEachJDK 8 map.forEach((k,v)- System.out.println(k:v));6.2 LinkedHashMap保留插入顺序6.3 TreeMap自动排序 key6.4 Hashtable线程安全效率低不推荐使用6.5 ConcurrentHashMap线程安全高并发分段锁 / CASJDK 1.8多线程首选 Map七、JDK 8 集合新特性Lambda 流式编程list.forEach(System.out::println); list.stream() .filter(s - s.contains(A)) .sorted() .forEach(System.out::println); map.forEach((k,v)- {});八、集合线程安全问题总结不安全ArrayListLinkedListHashSetHashMap安全VectorHashtableConcurrentHashMapCollections.synchronizedList()CopyOnWriteArrayList