1 package test;
2
3 import java.util.HashMap;
4 import java.util.Hashtable;
5
6 public class MapDemo {
7 public static void main(String[] args) {
8 /*Map - 映射
9 * 1.是java中映射的顶级接口
10 * 2.Map是一个容器,这个容器存储的是键值对
11 * 3.一个映射的完成需要这两组值,第一组值称之为Key-键,第二组值称之为Value-值
12 * 4.键是唯一的,每一个键对应一个值。
13 * 5.在映射中,键和值是成对出现的,这种结构就叫键值对。所以一个映射实际上是由多个键值对来组成的
14 * 6.如果存放重复的键,那么对应的值会被代替。
15 * 7.Map不是集合,但是 Map是JAVA集合框架的成员
16 * 8.JAVA集合框架- JAVA Collections Framework
17 * 其包含了数组、集合、映射相关的类以及接口:
18 * Collection、Map、Arrays、Collections、Iterator、Comparator、Comparable
19 * 实现类
20 * HashMap
21 * 1.底层依靠数组+链表结构来存储数据
22 * 4.数组的每一个位置上维系一个链表结构
23 * 5.数组的每一个位置称之为一个bucket - 桶
24 * 2.默认数组的初始容量16,默认加载因子是0.75F
25 * 3.JDK1.8中,如果单个桶中的节点个数超过8个会将链表扭转成一棵红黑树,当节点个数小于7个的时候,会扭转回链表
26 * 4.如果指定了初始容量n,那么 2^x <n<= 2^x+1 , 实际容量就是2^x+1
27 * 5.当已经使用的桶的数量/桶的总数量>加载因子时,就会进行扩容。
28 * 6。每一次扩容增加一倍,底层基于左移来运算
29 * 扩容完成之后,所有的元素要重新计算重新分布-rehash(扩容)
30 * 减少rehash的次数:
31 * 1.增大初始容量
32 * 2.适当提高加载因子:0.6-0.8
33 * 7.同一个类的同一对象的哈希码一定是相同的,同一个类的不同对象哈希码一般是不同的
34 * 8.元素个数越多的时候,rehash的效率就越慢
35 * 9.加载因子越小,rehash的次数越大,同时导致空间的浪费;加载因子越大,在元素插入的过程中,比较次数越多
36 * 10.键值对在往桶中放的时候,会先和桶中的所有的键值对的键进行比 较;如果键一致,则对应的值覆盖;如果键不一致,则插入到链表的尾部
37 * 11.允许null键和null值
38 * 12. 异步式线程不安全
39 * */
40 HashMap<Integer,String> H1 = new HashMap<>();
41 H1.put(10,"L");
42 H1.put(12,"因为在一千年以后");
43 H1.put(11,"世界早已没有我");
44 H1.put(13,"无法深情握着你的手");
45 H1.put(14,"亲吻着你额头");
46 H1.put(10,"K");
47 System.out.println(H1);
48 /*
49 * Hashtable
50 * 1.HashTable是JAVA最早的映射
51 * 2.不允许键和值为null
52 * 3.底层也是依靠数组+链表结构存储
53 * 4.给定的初始容量是多少,那么就是多少
54 * 5.同步式线程安全
55 * 6.默认初始容量是11,默认加载因子是0.75F
56 * */
57 Hashtable<Integer,String> HT = new Hashtable<>();
58 HT.put(1, "越渺小");
59 HT.put(2, "越害怕得到");
60 HT.put(3, "每一次哭");
61 HT.put(4, "每一次哭");
62 HT.put(5, "每一次哭");
63 HT.put(6, "每一次哭");
64 HT.put(7, "每一次哭");
65 HT.put(8, "每一次哭");
66 HT.put(9, "每一次哭");
67 HT.put(10, "每一次哭");
68 HT.put(11, "每一次哭");
69 HT.put(12, "每一次哭");
70 HT.put(13, "每一次哭");
71 HT.put(14, "每一次哭");
72 HT.put(0, "每一次哭");
73 System.out.println(HT);
74
75
76 }
77 }