Map集合
Map集合:就是用来存储 这种 键值映射关系的数据 。
**Map集合做大的特点:**可以储存键值对应的元素。
将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值。
Map集合与Collection 集合的区别:
-
Map集合储存元素是成对出现的,Map集合的键是唯一的,值是可以重复的。
-
Collection 集合储存元素是单独出现的,其中Set是唯一的,List是可重复的。
-
Map 是双列集合,Collection 集合是单列集合。
-
多次存储相同的键,就会发生键相同值覆盖。
-
Map集合的数据结构只跟键有关,跟值没关系,而Collection 集合的数据结构是针对元素有效的。
注意:
Collection 单列集合
存储键是String类型 值是Student类型
HashMap 键的数据结构是哈希表,
键的唯一性,要靠键重写hashCode( )和equals( )方法才能保证,如果不重写,则无法保证键的唯一性。
String 类重写hashCode( )和equals( )方法
主要方法:
Map集合的key和value都可以是任何引用类型的数据。Map集合的key不允许重复,value允许重复。key和value之间存在单向一对一关系,即通过指定的键可以找到唯一,确定的value。Map集合中获取数据时,只要给出指定的key,就可以取出对应的value。
(1)void clear():删除该Map对象中所有的键值对。
(2)boolean containsKey(Object key):查询Map中是否包含指定key。
(3)boolean containsValue(Object value):查询Map中是否包含一个或多个value。
(4)Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象。
(5)Object get(Object obj):返回指定key所对应的value。如果没有,这返回null。
(6)boolean isEmpty():查询该Map是否为空,如果为空则返回true。
(7)Set keySet():返回该Map中所有key组成的Set集合。
(8)Object put(Object key, Object value):添加一个键值对,如果当前Map中已经有一个与该key相等的键值对,则新的键值对将覆盖原来的键值对。
(9)void putAll(Map m):将指定Map中的键值对复制到m中。
(10)Object remove(Object key):删除指定key所对应的键值对,如果不存在,则返回null。
(11)int size():返回Map里的键值对个数。
(12)Collection values():返回该Map里所有的vlaue组成的Collection。
LinkedHashMap类:
LinkedHashMap和LinkedHashSet一样,也是使用双向链表来维持键值对的顺序,该链表定义了迭代顺序,该迭代顺序与键值对的插入顺序保持一致。
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代方法Map集合的全部元素时将有很好的性能,因为它以链表来维护内部顺序。
遍历方式一:
通过键找值:
获取所有键的集合,然后遍历键的集合,获取到每一个键,接着根据键找值
Map<String, String> map=new HashMap<>();
map.put("bb", "13");
map.put("aa", "12");
map.put("cc", "14");
map.put("dd", "15");
Set<String> st = map.keySet();
for (String set : st) {
System.out.println("键"+set+" 值"+map.get(set));
}
遍历方式二:
直接获取键值对对象:
获取所有的键值对对象的集合,遍历键值对对象的集合,获取到值。
Map<String, String> map=new HashMap<>();
map.put("bb", "13");
map.put("aa", "12");
map.put("cc", "14");
map.put("dd", "15");
Set<Entry<String, String>> set2 = map.entrySet();
for (Entry<String, String> entry : set2) {
System.out.println("键"+entry.getKey()+" 值"+entry.getValue());
}
删除功能
remove(Object key):根据键删除键值对元素
Map<String, String> map=new HashMap<>();
map.put("bb", "13");
map.put("aa", "12");
map.put("cc", "14");
map.put("dd", "15");
System.out.println(map.toString());
String st=map.remove("bb");
System.out.println(st);
System.out.println(map.toString());
HashMap 键的数据结构是哈希表 保证键唯一,键无序
LinkedHashMap 键的数据结构链表和哈希表。链表保证了键有序,哈希表保证了键唯一
示例一:
import java.util.LinkedHashMap;
public class lizi1 {
public static void main(String[] args) {
LinkedHashMap<Integer, String> hm = new LinkedHashMap<>();
hm.put(100, "aaa");//重复
hm.put(100, "aaa2222");//键值重复
hm.put(200, "bbb");
hm.put(300, "ccc");
hm.put(400, "ddd");
System.out.println(hm);
}
}
运行结果:
{100=aaa2222, 200=bbb, 300=ccc, 400=ddd}
Process finished with exit code 0
TreeMap:
键的数据结构是红黑树, 可保证键的排序和唯一性,排序分为自然排序和比较器排序,线程是不安全但是效率比较高。
-
空参构造:就使用的自然排序。
-
自然排序:他对键的要求是,要求键实现Comparable接口,重写 compareTo方法,根据此方法的返回值的正负0 来决定键的排列顺序
-
Integer 默认实现了Comparable接口
示例:
import java.util.LinkedHashMap;
import java.util.TreeMap;
public class lizi1 {
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(10,"aaa");
treeMap.put(5, "aaa");
treeMap.put(1, "aaa");
treeMap.put(63, "aaa");
treeMap.put(10, "aaa");
treeMap.put(19, "aaa");
System.out.println(treeMap);
}
}
运行结果:
自动去重并且从大到小排好序了
{1=aaa, 5=aaa, 10=aaa, 19=aaa, 63=aaa}
Process finished with exit code 0
-
HashMap 并允许 null值和 null关键。线程不安全效率高
-
Hashtable 不允许存储null值和null键 线程安全效率低