学生兼职做网站订阅号怎么制作

bicheng/2026/1/26 12:46:13/文章来源:
学生兼职做网站,订阅号怎么制作,长春推广公司,抖音seo排名优化前言 之前读过一些类的源码#xff0c;近来发现都忘了#xff0c;再读一遍整理记录一下。这次读的是 JDK 11 的代码#xff0c;贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解。 Map 接口 这里提一下 Map 接口与1.8相比 Map接口又新增了几个方法#xff1a;   … 前言   之前读过一些类的源码近来发现都忘了再读一遍整理记录一下。这次读的是 JDK 11 的代码贴上来的源码会去掉大部分的注释, 也会加上一些自己的理解。 Map 接口        这里提一下 Map 接口与1.8相比 Map接口又新增了几个方法   这些方法都是包私有的static方法of()方法分别返回包含 0 - 9 个键值对的不可修改的MapofEntries()方法返回包含从给定的entries总提取出来的键值对的不可修改的* Map不会包含给定的entriesentry()方法返回包含键值对的不可修改的 Entry不允许 null 作为 key 或 valuecopyOf()返回一个不可修改的包含给定 Map 的 entries 的 Map 调用了ofEntries()方法.数据结构   HashMap 是如何存储键值对的呢?     HashMap 有一个属性 table: transient NodeK,V[] table;   table 是一个 Node 的数组, 在首次使用和需要 resize 时进行初始化; 这个数组的长度始终是2的幂, 初始化时是0, 因此能够使用位运算来代替模运算.   HashMap的实现是装箱的(binned, bucketed), 一个 bucket 是 table 数组中的一个元素, 而 bucket 中的元素称为 bin .   来看一下 Node , 很显然是一个单向链表: static class NodeK,V implements Map.EntryK,V {final int hash;final K key;V value;NodeK,V next;... }   当然, 我们都知道 bucket 的结构是会在链表和红黑树之间相互转换的: // 转换成红黑树 if (binCount TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);// 转换成链表结构 if (lc UNTREEIFY_THRESHOLD)tab[index] loHead.untreeify(map);   注意在 treeifyBin() 方法中: // table 为 null 或者 capacity 小于 MIN_TREEIFY_CAPACITY 会执行 resize() 而不是转换成树结构 if (tab null || (n tab.length) MIN_TREEIFY_CAPACITY)resize();   TreeNode 的结构和 TreeMap 相似, 并且实现了 tree 版本的一些方法: static final class TreeNodeK,V extends LinkedHashMap.EntryK,V {TreeNodeK,V parent; // red-black tree linksTreeNodeK,V left;TreeNodeK,V right;TreeNodeK,V prev; // needed to unlink next upon deletionboolean red;... } initialCapacity 和 loadFactor   先看一下 HashMap 的4个构造器可以发现3个重要的 int thresholdinitialCapacity 和 loadFactor 其中 threshold 和 loadFactor 是 HashMap 的私有属性。   HashMap 的 javadoc 中有相关的解释 capacityHashMap 的哈希表中桶的数量initial capacity 哈希表创建时桶的数量load factor 在 capacity 自动增加(resize())之前哈希表允许的填满程度threshold下一次执行resize()时 size 的值 (capacity * load factor)如果表没有初始化存放的是表的长度为0时表的长度将会是 DEFAULT_INITIAL_CAPACITY 。  注意: 构造器中的 initialCapacity 参数并不是 table 的实际长度, 而是期望达到的值, 实际值一般会大于等于给定的值. initialCapacity 会经过tableSizeFor() 方法, 得到一个不大于 MAXIMUM_CAPACITY 的足够大的2的幂, 来作为table的实际长度: static final int tableSizeFor(int cap) {int n -1 Integer.numberOfLeadingZeros(cap - 1);return (n 0) ? 1 : (n MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n 1; }   loadFactor 的默认值是 0.75f static final float DEFAULT_LOAD_FACTOR 0.75f;   initialCapacity 的默认值是16 static final int DEFAULT_INITIAL_CAPACITY 1 4; // aka 16   capacity 的最大值是1073741824 static final int MAXIMUM_CAPACITY 1 30;   在 new 一个 HasMap 时应该根据 mapping 数量尽量给出 initialCapacity , 减少表容量自增的次数 . putMapEntries() 方法给出了一种计算 initialCapacity 的方法: float ft ((float)s / loadFactor) 1.0F; int t ((ft (float)MAXIMUM_CAPACITY) ?(int)ft : MAXIMUM_CAPACITY); if (t threshold)threshold tableSizeFor(t);   这段代码里的 t 就是 capacity . hash() 方法   hash() 是 HashMap 用来计算 key 的 hash 值的方法, 这个方法并不是直接返回 key 的 hashCode() 方法的返回值, 而是将 hashCode 的高位移到低位后 再与原值异或. static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h 16); }   因为 HashMap 用 hash (table.length-1)代替了 模运算 , 如果直接使用 hashCode() 的返回值的话, 只有hash code的低位(如果 table.length 是2的n次方, 只有最低的 n - 1 位)会参加运算, 高位即使发生变化也会产生碰撞. 而 hash() 方法把 hashCode 的高位与低位异或, 相当于高位也参加了运算, 能够减少碰撞.   举个例子:  假设 table.length - 1 的 值为 0000 0111, 有两个hash code : 0001 0101 和 0000 0101. 这两个hash code 分别与 table.length - 1 做与运算之后的结果是一样的: 0000 0101; 将这两个hash code 的高位和低位异或之后分别得到: 0001 0100、 0000 0101, 此时再分别与 table.length - 1 做与运算的结果是 0000 0100 和 0000 0101, 不再碰撞了. resize()   resize() 方法负责初始化或扩容 table. 如果 table 为 null 初始化 table 为 一个长度为 threshold 或 DEFAULT_INITIAL_CAPACITY的表; 否则将 table 的长度加倍, 旧 table 中的元素要么呆在原来的 index 要么以2的幂为偏移量在新 table中移动: final NodeK,V[] resize() {NodeK,V[] oldTab table;int oldCap (oldTab null) ? 0 : oldTab.length;int oldThr threshold;int newCap, newThr 0;if (oldCap 0) {if (oldCap MAXIMUM_CAPACITY) {// 旧 table 的容量已经达到最大, 不扩容, 返回旧表threshold Integer.MAX_VALUE;return oldTab;}else if ((newCap oldCap 1) MAXIMUM_CAPACITY oldCap DEFAULT_INITIAL_CAPACITY)// 将旧容量加倍作为新表容量, 如果新表容量没达到容量最大值, 并且旧容量大于等于默认容量, threshold 加倍newThr oldThr 1; // double threshold}else if (oldThr 0) // initial capacity was placed in threshold// 旧的threshold 不为 0 , 旧 threshold 作为新表的容量newCap oldThr;else { // zero initial threshold signifies using defaults// 旧 threshold 为 0 , 用 DEFAULT_INITIAL_CAPACITY 作为新容量, 用默认值计算新 thresholdnewCap DEFAULT_INITIAL_CAPACITY;newThr (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr 0) {// 之前没有计算过新 threshold , 计算 thresholdfloat 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) {// 帮助 GColdTab[j] null;if (e.next null)// 这个桶里只有一个元素, 此处用位运算代替了模运算newTab[e.hash (newCap - 1)] e;else if (e instanceof TreeNode)// 如果这个 bucket 的结构是树, 将这个 bucket 中的元素分为高低两部分((e.hash bit) 0 就分在低的部分, bit 是 oldCap), 低的部分留在原位, 高的部分放到 newTab[j oldCap]; 如果某一部分的元素个数小于 UNTREEIFY_THRESHOLD 将这一部分转换成链表形式, 否则就形成新的树结构((TreeNodeK,V)e).split(this, newTab, j, oldCap);else { // preserve order// 将普通结构的 bucket 中的元素分为高低两部分, 低的部分留在原位, 高的部分放到 newTab[j oldCap]NodeK,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; }   举个例子解释一下高低两部分的划分: 扩容前 table.length 是 0000 1000 记为 oldCap , table.length - 1 是 0000 0111 记为 oldN;扩容后 table.length 是 0001 0000 记为 newCap, table.length - 1 为 0000 1111 记为 newN;有两个Node, hash ( hash() 方法得到的值)分别为 0000 1101 和 0000 0101 记为 n1 和 n2;  在扩容前, n1 和 n2 显然是在一个 bucket 里的, 但在扩容后 n1 newN 和 n2 newN 的值分别是 0000 1101 和 0000 0101, 这是需要划分成两部分, 并且把属于高部分的 bin 移动到新的 bucket 里的原因.   扩容后, hash 中只会有最低的4位参加 index 的计算, 因此可以用第4位来判断属于高部分还是低部分, 也就可以用 (hash oldCap) 0 来作为属于低部分的依据了. 查找   查找方法只有 get() 和 getOrDefault() 两个, 都是调用了 getNode()方法: public V get(Object key) {NodeK,V e;return (e getNode(hash(key), key)) null ? null : e.value; }Override public V getOrDefault(Object key, V defaultValue) {NodeK,V e;return (e getNode(hash(key), key)) null ? defaultValue : e.value; } getNode() 方法 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) {// table 已经被初始化且 table 的长度不为 0 且 对应的 bucket 里有 binif (first.hash hash // always check first node((k first.key) key || (key ! null key.equals(k))))// 第一个节点的 key 和 给定的 key 相同return first;if ((e first.next) ! null) {// bucket 中还有下一个 binif (first instanceof TreeNode)// 是树结构的 bucket, 调用树版本的 getNode 方法return ((TreeNodeK,V)first).getTreeNode(hash, key);do {// 在普通的链表中查找 keyif (e.hash hash ((k e.key) key || (key ! null key.equals(k))))return e;} while ((e e.next) ! null);}}return null; } 遍历   可以通过entrySet()、keySet()、values()分别获得 EntrySet、KeySet()和Values对象, 他们的迭代器都是HashIterator的子类. fast-fail 和 modCount   HashMap 不是线程安全的, 并且实现了 fast-fail 机制. 当一个迭代器被创建的时候(或者迭代器自身的 remove() 方法被调用), 会记录当前的 modCount 作为期待中的 modCount, 并在操作中先检查当前 modCount 是不是和旧的 modCount 相同, 不同则会抛出ConcurrentModificationException.   任何结构修改(新增或删除节点)都会改变 modCount 的值. 新增和更新   1.8 之前有4个方法和构造器能够往 HashMap 中添加键值对: 以一个Map为参数的构造器、put()、putAll()、putIfAbsent(), public HashMap(Map? extends K, ? extends V m) {this.loadFactor DEFAULT_LOAD_FACTOR;putMapEntries(m, false); }public V put(K key, V value) {return putVal(hash(key), key, value, false, true); }public void putAll(Map? extends K, ? extends V m) {putMapEntries(m, true); }Override public V putIfAbsent(K key, V value) {return putVal(hash(key), key, value, true, true); }   他们分别调用了putMapEntries()和putVal(). 这两个方法中有一个参数 evict , 仅当初始化时(构造器中)为 false. putVal() 方法   来看一下putVal() 方法: final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {NodeK,V[] tab; NodeK,V p; int n, i;if ((tab table) null || (n tab.length) 0)// table 未被初始化或者长度为 0 时, 执行 resize()n (tab resize()).length;if ((p tab[i (n - 1) hash]) null)// 对应的 bucket 里没有元素, 新建一个普通 Node 放到这个位置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))))// 第一个节点的 key 和 给定的 key 相同e p;else if (p instanceof TreeNode)// 树结构, 调用树版本的 putVal, 如果树结构中存在 key, 将会返回相应的 TreeNode, 否则返回 nulle ((TreeNodeK,V)p).putTreeVal(this, tab, hash, key, value);else {for (int binCount 0; ; binCount) {if ((e p.next) null) {// 在链表中没有找到 key, 新建一个节点放到链表末尾p.next newNode(hash, key, value, null);if (binCount TREEIFY_THRESHOLD - 1) // -1 for 1st// 当前桶转换成树结构treeifyBin(tab, hash);break;}if (e.hash hash ((k e.key) key || (key ! null key.equals(k))))// key 相同 breakbreak;p e;}}if (e ! null) { // existing mapping for key// key 在 map 中存在V oldValue e.value;if (!onlyIfAbsent || oldValue null)// 覆盖旧值e.value value;afterNodeAccess(e);return oldValue;}}// key 之前在 map 中不存在, 发生了结构变化, modCount 增加 1modCount;if (size threshold)// 扩容resize();afterNodeInsertion(evict);return null; } HashMap 提供了三个回调方法: void afterNodeAccess(NodeK,V p) { } void afterNodeInsertion(boolean evict) { } void afterNodeRemoval(NodeK,V p) { } putMapEntries() 方法   putMapEntries()方法就简单多了 final void putMapEntries(Map? extends K, ? extends V m, boolean evict) {int s m.size();if (s 0) {if (table null) { // pre-size// table 还没有初始化, 计算出 thresholdfloat ft ((float)s / loadFactor) 1.0F;int t ((ft (float)MAXIMUM_CAPACITY) ?(int)ft : MAXIMUM_CAPACITY);if (t threshold)threshold tableSizeFor(t);}else if (s threshold)// s 超过了 threshold, 扩容resize();for (Map.Entry? extends K, ? extends V e : m.entrySet()) {// 调用 putVal() 方法, 将键值对放进 mapK key e.getKey();V value e.getValue();putVal(hash(key), key, value, false, evict);}} } 删除   删除元素有三个方法, 还有 EntrySet 和 KeySet 的 remove 和 clear 方法: public V remove(Object key) {NodeK,V e;return (e removeNode(hash(key), key, null, false, true)) null ?null : e.value; }Override public boolean remove(Object key, Object value) {return removeNode(hash(key), key, value, true, true) ! null; }public void clear() {NodeK,V[] tab;modCount;if ((tab table) ! null size 0) {size 0;for (int i 0; i tab.length; i)tab[i] null;} } removeNode() 方法   removeNode() 方法有5个参数, 说明一下其中两个: matchValue 为 true 时, 只在 value 符合的情况下删除;movable 为 false 时, 删除时不移动其他节点, 只给树版本的删除使用. final NodeK,V removeNode(int hash, Object key, Object value,boolean matchValue, boolean movable) {NodeK,V[] tab; NodeK,V p; int n, index;if ((tab table) ! null (n tab.length) 0 (p tab[index (n - 1) hash]) ! null) {// table 已经被初始化且 table 的长度不为 0 且 对应的 bucket 里有 binNodeK,V node null, e; K k; V v;if (p.hash hash ((k p.key) key || (key ! null key.equals(k))))// 第一个的 key 和给定的 key 相同node p;else if ((e p.next) ! null) {// bucket 中有不止一个 binif (p instanceof TreeNode)// 树结构, 调用树版本的 getNodenode ((TreeNodeK,V)p).getTreeNode(hash, key);else {// 在普通的 bucket 中查找 nodedo {if (e.hash hash ((k e.key) key ||(key ! null key.equals(k)))) {node e;break;}p e;} while ((e e.next) ! null);}}if (node ! null (!matchValue || (v node.value) value ||(value ! null value.equals(v)))) {// 找到了 node , 并且符合删除条件if (node instanceof TreeNode)// 树结构, 调用树版本的 removeNode , 如果节点过少, 会转换成链表结构((TreeNodeK,V)node).removeTreeNode(this, tab, movable);else if (node p)// node 是链表的第一个元素tab[index] node.next;else// 不是第一个元素p.next node.next;// 结构变化 modCount 1modCount;--size;afterNodeRemoval(node);return node;}}return null; } 总结 HashMap 是一个基于哈希表的装箱了的 Map 的实现; 它的数据结构是一个桶的数组, 桶的结构可能是单向链表或者红黑树, 大部分是链表.table 的容量是2的幂, 因此可以用更高效的位运算替代模运算.HashMap 使用的 hash 值, 并不是 key 的 hashCode()方法所返回的值, 详细还是看上面吧.一个普通桶中的 bin 的数量超过 TREEIFY_THRESHOLD, 并且 table 的容量大于 MIN_TREEIFY_CAPACITY, 这个桶会被转换成树结构; 如果 bin 数量大于TREEIFY_THRESHOLD , 但 table 容量小于 MIN_TREEIFY_CAPACITY, 会进行扩容.每次扩容新 table 的容量是老 table 的 2 倍.扩容时, 会将原来下标为 index 的桶里的 bin 分为高低两个部分, 高的部分放到 newTab[index oldCap] 上, 低的部分放在原位; 如果某部分的 bin 的个数小于 UNTREEIFY_THRESHOLD 树结构将会转换成链表结构.  转自https://www.cnblogs.com/FJH1994/p/10227048.html 转载于:https://www.cnblogs.com/hujunzheng/p/10231097.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

惠州建设企业网站asp网站怎么下载源码

代码随想录二刷 | 数组 | 螺旋矩阵II 题目描述解题思路 & 代码实现 题目描述 29.螺旋矩阵II 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1…

莱芜正规的企业建站公司谷歌google地图

11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载 请点击下面的连接下载[url]http://cid-b10793e754ad25f7.skydrive.live.com/browse.aspx/IE8Training[/url]里面有3个文件,内容包含了IE8课程的主要内容转载于:https://blog.51cto.com…

珠海在线网站制作公司小程序开发公司制作

目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…

搜网站首页不见了seo网站建设有哪些基本流程

前言: 在使用若依框架的过程中,如果是查询结果数据直接返回,那么其自带的分页插件可以正常返回数据以及总条数,若是在业务逻辑层对数据进行了其他二次处理,再返回就会出现异常,无论查询了多少条&#xff0…

如何进入谷歌网站南宁网站推广策略

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

f式布局网站江苏中禾建设网站

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 Spring中的单…

购买服务器做网站用动易建设网站教程

一 ACL 简介 ACL是Access Control List(访问控制列表)的缩写,是一种用于控制文件、目录、网络设备等资源访问权限的方法。ACL可以对每个用户或用户组设置不同的访问权,即在访问控制清单中为每个用户或用户组指定允许或禁止访问该资源的权限。它通常由一系列规则组成,规则…

做目录网站注意事项上海搬家公司电话价格表

深入理解Vue3中利用mitt:实现轻量级事件监听与触发 摘要:本文将介绍如何在Vue3中利用mitt库实现轻量级的事件监听与触发。我们将详细介绍mitt库的特性和使用方法,并通过实际示例展示如何在Vue3组件中应用mitt。 一、引言 在前端开发中&…

设计自己的网站自己搭建域名服务器

http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一、基于图像灰度统计特性配准算法;二、基于图像特征配准算法;三、基于图像理解的配准算法。 其中,算法类型二最普遍,基于特征的图像配准算法的核心步骤…

网站定制开发多久时间wordpress支付宝捐赠插件

目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中,Bean是最基本的组件,它是Spring框架中的一个Java对象。 下面通过Bean来理解bean的生命周期: Bean(initMethod "customInit", destroyMethod "cust…

两学一做知识竞赛网站江宁区建设局网站

文章目录 一、简述 Kubernetes 如何保证集群的安全性二、简述 Kubernetes 准入机制三、简述 Kubernetes RBAC 及其特点(优势)四、简述 Kubernetes Secret 作用五、简述 Kubernetes Secret 有哪些使用方式六、简述 Kubernetes PodSecurityPolicy 机制七、…

在什么网站做推广做网站人员工资

理论知识 定时器定时中断 接线图 定时器工作配置步骤 定时中断和内外时钟源选择 定时器中需要使用的函数 程序实现效果: void TIM_DeInit(TIM_TypeDef* TIMx); **// 恢复定时器的缺省配置**void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM…

做yy头像的网站常用的搜索引擎有哪些?

什么是Kotlin? Kotlin,如前面所说,它是JetBrains开发的基于JVM的语言。JetBrains因为创造了一个强大的Java开发IDE被大家所熟知。Android Studio,官方的Android IDE,就是基于Intellij,作为一个该平台的插件。 Kotli…

如何做网站大图片免费建立个人网站的视频

适应力和应变力在智能系统中扮演着非常重要的角色。在面对复杂、多变的环境和问题时,一个智能系统需要具备适应和调整自身行为的能力,这就需要依赖适应力和应变力。 适应力指的是系统对环境变化的感知、理解和调整能力。一个具有良好适应力的系统能够及时…

建设银行官方网站登长沙做推广的公司有多少

目录 写在前面准备Open3D使用demo编译demo运行demo相关说明 参考完 写在前面 1、本文内容 Open3D在0.15版之后,提供编译好的包,本文是以最新版(截止202402,0.18.0)为例的Open3D使用教程; Open3D其他版本的编译和使用相关教程&…

一级a做爰片软件网站织梦网站后台密码忘记了怎么做

该文章笔记结合菜鸟教程的排序算法,如果后面认识有改动或者完善再继续 最近笔试很多题目都考察过了基本的排序算法,尤其是快排、冒泡、选择,大家在这一方面一定要注意下。 一. 总述 1. 时间复杂度 详细介绍 1. 冒泡排序 冒泡排序重复地走…

淘宝客网站需要备案微信群免费推广平台

【本长内容】 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习 1. 树形结构 1.1 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是…

服装电子商务网站有哪些高清做视频在线观看网站

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用(集群配置)【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

下步我院将建设网站信息保密建销售网站需要多少钱

文章目录 概念1. 云原生(Cloud Native):2. 容器编排(Container Orchestration): 小结 概念 云原生和容器编排是两个不同的概念,但它们之间有着密切的联系。下面将分别介绍这两个概念&#xff0…

浙江广发建设有限公司网站wordpress修改主题文件

文章目录 题目描述问题分析程序代码 题目描述 原题链接 Alice 和 Bob 轮流玩一个游戏,Alice 先手。 一堆石子里总共有n个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双…