双列集合
双列集合的特点:
- 双列集合一次需要存一对数据,分别为键和值
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- 键 + 值这个整体 我们称之为 ”键值对“ 或者 ”键值对对象“ ,在Java中叫做 ”Entry对象“
Map中常见的API
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
方法名称 | 说明 |
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
- 添加元素(put方法的细节:添加/覆盖)
- 在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合中,方法返回null
- 在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回
Map的遍历方式
- 通过键找值
- 获取所有的键,把这些键放到一个单列集合当中(Map集合对象.keySet()获取键的单列集合)
-
// 创建Map集合的对象 Map<String,String> m = new HashMap<>(); // 获取Map集合的键集合 Set<String> s = m.keySet();
- 遍历单列集合,得到每一个键
- 利用map集合中的键获取相对应的值 get
- 通过键值对
- 通过一个方法获取所有的键值对对象
// 创建Map集合的对象 Map<String,String> m = new HashMap<>(); // 获取Map集合的键值对集合 Set<Map.Entry<String,String>> entries = m.entrySet();
- 遍历entries这个集合对象,去得到里面的每一个键值对对象
- 利用entry调用get方法获取键和值
- 通过一个方法获取所有的键值对对象
- Lambda表达式
-
方法名称 说明 default void forEach(BiConsumer<? super K,? super V> action 结合lambda遍历Map集合 -
底层:forEach其实就是利用第二种方式进行遍历,依次得到每一个键和值,再调用accept方法
-
HashMap
HashMap的特点:
- HashMap是Map里面的一个实现类
- 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
- 特点都是由键决定的:无序、不重复、无索引
- HashMap跟HashSet底层原理是一模一样的,都是哈希表结构
总结:
- HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 如果键存储的是自定义对象,需要重写hashCode和equals方法。 如果值存储自定义对象,不需要重写hashCode和equals方法
LinkedHashMap
-
由键决定:有序、不重复、无索引。
-
这里的有序指的是保证存储和取出的元素顺序一致
-
原理:底层数据结构依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。
TreeMap
- TreeMap跟TreeSet底层原理一样,都是红黑树结构的
- 由键决定特性:不重复、无索引、可排序
- 可排序:对键进行排序。
- 注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则
- 代码书写两种排序规则
- 实现Comparable接口,指定比较规则。
- 创建集合时传递Comparator比较器对象,指定比较规则。
- 代码书写两种排序规则
可变参数
格式:属性类型...名字(int...args)
底层:可变参数底层就是一个数组,只不过不需要我们自己创建了,Java会帮我们创建好
- 细节:
- 在方法的形参中最多只能写一个可变参数(可理解为一个大胖子,有多少吃多少)
- 在方法中,如果除了可变参数以外,还有其他的形参,那么可变参数要写在最后
Collections
作用;Collections不是集合,而是集合的工具类。
方法名称 | 说明 |
public static <T> boolean addAll(Collection<T> c,T...elements) | 批量添加元素 |
public static void shuffle(List<?> list) | 打乱List集合元素的顺序 |
public static <T> void sort(List<T> list) | 排序 |
public static <T> void sort(List<T> list,Comparator<T> c) | 根据指定的规则进行排序 |
public static <T> int binarySearch (List<T> list,T key) | 以二分查找法查找元素 |
public static <T> void copy(List<T> dest,List<T> src) | 拷贝集合中的元素 |
public static <T> int fill(List<T> list,T obj) | 使用指定的元素填充集合 |
public static <T> void max/min(Collection<T> coll) | 根据默认的自然排序获取最大/小值 |
public static <T> void swap(List<?> list,int i,int j) | 交换集合中指定位置的元素 |