Java中的map是一个很重要的集合,他是一个接口,下面继承它实现了多个实现类,这些类各有千秋,各自有个各自的优点和缺点
Map
map的主要特点是键值对的形式,一一对应,且一个key只对应1个value。其常用的map实现类主要有HashMap、HashTable、TreeMap、ConcurrentHashMap、LinkedHashMap、weakHashMap等等,在java中map是一个接口,是和collection接口同一等级的集合根接口
键值对
- 键:就是你存的值的编号
- 值:就是你要存放的数据
特点
- 没有重复的 key(一方面,key用set保存,所以key必须是唯一,无序的;另一方面,map的取值基本上是通过key来获取value,如果有两个相同的key,计算机将不知道到底获取哪个对应值;这时候有可能会问,那为什么我编程时候可以用put()方法传入两个key值相同的键值对?那是因为源码中,传入key值相同的键值对,将作为覆盖处理)
- 每个 key 只能对应一个 value, 多个 key 可以对应一个 value(这就是映射的概念,最经典的例子就是射箭,一排射手,一排箭靶,一个射手只能射中一个箭靶,而每个箭靶可能被不同射手射中。这里每个射手只有一根箭,不存在三箭齐发还都中靶这种骚操作。将射手和射中的靶子连线,这根线加射手加靶子就是一个映射)
- key,value 都可以是任何引用类型(包括 null)的数据(只能是引用类型)
HashMap
HashMap是用哈希表(直接一点可以说数组加单链表)+红黑树实现的map类
上图便是HashMap的存储结构,HashMap的这种特殊存储结构在获取指定元素前需要把key经过哈希运算,得到目标元素在哈希表中的位置,然后再进行少量比较即可得到元素,这使得 HashMap 的查找效率极高。(说白了HashMap就是用了拉链法的哈希表,也有叫桶数组的)
特点
- 底层实现是 链表数组,JDK 8 后又加了 红黑树
- 实现了 Map 全部的方法
- key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类(一般是String)需要重写 hashCode 和 equals 方法
- 允许空键和空值(但空键只有一个,且放在第一位)
- 元素是无序的,而且顺序会不定时改变
- 插入、获取的时间复杂度基本是 O(1)(前提是有适当的哈希函数,让元素分布在均匀的位置)
- 遍历整个 Map 需要的时间与数组的长度成正比(因此初始化时 HashMap 的容量不宜太大)
- 两个关键因子:初始容量、加载因子
//HashMap 集合 存储数据的特点:键key - 值value
//key不能重复 可以是任意的对象类型 通常使用字符串String
HashMap<String,Integer> score = new HashMap<>();
//添加对象
score.put("Chinese",89);
score.put("Math",94);
score.put("English",92);
//更改某个键对应的值
score.put("English",91);
//获取键值对的个数
score.size();
//获取所有的key
System.out.println(score.keySet());
//获取所有的value
System.out.println(score.values());
//获取Entry:key-value
System.out.println(score.entrySet());
//获取一个键key对应的值
System.out.println(score.get("English"));
遍历
- 通过遍历key来得到每一个key对应的值
for (String key:score.keySet()){
//通过key得到值
int s = score.get(key);
System.out.println("key:"+key+" value:"+s);
}
- 通过EntrySet 得到Entry对象的集合
// 一个Entry管理一个键值对 getkey getvalue
Set <Map.Entry<String,Integer>> entrys = score.entrySet();
for (Map.Entry<String,Integer> entry:entrys){
//得到Entry对应的Key
String key = (String)entry.getKey();
//获取Entry对应的值
Integer value = (Integer)entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
网友评论