一、Collection集合体系
1.Collection父接口
特点:存储任意Object对象
常用方法
| 方法 | 作用 |
|---|---|
boolean add(Object o) | 添加元素 |
boolean contains(Object o) | 判断是否包含该元素 |
boolean remove(Object o) | 删除指定元素 |
int size() | 获取集合有效元素个数 |
Collection没有直接实现类,功能由子接口List、Set实现
2.List子接口
有序、有下标、允许元素重复;下标范围:0~size()-1
List特有方法(继承Collection之外)
| 方法 | 说明 |
|---|---|
add(int index,Object o) | 在指定下标插入元素 |
Object get(int index) | 按下标获取元素 |
Object remove(int index) | 按下标删除,返回被删对象 |
Object set(int index,Object o) | 修改下标位置元素,返回旧值 |
List实现类对比
| 实现类 | 底层 | 查询 | 增删 | 线程安全 | 备注 |
|---|---|---|---|---|---|
| ArrayList | 数组 | 快 | 慢 | 不安全 | JDK2,初始容量 10,扩容 1.5 倍,开发最常用 |
| Vector | 数组 | 快 | 慢 | 安全 | JDK1,效率低,基本淘汰 |
| LinkedList | 双向链表 | 慢 | 快 | 不安全 | 适合频繁增删场景 |
面试:ArrayList与LinkedList区别
(1)ArrayList底层数组,查询快,中间增删慢;线程不安全
(2)LinkedList底层链表,查询慢,中间增删快;线程不安全
List三种遍历
(1)普通for下标遍历
for(int i = 0; i < list.size(); i++){ Object ele = list.get(i); }(2)增强for循环(forEach,开发常用)
底层本质是迭代器
for(类型 变量 : list){ //直接使用变量 }(3)迭代器Iterator遍历
Iterator it = list.iterator(); while(it.hasNext()){ //判断是否还有元素 System.out.println(it.next()); //取出下一个 }3.泛型
作用:约束集合内元素统一类型
List<String> list = new ArrayList<String>();泛型标识:K、V、E、T
注意:
(1)不能写基本类型,要用包装类
(2)不指定泛型默认就是Object
(3)定义多个泛型,要么全部指定,要么全部不指定
4.Collection集合工具类
面试区分:Collection是接口;Collections是工具类,全部静态方法
常用静态方法:
(1)reverse(List list):集合反转
(2)shuffle(List list):随机打乱顺序
(3)sort(List list):集合排序
两种比较器
(1)Comparable内置比较器(写在实体类内部)
实体类实现Comparable<T>接口,重写compareTo(T o),this和传入对象比较。返回正数、负数、0。返回0代表对象相等
(2)Comparator外置比较器(写在集合排序处,匿名内部类/lambda)
重写compare(o1,o2),对比两个传入对象,不用修改实体类
5.Set子接口
无序、无下标、元素不允许重复,全部继承Collection的方法
实现类
(1)HashSet
底层哈希表;去重原理:
a.调用对象hashCode()得到哈希码,算出存储位置
b.该位置无元素,直接存入
c.该位置已有元素,调用equals()比较内容
equals返回true:判定重复,拒绝存入
equals返回false:允许存入
自定义对象存入HashSet:必须重写,hashCode()+equals()
(2)LinkedHashSet
HashSet子类;元素不重复,保存添加顺序;自定义对象同样要重写hashCode、equals
(3)TreeSet(SortedSet实现类)
自动排序;自定义对象存入,实体类要实现Comparable接口重写compareTo;compareTo返回0代表对象重复,会被去重
二、Map集合体系
Map存储key-value键值对
key:无序、无下标、不可重复
value:无序、无下标、允许重复
Map常用方法
| 方法 | 功能 |
|---|---|
V put(K key,V value) | 添加键值对;key 已存在则覆盖旧 value,返回被覆盖的值 |
V remove(K key) | 根据 key 删除,返回被删除的 value |
V get(K key) | 根据 key 获取 value |
boolean containsKey(K key) | 判断是否包含指定 key |
boolean containsValue(V value) | 判断是否包含指定 value |
int size() | 获取键值对总数量 |
Map实现类
| 实现类 | 版本 | 线程安全 | null 键值 | 特点 |
|---|---|---|---|---|
| HashMap | JDK1.2 | 不安全 | 允许 key、value 为 null | 开发最常用;自定义对象做 key,必须重写 hashCode+equals |
| Hashtable | JDK1.0 | 安全 | 不允许 null | 老旧,效率低 |
| Properties | 继承 Hashtable | 安全 | key、value 只能 String | 读取配置文件 |
| TreeMap | SortedMap 实现 | 不安全 | key 不能 null | key 自动排序;key 自定义类需要 Comparable |
| LinkedHashMap | HashMap 子类 | 不安全 | 允许 null | 保存键值对添加顺序 |
面试:HashMapJDK1.2;Hashtable区别
(1)版本:HashMapJDK1.2;HashtableJDK1.0
(2)线程安全:HashMap 不安全;Hashtable 安全
(3)null:HashMap 允许 null 键 null 值;Hashtable 不允许
(4)效率:HashMap 高;Hashtable 低
Map三种遍历
(1)keySet()键遍历(常用)
Set<K> keys = map.keySet(); for(K key : keys){ V value = map.get(key); }(2)values()只遍历值
Collection<V> values = map.values(); for(V v : values){ }(3)entrySet()键值对遍历(效率最高)
Set<Map.Entry<K,V>> entries = map.entrySet(); for(Map.Entry<K,V> entry : entries){ K key = entry.getKey(); V value = entry.getValue(); }