前言
在 Java 中, 集合的使用可谓是重中之重
本文将献上一份 全面 & 详细的 Java 集合学习攻略, 希望您们会喜欢.
目录
1. 简介
2. 与数组的区别
Java 集合 与 常用数组的区别如下:
3. 集合类型
Java 集合的类型可分为 Set,List,Map,Queue 4 种
具体介绍如下
下面会更加详细地说明
4. 集合继承关系
Java 集合的根接口 = Collection 接口 + Map 接口
即 Java 的集合类都实现上述 2 个接口
其中:
List,Set,Queue 实现了 Collection 接口. 继承关系如下:
Map 实现了 Map 接口 . 继承关系如下:
下面, 我将主要介绍 Collection 接口 ,Map 接口 & 其具体集合实现类
5. Collection 相关
在本节中, 会先介绍 Collection 接口, 再介绍其具体集合实现类(List,Set,Queue 类)
5.1 Collection 接口
定义
一个接口, 是集合 List,Set,Queue 容器的顶层父接口
包结构
接口中定义的方法
主要用于 添加元素, 删除元素 等等
- Boolean add(Object o); // 向集合中添加一个对象的引用
- Boolean remove(Object o); // 从集合中删除一个对象的引用
- Void clear();// 删除集合中的所有对象, 即不再持有这些对象的引用
- Boolean contains(Object o);// 判断在集合中是否持有特定对象
- Object[] toArray();// 返回 1 个数组, 该数组包含集合中的所有元素
- Iterator iterator(); // 返回 1 个 Iterator 对象: 用于遍历集合中的元素
- Boolean isEmpty();// 判断集合是否为空
- Int size();// 返回集合中元素的数目
- Boolean equals(Object o); // 对象比较
- Int hashCode() ;// 返回 hash 码
与 Collections 的区别
附: Collections 的使用
- // 主要功能有: 搜索元素, 获取最大最小值, 排序集合, 对象线程安全化, 将 1 个 List 所有元素复制到另 1 个 等
- // 1. 获取最大最小值
- static T max(Collection<? extends T> coll, Comparator<? super T> comp);
- static T min(Collection<? extends T> coll, Comparator<? super T> comp);
- // 2. 排序
- static void sort(List<T> list, Comparator<? super T> c);
- // 3. 将线程不安全的 Collection 转为线程安全的 Collection
- static Collection<T> synchronizedCollection(Collection<T> c);
- static List<T> synchronizedList(List<T> list);
- static Map<K,V> synchronizedMap(Map<K,V> m);
- static Set<T> synchronizedSet(Set<T> s);
- // 交换指定位置的两个元素
- static void swap(List<?> list, int i, int j)
- // 主要操作对象 = 集合类 = `Collection` 接口的实现类
- List list = new ArrayList();
- list.add(XXX);
- //...
- list.add(XXX);
- Collectoions.sort(list);
Collections 与 Arrays 的区别
下面, 我将介绍其具体集合实现类: List,Set,Queue
5.2 List 集合
简介
使用方法
- void add(int index, Object element); // 将元素 elment 插入在集合 list 的 index 处
- boolean addAll(Collection<? extends E> c); // 将集合 c 中的所有元素都插入到列表中的指定位置 index 处
- E set(int index, E element); // 将集合中 index 索引处的元素替换成 element
- Object get(int index); // 返回 List 集合 index 索引处的元素
- Int indexOf(Object o) ;// 返回集合中元素 o 的 index 索引
- int lastIndexOf(Object o); // 返回集合中最后一个元素的索引
- List subList(int fromIndex,int toIndex);// 返回集合中从索引 fromIndex 到 toIndex 索引处的元素集合
- Object remove(int index);// 删除集合 index 索引处的元素
- void clear(); // 清空集合
- int size(); // 获得集合长度
- boolean isEmpty(); // 判断集合是否为空
集合实现类
List 的集合实现类主要包括: Vector,ArrayList,LinkedList,Stack. 具体介绍如下
Vector,ArrayList,LinkedList 之间的区别
5.3 Set 集合
简介
使用方法
- boolean add(E e); // 添加元素
- boolean remove(Object o); // 删除元素
- boolean addAll(Collection<? extends E> c); // 插入集合 c 中的所有元素到集合中
- boolean removeAll(Collection<?> c); // 移除原集合中的集合 c 中的元素
- boolean contains(Object o); // 判断是否包含该元素
- boolean containsAll(Collection<?> c); // 判断是否包含该集合中的元素
- Object[] toArray(); // 返回 1 个数组, 该数组包含集合中的所有元素
- void clear(); // 清空集合
- int size(); // 获得集合长度
- boolean isEmpty(); // 判断集合是否为空
集合实现类
Set 的集合实现类主要包括: TreeSet,HashSet(LinkedHashSet),EnumSet. 具体介绍如下
5.4 Queue 集合
简介
使用方法
- // 插入新元素到队列: 插入成功则返回 true; 若队列已满, 抛出 IllegalStateException 异常
- boolean add(E e);
- // 插入新元素到队列, 若插入成功则返回 true ; 若队列已满, 返回 false, 但不抛出异常
- boolean offer(E e);
- E remove(); // 返回第 1 个元素 & 从队列中删除; 若队列为空, 抛出异常
- E poll(); // 返回第 1 个元素 & 从队列中删除 ; 若队列为空, 返回 null, 但不抛出异常
- E element(); // 返回的第 1 个元素 & 不从队列中删除; 若队列为空, 则抛异常
- E peek(); // 返回第 1 元素 & 不从队列中删除; 若队列为空, 则返回 null
- // 时间复杂度分析
- // 1. 插入方法: offer(),poll(),remove() ,add ()= O(log(n))
- // 2. 删除方法: remove() , contains() = O(n)
- // 3. 检索方法: peek(),element() ,size() = O(1)
- // 使用建议
- // 1. 遍历时, 若使用但不需删除元素, 使用 element(),peek()(时间效率高)
- // 2. 使用 offer()加入元素, poll()取出元素
- // a. 避免使用 Collection 的 add() ,remove()
- // b. 原因 = 通过返回值可判断成功与否, 但 add(),remove()在失败时会抛出异常
集合实现类
Queue 的集合实现类主要包括: PriorityQueue,Dueue(ArrayDeque,LinkedList),PriorityQueue(ArrayBlockingQueue,
LinkedBlockingQueue
). 具体介绍如下
至此, 关于 Collection 接口, 其具体集合实现类 (List,Set,Queue 类) 讲解完毕. 总结如下
6. Map 相关
在本节中, 会先介绍 Map 接口, 再介绍其具体集合实现类中最常见的 HashMap,LinkedHashMap,TreeMap
6.1 Map 接口
简介
注: Map 接口 与 Collection 接口无关
包结构
- // 为了更好理解各类的关系, 下面附上: 各类的定义图
- // HashMap
- public class HashMap<K,V>
- extends AbstractMap<K,V>
- implements Map<K,V>, Cloneable, Serializable{}
- // LinkedHashMap
- public class LinkedHashMap<K,V>
- extends HashMap<K,V>
- implements Map<K,V>{}
- // TreeMap
- public class TreeMap<K,V>
- extends AbstractMap<K,V>
- implements NavigableMap<K,V>, Cloneable, java.io.Serializable{}
- // Hashtable
- public class Hashtable<K,V>
- extends Dictionary<K,V>
- implements Map<K,V>, Cloneable, java.io.Serializable {}
- // ConcurrentHashMap
- public class ConcurrentHashMap<K, V> extends AbstractMap<K, V>
- implements ConcurrentMap<K, V>, Serializable {}
接口中定义的方法
- Set<K> keySet(); // 单独抽取 key 序列, 将所有 key 生成一个 Set
- Collection<V> values(); // 单独 value 序列, 将所有 value 生成一个 Collection
- V remove(Object key); // 删除该映射关系
- V get(Object key); // 获得指定键的值
- V put(K key, V value); // 添加键值关系
- void putAll(Map<? extends K, ? extends V> m); // 将指定 Map 中的映射关系 复制到 此 Map 中
- boolean containsKey(Object key); // 若存在该键的映射关系, 则返回 true
- boolean containsValue(Object value); // 若存在该值的映射关系, 则返回 true
- void clear(); // 清除所有映射关系
- int size(); // 返回键值关系的数量
- boolean isEmpty(); // 若未包含键值关系, 则返回 true
- // Map 中还包括 1 个内部类: Entry
- // 该类封装了一个 key-value 对
- // Entry 类包含如下方法:
- boolean equals(Object o );// 比较指定对象 与 此项 的相等性
- K getKey();// 返回 与 此项 对应的键
- V getValue();// 返回 与 此项 对应的值
- int hashCode();// 返回此映射项的哈希值
- V setValue(V value) ;// 使用指定值替换 与 此项对应的值
与 Set 集合, List 集合的关系
下面, 我将介绍其具体集合实现类中最常见的 HashMap,LinkedHashMap,TreeMap
6.2 HashMap
类定义
- public class HashMap<K,V>
- extends AbstractMap<K,V>
- implements Map<K,V>, Cloneable, Serializable
主要介绍
关于其更加具体介绍 & 源码分析, 请看文章:
Java: 手把手带你源码分析 HashMap 1.7
Java 源码分析: 关于 HashMap 1.8 的重大更新
注: HashMap 的实现在 JDK 1.7 和 JDK 1.8 差别较大, 建议一同查看
6.3 LinkedHashMap
类定义
- public class LinkedHashMap<K,V>
- extends HashMap<K,V>
- implements Map<K,V>{}
简介
具体介绍
关于更多 LinkedHashMap 的具体介绍 & 源码分析, 请看文章:
Java: 手把手带你源码分析 HashMap 1.7
Java 源码分析: 关于 HashMap 1.8 的重大更新
6.4 TreeMap
类定义
- public class TreeMap<K,V>
- extends AbstractMap<K,V>
- implements NavigableMap<K,V>, Cloneable, java.io.Serializable{}
简介
关于排序方式 & 判断相等的标准
6.5 相关子类比较
HashMap ,LinkedHashMap,TreeMap 的区别
HashMap , Hashtable 的区别
HashMap , ConcurrentHashMap 的区别
至此, 关于 Java 集合的相关内容 (Colletcion ,Map 接口 & 其相关实现子类) 讲解完毕.
7. 总结
本文主要讲解了 Java 集合的相关内容, 包括 Colletcion 接口, Map 接口 & 其相关实现子类), 具体总结如下:
下面我将继续对 Android & Java 中的知识进行深入讲解 , 有兴趣可以继续关注 Carson_Ho 的安卓开发笔记 https://blog.csdn.net/carson_ho
请帮顶 / 点赞! 因为你的鼓励是我写作的最大动力!
来源: https://juejin.im/entry/5c16f66ae51d45607a5bfdaa