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 }