1、Map常用子类
Collection中的集合称为单列集合 ,元素是孤立存在的,Map中的集合称为双列集合,元素是成对存在的,每个元素由键与值两部分组成,Map集合不能包含重复的键,但值可以重复
1、1HashMap
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。正式因为要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法,其中equals是用来对比,hashcode用来对比后保证不重复。
注:HashMap一般用于自定义类型的存储,需在自定义的普通类中快捷键alt+Insert重写hashCode与equals即可
1、2LinkedHashMap
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,在HashMap的基础上:存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致
2、Map中数据存取常用方法
public V remove(Object obj)//根据键,删除对应的键值对儿。返回被删掉的value值。
public V get(Object obj)//根据键,获取对应的value值。
default V getOrDefault (Object key, V defaultValue)
//返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue。
(暂用于统计某元素的数量)
public Set<K> keySet()//获取所有的键的集合。(值不重复)
public Collection<V> values()//获取所有的值的集合。(值可能重复)
注意事项:
1、使用put方法时,若指定的键(key)在集合中没有,则返回null,并把指定的键值添加到集合中
2、Map集合中值可以为空(null)
3、Map集合中的键,可以存在一个null值,但是只能存在一个键为空的键值对
3、Map的遍历
Collection:迭代器,foreach
Map:集合遍历不能直接用 迭代器和foreach(增强for)
3、1 KaySet方式遍历
步骤:
1:通过map的keySet方法获取所有的键,放到集合中
2:通过遍历键的集合,获取每一个键
3:通过键可以获取对应的值
//1:通过map(集合名)的keySet方法获取所有的键,放到集合中
Set<String> keySet = map.keySet();
//2:通过遍历键的集合,获取每一个键
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
//3:通过键可以获取对应的值
String key = iter.next();
String value = map.get(key);
System.out.println("key = " + key+" :value = "+value);
}
3、2 entrySet方式遍历
Map接口中有一个内置接口叫做Entry,用来将键值对的对应关系封装成了对象,即键值对对象, 这样我们在遍历Map
集合时,就可以从每一个键值对(Entry
)对象中获取对应的键与对应的值
//既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey();//获取Entry对象中的键
public V getValue();//获取Entry对象中的值
//在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet();
//获取到Map集合中所有的键值对对象的集合(Set集合)
步骤:
1、借助Map中的entrySet方法获取键值对对象集合
2、遍历这个键值对对象的集合,获取键值对对象
3、获取键值对对象,通过getKey获取键,通过getValue得到值
//1)借助Map(集合名)中的entrySet方法获取键值对对象集合
Set<Map.Entry<String, String>> entries = map.entrySet();
//2)遍历这个键值对对象的集合,获取键值对对象
for (Map.Entry<String, String> entry : entries) {
//3)获取键值对对象,通过getKey获取键,通过getValue得到值
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " = " + value);
}
4、JDK9对集合添加的优化(of方法)
List、Set、Map 在JDK9后存在一个of的静态方法,其和普通集合的区别是:
对于使用of方法创建的集合:集合不可变,如果改变了数据,会出现运行时报错(UnsupportedOperationException)
Set<String> str=Set.of("a","b","c");
//str.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合
List<String> list = List.of("BBB", "CCC", "DDD");
Map<String, String> map = Map.of("AA1", "AA2", "BB1", "BB2");
System.out.println(str);//[a, b, c]
System.out.println(list);//[BBB, CCC, DDD]
System.out.println(map);//{BB1=BB2, AA1=AA2}