一、Map实现类
Map<HashMap>(底层+数组链表+红黑树)
线程不安全,效率高,存储null的key和value
LinkedHashMap:保证在遍历map的元素时,可以按照添加的顺序实现遍历。
原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于平凡的遍历操作,此类执行效率高于HashMap
TreeMap
保证按照添加的key-value进行排序,实现遍历,此时考虑key的自然排序和定制排序(TreeMap使用有限)底层使用红黑树
HashTable
线程安全,效率低,不能存储null的key和value
Properties:常用来处理配置文件,key和value都是String类型
//一般用到最多的时HashMap
public class ClassMap {
public static void main(String[] args) {
HashMap<String,String> hashMap = new HashMap();
hashMap.put("一","周一"); //put:像map里面添加数据
hashMap.put("二","周二");
System.out.println(hashMap.get("二")); //get:根据key检索value
hashMap.replace("一","周三"); //replace:根据key来更换value
System.out.println(hashMap);
}
}
二、Map结构的理解
Map种的Key时无序的,不可重复的,使用Set存储所有的Key
---->key所在的类要重写equals()和hashCode()《以HashMap为例》
Map种的Value时无序的,不可重复的,使用Collectiom存储所有的value
---->valuey所在的类要重写equals()
一个键值对:key-value构成了一个Entry对象
Map种的Entry时无序的,不可重复的,使用Set存储所有的entry
//这段的演示代码我不知道咋写,我也只是理解了这段话的意思,平时能使用
三、HashMap的底层实现原理
(jdk7为例说明)
HashMap<Object, Object> h1 = new HashMap<>();
在实例化之前,底层创建了长度为16的一维数组Entry[] Table。
、、、可能经过多次Put、、、
map.put(key1,value1);
调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算后,得到Entry[]的存放位置。
如果此位置的哈希值为空,此时的(key1,value1)添加成功----->情况1
如果此位置的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个数据的哈希值
如果key1的哈希值与已经存在的数据的哈希值都不同,此时(key1,value1)成功添加---->情况2
如果key1和已经存在的某一个数据(key2,value2)的哈希值相同,继续比较:调用key1所在类的equale(key2),
如果equals()返回false;此时(key1,value1)添加成功---->情况3
如果返回true;使用value1替换value2。
补充:情况2和情况3,此时的(key1,value1)和原来的数据以链表的方式存储。
在添加的过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来的两倍,并将原有的数据复制过来。
public class ClassMap {
public static void main(String[] args) {
HashMap<String,String> hashMap = new HashMap();
hashMap.put("一","周一");
hashMap.put("二","周二");
hashMap.put("三","周三");
System.out.println(hashMap.get("二"));
hashMap.replace("一","周三");
hashMap.put("二","周四"); //Key1(equals(key2))替换value
System.out.println(hashMap);
}
}
jdk8相较于jdk7在底层实现方面的不同:
1、 new HashMap(),底层没有一个长度为16的数组
2、jdk8底层数组是Node[],而非Eetry[]。
3、首次调用put()方法时,底层创建长度为16的数组。
4、jdk7底层结构:数组+链表;jdk8:数组+链表+红黑树
当数组的某一个索引位置上的元素以链表的形式存在的数据个数 > 8且当前数组长度 > 64时,此时索引位置上的所有数据改为使用红黑树存储。
//对于Map来说,我现在的理解还很片面,在日后的使用中会慢慢熟悉
//多练,多看,理解了,代码能力就会慢慢的提高