当前位置: 首页 > news >正文

列出网站目录wordpress修改边栏字体颜色

列出网站目录,wordpress修改边栏字体颜色,网站月付服务器,佛山厂家关键词网络推广本文针对JDK8中的HashMap进行讲解。对比jdk1.7 #xff0c;最大的不同就是数据结构使用了红黑树#xff0c;所以其由 数组链表红黑树 组成。 版本结构哈希算法JDK1.7数组 链表使用位运算JDK1.8数组 链表 红黑树使用 ^ 将高位与低位进行异或运算 1. 成员变量-参数 // 默…本文针对JDK8中的HashMap进行讲解。对比jdk1.7 最大的不同就是数据结构使用了红黑树所以其由 数组链表红黑树 组成。 版本结构哈希算法JDK1.7数组 链表使用位运算JDK1.8数组 链表 红黑树使用 ^ 将高位与低位进行异或运算 1. 成员变量-参数 // 默认的初始化长度 16 static final int DEFAULT_INITIAL_CAPACITY 1 4; // aka 16 // 最大容量 static final int MAXIMUM_CAPACITY 1 30; // 默认负载因子 - 用于扩容 static final float DEFAULT_LOAD_FACTOR 0.75f; // 链表转红黑树的阈值8 static final int TREEIFY_THRESHOLD 8; // 红黑树转链表的阈值6 static final int UNTREEIFY_THRESHOLD 6; // 链表转红黑树同时还需要满足一个条件数组长度为64 static final int MIN_TREEIFY_CAPACITY 64;------ 变量 ------ //实际存储的key-value键值对的个数 transient int size;//用于快速失败由于HashMap非线程安全在对HashMap进行迭代时如果期间其他线程的参与导致HashMap的结构发生变化了比如putremove等操作需要抛出异常ConcurrentModificationException transient int modCount;// 当table {}时该值为初始容量初始容量默认为DEFAULT_INITIAL_CAPACITY当table被填充了也就是为table分配内存空间后threshold一般为 capacity*loadFactory。HashMap在进行扩容时需要参考threshol int threshold;// 负载因子代表了table的填充度有多少默认是0.75 final float loadFactor;2. 基本组成元素 Node是HashMap的基本组成元素每一个Node包含一个key-value键值对。 static class NodeK,V implements Map.EntryK,V {final int hash; // 存储键的哈希码通过对键的哈希码进行运算可以快速地定位到数组的索引位置。final K key;V value;NodeK,V next; // 指向下一个 Node 的引用。由于哈希冲突的存在可能多个键映射到同一个索引位置因此采用链表或红黑树的方式来解决冲突next 就是用于存储下一个节点的引用。 }3. 哈希冲突计算 static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16); } // 数组下标计算 index (n - 1) hash面试问题为什么HashMap初始化容量是2的幂次方 ??? 目的为了数组离散均匀同时减少哈希冲突和不必要的数据空间浪费。按位与运算比取模运算速度快。 解析 为了满足公式 : hash % length hash (length - 1 ) jdk中1.7求哈希为除留余数法:index hash % length JDK1.8更改为 index hash length - 1而优势就是 效率高。 数组的长度一定需要为2的幂次方。例如在场长度为16时在二进制的表示中所有位都是1保证了对任意哈希进行操作的时候都能保留哈希值的所有位。如下 00100100 10100101 11000100 00100101 // Hash 值 00000000 00000000 00000000 00001111 // 16 - 1 15 ----------------------------------00000000 00000000 00000000 00000101 // 高位全部归零只保留了末四位。下标永远在0-15减小哈希冲突提高散列均匀性解决哈希冲突。 4. get 方法 public V get(Object key) {NodeK, V e;return (e getNode(hash(key), key)) null ? null : e.value; }final NodeK, V getNode(int hash, Object key) {NodeK, V[] tab;NodeK, V first, e;int n;K k;// 如果哈希表不为空且键对应的槽中有节点则进行查找if ((tab table) ! null (n tab.length) 0 (first tab[(n - 1) hash]) ! null) {// 判断第一个结点是不是匹配的如果第一个节点的哈希值和键匹配则直接返回第一个节点的值if (first.hash hash ((k first.key) key || (key ! null key.equals(k))))return first;// 如果槽中有多个节点则遍历链表或树进行查找if ((e first.next) ! null) {// 判断当前数据结构是否为树型结构if (first instanceof TreeNode)return ((TreeNodeK, V)first).getTreeNode(hash, key);do {// 遍历链表if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))return e;} while ((e e.next) ! null);}}// 如果没有找到匹配的节点则返回 nullreturn null; }get 方法首先调用 getNode 方法获取对应键的节点。getNode 方法通过哈希值定位到哈希表中的槽然后在链表或树中查找匹配的节点。如果找到了匹配的节点返回节点的值否则返回 null。 5. put 方法 public V put(K key, V value) {return putVal(hash(key), key, value, false, true); } // onlyIfAbsent 如果是true那么只有在不存在该 key 时才进行put操作 final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {NodeK, V[] tab;NodeK, V p;int n, i;// 如果哈希表为空则进行初始化// map第一次进行put操作时会触发下面的resize()// 第一次触发resize与后续的扩容不一样首次扩容是数组从 null 初始化到默认的 16 或 自定义的初始容量if ((tab table) null || (n tab.length) 0)n (tab resize()).length;// 如果槽中没有节点则直接插入新节点if ((p tab[i (n - 1) hash]) null)tab[i] newNode(hash, key, value, null);else {NodeK, V e;K k;// 如果槽中有节点则进行链表或树的遍历if (p.hash hash ((k p.key) key || (key ! null key.equals(k))))e p;else if (p instanceof TreeNode)e ((TreeNodeK, V)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount 0; ; binCount) {// 如果链表长度达到树化的阈值则将链表转为红黑树if ((e p.next) null) {p.next newNode(hash, key, value, null);if (binCount TREEIFY_THRESHOLD - 1)treeifyBin(tab, hash);break;}// 遍历链表查找匹配的节点if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))break;p e;}}// 如果找到与当前插入匹配的节点根据onlyIfAbsent进行节点更新更新成功之后返回旧值if (e ! null) {V oldValue e.value;if (!onlyIfAbsent || oldValue null)e.value value;afterNodeAccess(e);return oldValue;}}modCount;// 如果插入新节点后哈希表的大小超过了阈值则进行扩容if (size threshold)resize();afterNodeInsertion(evict);return null; }put 方法首先调用 hash 方法计算键的哈希值然后调用 putVal 方法执行实际的插入操作。putVal 方法先检查哈希表是否为空如果为空则进行初始化。接着在槽中没有节点的情况下直接插入新节点。如果槽中有节点则根据链表长度和树化阈值的不同情况选择继续遍历链表或将链表转为红黑 6. 扩容机制 在 HashMap 中扩容是为了防止哈希冲突的发生提高哈希表的性能。 final NodeK,V[] resize() {NodeK,V[] oldTab table;int oldCap (oldTab null) ? 0 : oldTab.length;int oldThr threshold;int newCap, newThr 0;// 如果旧的容量大于0if (oldCap 0) {// 如果旧的容量已经达到了最大容量则不再扩容if (oldCap MAXIMUM_CAPACITY) {threshold Integer.MAX_VALUE;return oldTab;}// 否则计算新的容量和新的阈值else if ((newCap oldCap 1) MAXIMUM_CAPACITY oldCap DEFAULT_INITIAL_CAPACITY)newThr oldThr 1; // double threshold}// 如果旧的容量为0但阈值已经被设置过则将容量设置为阈值else if (oldThr 0)newCap oldThr;// 如果旧的容量和阈值都为0则使用默认初始容量和默认加载因子else {newCap DEFAULT_INITIAL_CAPACITY;newThr (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}// 如果新的阈值为0则计算新的阈值if (newThr 0) {float ft (float)newCap * loadFactor;newThr (newCap MAXIMUM_CAPACITY ft (float)MAXIMUM_CAPACITY ?(int)ft : Integer.MAX_VALUE);}// 更新阈值threshold newThr;// 创建新的哈希表SuppressWarnings({rawtypes,unchecked})NodeK,V[] newTab (NodeK,V[])new Node[newCap];table newTab;// 如果旧的哈希表不为空则将旧的节点重新映射到新的哈希表中if (oldTab ! null) {for (int j 0; j oldCap; j) {NodeK,V e;if ((e oldTab[j]) ! null) {oldTab[j] null;if (e.next null)newTab[e.hash (newCap - 1)] e;else if (e instanceof TreeNode)((TreeNodeK,V)e).split(this, newTab, j, oldCap);else { // preserve orderNodeK,V loHead null, loTail null;NodeK,V hiHead null, hiTail null;NodeK,V next;do {next e.next;if ((e.hash oldCap) 0) {if (loTail null)loHead e;elseloTail.next e;loTail e;}else {if (hiTail null)hiHead e;elsehiTail.next e;hiTail e;}} while ((e next) ! null);if (loTail ! null) {loTail.next null;newTab[j] loHead;}if (hiTail ! null) {hiTail.next null;newTab[j oldCap] hiHead;}}}}}return newTab; }关键步骤如下 计算新容量和新阈值 根据旧容量、旧阈值、加载因子等信息计算新的容量和新的阈值。创建新数组 根据新的容量创建一个新的数组。将旧数据重新映射到新数组中 遍历旧的数组将其中的节点根据新的容量重新映射到新的数组中涉及到链表的拆分和合并。更新阈值和数组引用 更新阈值和数组引用。 在这个过程中通过位运算 (hash (newCap - 1))新的容量和新的阈值来重新计算节点的位置。这种方式保持了节点在新数组中的相对位置关系有助于提高性能。在链表长度达到一定阈值时还会考虑将链表转化为红黑树以提高查询效率。
http://www.pierceye.com/news/905404/

相关文章:

  • 长沙优化网站获客软件最新网页游戏排行榜2021
  • 学校网站 建设网络系统管理与维护电大考试题
  • 中文域名转码网站琼筑网站是哪家做的
  • iis 网站访问权限毕设做网站的过程
  • 俱乐部网站模板有什么外贸网站
  • 补习吧 一家专门做家教的网站wordpress繁体字插件
  • 北京西站附近景点网络运营工作内容
  • 网站开发文档模板flask网站开发源码
  • 东莞清洁服务网站建设wordpress收费主题
  • 微网站如何做门户网站建设成都
  • 厦门网络推广建网站前端做图表的网站
  • 河南郑州网站设计公司手机自助建网站
  • 做网站的公司主要做shm有域名了网站怎么做
  • 竭诚网络网站建设价格贺兰网站建设
  • 部门网站管理建设工作汇报wordpress一键生成app
  • 帝国视频网站模板做网站的环境配置
  • 龙采科技做网站多少钱域名如何申请
  • 中国银行全球门户网站wordpress 分类下排序
  • 网站费用怎么做帐张北网站建设
  • 郑州专业网站制作泉州网络推广专员
  • 此网站可能有优化大师班级
  • 用html表格做的网站钦州建站哪家好
  • 做任务可以给钱的网站ps怎么做电商网站
  • 建设单位网站的重要性设计官网需要留言吗
  • 网站推广关键词排名优化做网站虚拟主机和云服务器吗
  • seo如何推广网站深圳网站的做网站公司
  • 架设网站是自己架设服务器还是租服务器佛山网站排名推广
  • 西安做网站哪家最便宜win系统的wordpress
  • 饲料网站源码3号台风最新消息
  • 天津 公司网站建设优化网站内容的方法