双列集合
一次只能存一对数据,分别为键和值
键不能重复,值可以重复
键和值一一对应,每一个键只能找到自己对应的值
键和值这个整体,我们称之为键值对或者键值对对象,在java中叫做Entry对象
常见api
Map是双列集合的顶层接口
成员方法
V put(K key,V value) 添加元素
在添加数据时,如果键不存在,就将键值对添加到map集合中
如果键存在,那么会将原有的键值对覆盖,并返回被覆盖的值
V remove(Object key) 根据键删除键值对元素
返回被删除的键值对
void clear() 清空
boolean containsKey(Object obj) 判断集合是否包含指定的键
boolean containsValue(Object obj) 判断集合是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 集合长度
Set<T> keySet() 获取map的键集合
Set<Entry<T,T1>> entrySet() 获取map的键值对集合
其中Entry类中有getKey(),getValue方法
创建对象
多态创建 Map<String,String> map=new HashMap<>();
遍历方式:
键找值
Map<String,String>map=new HashMap<>();
Set<String> keys = map.keySet();
for (String key : keys) {
String value = map.get(key);
System.out.println(key+"="+value);
}
键值对
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
Lambda
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println(key+"="+value);
}
});
简化
map.forEach((key,value)-> System.out.println(key+"="+value));
HashMap: 无序,不重复,无索引 map的一个实现类
底层: 哈希表结构:数组+链表
jdk7前: 哈希表
jdk8后: 哈希表+红黑树
创建一个加载因子0.75,长度为16的数组
用put方法添加数据
put方法底层创建一个Entry对象,记录键和值
利用 键 计算哈希值,和值无关
用哈希值计算应该在数组的哪个位置 (数组长-1)&哈希值=位置
如果当前位置为null,就存入
如果不是null,就调用equals方法比较,相同就覆盖原来的元素,
jdk7前: 新元素添加在数组前,老元素挂在新元素下面形成链表
jdk8后: 新元素直接挂在数组后面形成链表,如果链表长度>8且数组长度>=64
那么就会将链表变成红黑树提高性能
LinkedHashMap 有序,不重复,无索引 是HashMap的子类
有序: 存和取得顺序一致
底层: 底层依然是哈希表,只是每一个存入的元素都额外的多了一个双链表机制记录储存顺序
TreeMap 不重复,无索引,可排序
可排序: 对键进行排序
默认按照键的从小到大排序,也可自己规定排序规则
两种排序方式
实现Comparable接口,指定比较规则
创建集合时传递Comparator比较器对象,指定比较规则