Day18 ----满课的一天,学习时间少了点。

今天学习时间两个多小时,太堕落了,今天满课,明天也是满课,并且那个课还不能旷课,点名,我晕了,明天尽量凑出大于四个小时的学习时间,加油OVO

Day18

 

package com.sorrymaker.Map;

import org.junit.Test;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
* 一、Map的实现类的结构:
* /----Map:双列数据,存储key-value键值对的数据   -类似于y =f(x)
*     /---HashMap:作为Map的主要实现类;线程不安全的,效率高。允许存储null的key和value
*             /---LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。
*                         原因:在原有的HashMap底层结构的基础上,添加了一对指针,指向了前一个和后一个元素。
*                         对于频繁的遍历操作,此类执行效率高于HashMap。
*     /---TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。按照key来自然排序和定制排序。
*                 底层使用红黑树。
*     /---Hashtable:作为古老的实现类;线程安全,效率低。不允许存储null的key和value。
*             /---Properties:常用来处理配置文件,key和value都是String类型。
*
*
*             HaspMap的底层:数组加链表(jdk7之前)
*                           数组加链表加红黑树 (jdk8)
*
* 面试题:
* 1.HashMap的底层实现原理:
* 2.HashMap 和Hashtable的异同。
* 3.CurrentHashMap 与Hashtable的异同。
*
* 二、Map的理解
*     Map中的key:无序的,不可重复的,使用Set存储所有的Key。--->key所在的类要重写equals()和hashCode()(以hashMap为例)。
*     Map中的value:无序的,可重复的,使用Collection 存储了所有的value--->value所在的类要重写equals()
*     一个键值对:key—value构成了一个Entry对象。
*     Map中的entry:无序的,不可重复的,使用所有Set存储所有entry。
*
* 三、HashMap底层实现原理?以jdk7为例
*     HashMap map = new HashMap();
*     在实例化以后,底层创建了长度为16的一维数组Entry[] table。
*     ...可能已经执行过多次put....
*     map.put(key1,value1);
*     首先:调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某中算法计算以后,得到Entry数组中的存放位置。
*     如果此位置上数据为空,此时key1-value1添加成功(entry添加成功)。--------情况一
*     如果此位置上数据不为空,意味着此位置上存在一个或多个数据(以链表形式存在),比较key1和已经存在的一个或多个数据的
*     哈希值:
*             如果key1的哈希值与已经存在的数据的哈希值不同,此时key1-value1添加成功。--------情况二
*             如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较,调用key1所在类的equals(key2)方法,比较:
*                     如果equals()返回false:此时key1-value1添加成功。-----情况三
*                     如果equals()返回true:使用value1替换value2。
*
*     补充:关于情况二和情况三:此时key1-value1和原来的数据以链表的方式存储。
*
*     在不断添加的过程中,会涉及扩容问题,默认的扩容方式:当超出临界值(且要存放的位置非空时)扩容。
*     扩容为原来的两倍,并将原有的数据赋值过来。
*
*     jdk8相较于jdk7在底层实现方面的不同:
*     1. new HashMap():底层没有创建一个长度为16的数组。
*     2. jdk8底层额数组时Node[],而非Entry[]。
*     3. 首次调用put()方法时,底层创建长度为16的数组。
*     4. jdk7的底层结构只有数组加链表。jdk8的底层结构:数据+链表+红黑树。
*         当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8 且当前数组的长度 > 64时
*         此时此索引位置上的所有数据改为红黑树存储。(查找效率优化。)
*
*
*
* @author 喜
*/
public class MapTest {

   @Test
   public void test(){
       Map map =new HashMap();
       map =new Hashtable();
       map.put(null,null);
  }
}

 

 

今日补充

&:按位与,“只有两个都是1,结果才是1。”

|:安位或,“只要有一个1,结果就是1。”

^:按位异或,“相同的为0,不同的为1。”

~:按位取反,“1就是0,0就是1。”

 

// >>:按位右移,“表示将二进制向右位移,左边填符号位。”

// >>>:无符号右移动,“表示将二进制向右位移,左边填0。”*

posted @ 2021-03-29 20:42  独眼龙  阅读(161)  评论(0)    收藏  举报