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

Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap

目录

一,SortedMap 

二,NavigableMap

三,TreeMap

3.1 TreeMap 继承结构

3.2 TreeMap 属性

3.3 TreeMap 构造器

3.4 TreeMap 内部类

3.4.1 Values

3.4.2 KeySet

3.4.3 EntrySet

3.4.5 相关集合迭代器

3.4.5.1 PrivateEntryIterator 迭代器

   

3.4.5.2 ValueIterator 迭代器

3.4.5.3 KeyIterator 迭代器

          

3.4.5.4 EntryIterator 迭代器

3.4.5.5 DescendingKeyIterator 倒排 key 迭代器

3.4.6  相关子集Map

3.4.7 相关分割器

3.4.8 Entry 映射实体类 (红黑树节点)

3.5 TreeMap 新增业务

3.5.1 put(key, value)

3.5.2 putIfAbsent(key, value)

 3.5.3 put(key, value, replaceOld)

3.5.4 addEntryToEmptyMap(key, value)

3.5.5 addEntry(key, value, parent, addToLeft)

3.6 TreeMap 删除业务

3.6.1 remove(key)

3.6.2 deleteEntry(e)

3.7 TreeMap 查询业务

3.8 TreeMap的 NavigableMap 的 lowerEntry(key)

2.9 TreeMap 与 HashMap 区别


一,SortedMap 

        SortedMap 是 Java 中 Map 接口的一个子接口,它提供一些额外的方法来处理有序的简直对映射。SortedMap 保证键以自然顺序或指定的比较器顺序排序。其接口方法源码如下:

package java.util;/*** @since 1.2*/
public interface SortedMap<K,V> extends Map<K,V> {/** 用于对键进行排序的比较器。如果使用键的自然顺序进行排序,则返回 null */Comparator<? super K> comparator();/** * 获取一个子映射[fromKey, toKey),用于处理特定范围的键值对 * @param fromKey    * @param toKey     */SortedMap<K,V> subMap(K fromKey, K toKey);/*** 获取所有键小于 toKey 值的子映射*/SortedMap<K,V> headMap(K toKey);/*** 获取所有键大于等于 fromKey值 的子映射*/SortedMap<K,V> tailMap(K fromKey);/** 返回当前映射中第一个(最小的)键。 */K firstKey();/** 返回当前映射中最后一个(最大的)键 */K lastKey();/** 返回一个包含此映射中所有键的 Set 视图。集合中的键按照升序排列 */Set<K> keySet();/** 返回一个包含此映射中所有值的 Collection 视图。集合中的值按照对应键的升序排列。*/Collection<V> values();/** 返回一个包含此映射中所有键值对的 Set 视图。集合中的条目按照键的升序排列 */Set<Map.Entry<K, V>> entrySet();
}

        SortedMap 提供了一些用于处理有序键值对映射的额外方法,这些方法允许你获取子映射、获取特定范围的映射,以及按顺序访问键、值和键值对。

二,NavigableMap

        NavigableMap 是 Java 集合框架中的一个接口,扩展了 SortedMap 接口,提供了导航方法来检索按顺序映射的键及其关联的值。它允许更灵活地处理键和值,并提供了查找最接近的匹配项的方法。

        NavigableMap 主要用于处理有序键值对,并提供了额外的导航方法,例如获取最接近的键,逆向视图等。与 SortedMap 不同, NavigableMap 提供了更丰富的方法集,使得更加灵活的操作有序映射。其接口源码如下:

package java.util;/*** @author Doug Lea* @author Josh Bloch* @param <K> the type of keys maintained by this map* @param <V> the type of mapped values* @since 1.6*/
public interface NavigableMap<K,V> extends SortedMap<K,V> {/************************** 基本导航方法 **************************//*** 查找 小于 指定键的最大键值的键值对映射,如果没有返回 null* @param key the key* @return * @throws ClassCastException* @throws NullPointerException*/Map.Entry<K,V> lowerEntry(K key);/*** 查找 小于 指定键的最大键值,如果没有返回 null** @param key the key* @throws ClassCastException* @throws NullPointerException*/K lowerKey(K key);/*** 查找 小于或等于 指定键的最大键值对,如果没有返回 null** @param key the key* @throws ClassCastException * @throws NullPointerException*/Map.Entry<K,V> floorEntry(K key);/*** 查找 小于或等于 指定键的最大键** @param key the key* @throws ClassCastException * @throws NullPointerException*/K floorKey(K key);/*** 查找 大于或等于 指定键的最小键值对,如果没有返回null** @param key the key* @throws ClassCastException * @throws NullPointerException*/Map.Entry<K,V> ceilingEntry(K key);/*** 查找 大于或等于 指定键的最小键。** @param key the key* @throws ClassCastException * @throws NullPointerException*/K ceilingKey(K key);/*** 查找 大于 指定键的最小键值对。** @param key the key* @throws ClassCastException* @throws NullPointerException */Map.Entry<K,V> higherEntry(K key);/*** 查找 大于 指定键的最小键** @param key the key* @throws ClassCastException * @throws NullPointerException */K higherKey(K key);/************************** 最小和最大方法 **************************//*** 获取映射中的第一个键值对* @return 返回映射中的第一个(键的最小)键值映射,或返回 null 如果映射为空*/Map.Entry<K,V> firstEntry();/*** 返回映射中的最后一个(键的最大)键值映射,或返回 null 如果映射为空。* @return 获取映射中的最后一个键值对*/Map.Entry<K,V> lastEntry();/*** 移除并返回映射中的第一个(键的最小)键值映射,或返回 null 如果映射为空* 简单理解:删除并返回映射中的第一个键值对。*/Map.Entry<K,V> pollFirstEntry();/*** 移除并返回映射中的最后一个(键的最大)键值映射,或返回 null 如果映射为空。* 简单理解:删除并返回映射中的最后一个键值对*/Map.Entry<K,V> pollLastEntry();/************************** 视图操作 **************************//** 获取映射的键按逆序排列的视图。 */NavigableMap<K,V> descendingMap();/** 获取所有键的 NavigableSet 视图 */NavigableSet<K> navigableKeySet();/** 获取所有键的逆序 NavigableSet 视图 */NavigableSet<K> descendingKeySet();/************************** 子映射操作 **************************//*** 返回键在 fromKey 到 toKey 范围内的子映射,是否包含边界由 fromInclusive 和 toInclusive 决定。* @param fromKey 子映射集合的起点* @param fromInclusive 子映射是否包含起点 true - 包含 | false - 不包含* @param toKey high 子映射集合的终点* @param toInclusive 子映射是否包含终点 true - 包含 | false - 不包含* @throws ClassCastException * @throws NullPointerException * @throws IllegalArgumentException */NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,K toKey,   boolean toInclusive);/*** 返回键小于(或等于,如果 inclusive 为 true)toKey 的子映射* @param toKey 子映射集合的终点* @param inclusive 子映射是否包含终点 true - 包含 | false - 不包含* @throws ClassCastException* @throws NullPointerException* @throws IllegalArgumentException*/NavigableMap<K,V> headMap(K toKey, boolean inclusive);/*** 返回键大于(或等于,如果 inclusive 为 true)fromKey 的子映射* @param fromKey 子映射集合的起点* @param inclusive 子映射是否包含起点 true - 包含 | false - 不包含* @throws ClassCastException * @throws NullPointerException * @throws IllegalArgumentException*/NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);/************************** SortedMap 兼容方法 **************************//*** 等价于 subMap(fromKey, true, toKey, false)* @throws ClassCastException       {@inheritDoc}* @throws NullPointerException     {@inheritDoc}* @throws IllegalArgumentException {@inheritDoc}*/SortedMap<K,V> subMap(K fromKey, K toKey);/*** 等价于 headMap(toKey, false)* @throws ClassCastException       {@inheritDoc}* @throws NullPointerException     {@inheritDoc}* @throws IllegalArgumentException {@inheritDoc}*/SortedMap<K,V> headMap(K toKey);/*** 等价于 tailMap(fromKey, true)* @throws ClassCastException       {@inheritDoc}* @throws NullPointerException     {@inheritDoc}* @throws IllegalArgumentException {@inheritDoc}*/SortedMap<K,V> tailMap(K fromKey);
}

        NavigableMap 的这些方法使得对有序映射的操作更加灵活和方便,可以轻松实现查找、子集和导航等操作。Java 中的 TreeMapNavigableMap 接口的一个常见实现

三,TreeMap

        TreeMap 是 NavigableMap 的子类,并且是一颗通过红黑树实现 NavigableMap。

 

3.1 TreeMap 继承结构

package java.util;
public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{/** 忽略代码 */}

 

3.2 TreeMap 属性

public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{/** 比较器,用于 key 排序 */@SuppressWarnings("serial")private final Comparator<? super K> comparator;/** TreeMap 的根节点,毕竟是一颗红黑树 */private transient Entry<K,V> root;/** 当前 TreeMap 的元素数量大小 */private transient int size = 0;/** 当前集合修改次数 */private transient int modCount = 0;/** 忽略其他代码 */
}

3.3 TreeMap 构造器

【无参构造】默认指定比较器,默认使用key的自然排序

    public TreeMap() {comparator = null;}

【单参构造】指定比较器进行创建

    public TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;}

【单参构造】指定元素映射集进行创建

    public TreeMap(Map<? extends K, ? extends V> m) {comparator = null;putAll(m);}

 【单参构造】指定SortedMap 元素集进行构造,并且直接使用 SortedMap的比较器

    public TreeMap(SortedMap<K, ? extends V> m) {comparator = m.comparator();try {buildFromSorted(m.size(), m.entrySet().iterator(), null, null);} catch (java.io.IOException | ClassNotFoundException cannotHappen) {}}

3.4 TreeMap 内部类

3.4.1 Values

        Values 是 TreeMap 中所有 value 的视图集合。

3.4.2 KeySet

        KeySet 是 TreeMap 中所有 key 的视图集合,类型为 Set 集合,原因是 key 是不允许有重复的;该类还实现NavigableSet 意味着同样丰富的导航视图方法

3.4.3 EntrySet

        key 有对应的视图,value 也有对应的视图,剩下就是key-value 的映射键值对没有对应的视图,所以EntrySet 就是 TreeMap 中所有映射键值对的视图集合。但是 TreeMap 本身就不是一个映射键值对的集合吗?为什么其内部还要在追加一个 EntrySet 视图集合??? EntrySet 视图集合的重点在于视图,一般视图都是重点在可读,也就是在迭代,查询等业务中使用到的。有一些特殊情况,也会提高一两个写的方法。比如下面的删除。

3.4.5 相关集合迭代器

3.4.5.1 PrivateEntryIterator 迭代器

        privateEntryIterator 迭代器,是 TreeMap 所有迭代器的基类。

   

3.4.5.2 ValueIterator 迭代器

        value 的迭代器,直接逐个迭代到最后一个为止        

3.4.5.3 KeyIterator 迭代器

          
3.4.5.4 EntryIterator 迭代器

3.4.5.5 DescendingKeyIterator 倒排 key 迭代器

 

3.4.6  相关子集Map

3.4.7 相关分割器

3.4.8 Entry 映射实体类 (红黑树节点)

    static final class Entry<K,V> implements Map.Entry<K,V> {K key; // key 真正元素V value; // value 真正元素Entry<K,V> left; // 左节点Entry<K,V> right; // 右节点Entry<K,V> parent; // 父节点boolean color = BLACK; // 红黑树颜色,默认黑色Entry(K key, V value, Entry<K,V> parent) {this.key = key;this.value = value;this.parent = parent;}public K getKey() {return key;}public V getValue() {return value;}public V setValue(V value) {V oldValue = this.value;this.value = value;return oldValue;}public boolean equals(Object o) {return o instanceof Map.Entry<?, ?> e&& valEquals(key,e.getKey())&& valEquals(value,e.getValue());}public int hashCode() {int keyHash = (key==null ? 0 : key.hashCode());int valueHash = (value==null ? 0 : value.hashCode());return keyHash ^ valueHash;}public String toString() {return key + "=" + value;}}

3.5 TreeMap 新增业务

3.5.1 put(key, value)

        新增的key-value键值对,键值冲突进行替换旧键值

    public V put(K key, V value) {return put(key, value, true);}

3.5.2 putIfAbsent(key, value)

       新增的key-value键值对,键值冲突不替换旧键值

    @Overridepublic V putIfAbsent(K key, V value) {return put(key, value, false);}

 3.5.3 put(key, value, replaceOld)

        新增的key-value键值对,键值冲突替换不替换旧键值由replaceOld决定

/**** @param key   要新增的key* @param value 要新增的value* @param replaceOld 是否替换旧的值 true - 替换 | false - 不替换*/
private V put(K key, V value, boolean replaceOld) {Entry<K,V> t = root;// 如果树是空的(即根节点为 null),则调用 addEntryToEmptyMap 方法插入第一个节点,并返回 nullif (t == null) {addEntryToEmptyMap(key, value);return null;}int cmp; // 比较结果Entry<K,V> parent; // 父节点// cpr:比较器,如果有提供比较器,则使用它进行键的比较;否则,使用键的自然顺序进行比较。Comparator<? super K> cpr = comparator;if (cpr != null) { // 使用比较器do {parent = t;// 使用提供的比较器 cpr 进行键的比较cmp = cpr.compare(key, t.key);// 循环遍历树,比较当前键与节点键的大小,决定向左还是向右子树移动。if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;// 如果找到相同的键,根据 replaceOld 参数决定是否替换旧值,并返回旧值else {V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);} else { // 否则使用自然排序比较Objects.requireNonNull(key);@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;do {parent = t;// 使用自然排序进行键的比较cmp = k.compareTo(t.key);// 循环遍历树,比较当前键与节点键的大小,决定向左还是向右子树移动。if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;// 如果找到相同的键,根据 replaceOld 参数决定是否替换旧值,并返回旧值else {V oldValue = t.value;if (replaceOld || oldValue == null) {t.value = value;}return oldValue;}} while (t != null);}// 如果没有找到相同的键,在遍历结束后,根据比较结果 (cmp < 0) 决定新节点插入到父节点的左子树或右子树中。addEntry(key, value, parent, cmp < 0);return null; // 调用 addEntry 方法进行插入,并返回 null}

3.5.4 addEntryToEmptyMap(key, value)

        addEntryToEmptyMap 方法在 TreeMap 为空时用于添加第一个节点(即根节点)。这是一个私有方法,只在 TreeMap 内部使用。 

    private void addEntryToEmptyMap(K key, V value) {compare(key, key); // 目的是对键进行类型检查,并确保键非空root = new Entry<>(key, value, null);// 更新树的大小和修改计数size = 1;modCount++;}

3.5.5 addEntry(key, value, parent, addToLeft)

    /*** 新增新的Entry* @param key    要插入的key* @param value  要插入的value* @param parent 新节点的父节点* @param addToLeft 新节点是否应该作为父节点的左子节点*/private void addEntry(K key, V value, Entry<K, V> parent, boolean addToLeft) {// 将数据封装成一个Entry节点类Entry<K,V> e = new Entry<>(key, value, parent);if (addToLeft) // 如果该节点是父节点的左子节点则加在左边parent.left = e;else // 否则是右子节点parent.right = e;/** 调用 fixAfterInsertion 方法,以确保插入新节点后树仍然满足红黑树的性质* fixAfterInsertion 方法会调整节点的颜色和位置,以保持树的平衡性。*/fixAfterInsertion(e);// 更新树的大小和修改计数size++;modCount++;}

3.6 TreeMap 删除业务

3.6.1 remove(key)

        根据 key 进行删除 Entry 映射实体类

    public V remove(Object key) {Entry<K,V> p = getEntry(key);if (p == null)return null;V oldValue = p.value;deleteEntry(p);return oldValue;}

3.6.2 deleteEntry(e)

        deleteEntry 方法用于从 TreeMap 中删除一个节点。该方法需要确保在删除节点后,树仍然保持红黑树的性质

    private void deleteEntry(Entry<K,V> p) {// 1. 更新修改计数和大小modCount++; // 增加 modCount 以记录对树结构的修改次数size--; // 减少 size,因为我们将删除一个节点// 2. 处理有两个子节点的节点if (p.left != null && p.right != null) {// 如果节点 p 有两个子节点,则找到它的后继节点 sEntry<K,V> s = successor(p);// 将后继节点 s 的键和值复制到节点 pp.key = s.key;p.value = s.value;// 将 p 更新为后继节点 s,以便在后续步骤中删除 sp = s;}/** 3. 找到替换节点:如果 p 有左子节点,则 replacement 为 p 的左子节点。* 否则,如果 p 有右子节点,则 replacement 为 p 的右子节点。*/Entry<K,V> replacement = (p.left != null ? p.left : p.right);if (replacement != null) { // 3.1 如果替换节点存在,首先将其父节点指向 p 的父节点replacement.parent = p.parent;// 3.2 如果 p 是根节点,则将 root 设置为替换节点if (p.parent == null)root = replacement;// 3.3 否则,将替换节点链接到 p 的父节点(作为左子节点或右子节点)else if (p == p.parent.left)p.parent.left  = replacement;elsep.parent.right = replacement;// 3.4 将 p 的左右子节点和父节点都置为 nullp.left = p.right = p.parent = null;// 3.5 如果 p 的颜色是黑色,则调用 fixAfterDeletion 方法修复红黑树的性质。if (p.color == BLACK)fixAfterDeletion(replacement);// p 没有替换节点且是根节点的情况} else if (p.parent == null) { root = null; // 如果 p 没有子节点且是根节点,则将 root 设置为 null。} else { // p 没有替换节点且不是根节点的情况// 如果 p 没有子节点且不是根节点,首先检查 p 的颜色。// 如果 p 的颜色是黑色,则调用 fixAfterDeletion 方法修复红黑树的性质。if (p.color == BLACK)fixAfterDeletion(p);// 将 p 从父节点的左子节点或右子节点中移除,并将 p 的父节点置为 null。if (p.parent != null) {if (p == p.parent.left)p.parent.left = null;else if (p == p.parent.right)p.parent.right = null;p.parent = null;}}}

3.7 TreeMap 查询业务

    public V get(Object key) {Entry<K,V> p = getEntry(key);return (p==null ? null : p.value);}

3.8 TreeMap的 NavigableMap 的 lowerEntry(key)

    public Map.Entry<K,V> lowerEntry(K key) {return exportEntry(getLowerEntry(key));}
    final Entry<K,V> getLowerEntry(K key) {Entry<K,V> p = root;// 进行循环比较while (p != null) {int cmp = compare(key, p.key);// key 和 p 比较  大于0 则key在 p 的右边if (cmp > 0) {if (p.right != null)p = p.right;elsereturn p;} else { // 否则相反,在左边if (p.left != null) {p = p.left;} else {Entry<K,V> parent = p.parent;Entry<K,V> ch = p;while (parent != null && ch == parent.left) {ch = parent;parent = parent.parent;}return parent;}}}return null;}

        其他的相关导航方法也都是类似。

2.9 TreeMap 与 HashMap 区别

1. 底层数据结构

  • TreeMap:
    • 底层使用红黑树(Red-Black Tree)实现。
  • HashMap:
    • 底层使用哈希表(Hash Table)实现。

2. 排序

  • TreeMap:
    • 维护键的自然顺序(或者通过提供的 Comparator 进行排序)。
    • 迭代时,元素是按升序排列的。
  • HashMap:
    • 不保证顺序,键值对的顺序是不可预测的。

3. 性能

  • TreeMap:
    • 插入、删除和查找操作的时间复杂度为 O(log⁡n)O(\log n)O(logn)。
  • HashMap:
    • 插入、删除和查找操作的平均时间复杂度为 O(1)O(1)O(1),但在最坏情况下为 O(n)O(n)O(n)(例如所有键都碰撞在同一个桶中)。

4. 空间复杂度

  • TreeMap:
    • 相对来说空间开销较大,因为需要维护红黑树的结构。
  • HashMap:
    • 空间利用率较高,因为哈希表通常只存储键值对和少量的元数据。

5. null 值

  • TreeMap:
    • 不允许 null 键,但允许 null 值。
  • HashMap:
    • 允许 null 键和 null 值。

6. 使用场景

  • TreeMap:
    • 适用于需要键有序的情况,例如需要按顺序遍历键值对,或者需要范围查找(如子集、头部集或尾部集)。
  • HashMap:
    • 适用于对顺序没有要求的情况,只需快速插入、删除和查找操作。

相关文章:

Java-01-源码篇-04集合-05-SortedMap NavigableMap TreeMap

目录 一&#xff0c;SortedMap 二&#xff0c;NavigableMap 三&#xff0c;TreeMap 3.1 TreeMap 继承结构 3.2 TreeMap 属性 3.3 TreeMap 构造器 3.4 TreeMap 内部类 3.4.1 Values 3.4.2 KeySet 3.4.3 EntrySet 3.4.5 相关集合迭代器 3.4.5.1 PrivateEntryIterato…...

拥抱 AGI:PieDataCS 引领云原生数据计算系统新范式

自2023年后&#xff0c;人工智能技术进入了一个更为成熟和广泛应用的阶段&#xff0c;人工通用智能&#xff08;AGI&#xff09;这一概念也成为了科技界和产业界热议的焦点。本文将结合 AGI 时代背景&#xff0c;从架构设计到落地实践&#xff0c;详细介绍拓数派云原生数据计算…...

开放式耳机哪个品牌好?开放式耳机推荐

开放式耳机因其独特的设计&#xff0c;提供了更自然的听音体验和更好的环境声音感知&#xff0c;尤其适合长时间佩戴和户外运动使用&#xff0c;下面来推荐几款表现出色的开放式耳机&#xff1a; 悠律ringbuds pro凝声环&#xff08;499元&#xff09;&#xff1a;凭借时尚潮流…...

kubernetes dashboard安装

1.查看符合自己版本的kubernetes Dashboard 比如我使用的是1.23.0版本 https://github.com/kubernetes/dashboard/releases?page5 对应版本 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml修改对应的yaml,…...

【MySQL】3.表的操作

表的操作 一.创建表二.查看表三.修改表四.删除表 一.创建表 create table [if not exists] tb_name( field1 datatype comment 说明, field2 datatype, field3 datatype) charsetutf8 collateutf8_gerenal_ci engineInnoDB//表的编码集&#xff0c;校验集如果不指定&#xff…...

十一、作业

1.从大到小输出 写代码将三个整数数按从大到小输出。 void Swap(int* px, int* py) {int tmp *px;*px *py;*py tmp;} int main() {int a 0;int b 0;int c 0;scanf("%d %d %d", &a, &b, &c);int n 0;if (a<b){Swap(&a, &b);}if (a &l…...

关于C#在WPF中如何使用“抽屉”控件

关于C#在WPF中如何使用“抽屉”控件 1.前提准备2.XAML代码3.对应的C#代码4.显示效果 1.前提准备 需要引用MaterialDesign控件库&#xff0c;关于如何引用&#xff0c;请参照文章——关于C#如何引用MaterialDesign控件库 2.XAML代码 <Window x:Class"MaterialDesign_…...

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述&#xff1a;Xrdp是一个微软远程桌面协议&#xff08;RDP&#xff09;的开源实现&#xff0c;它允许我们通过图形界面控制远程系统。这里使…...

ExcelVBA运用Excel的【条件格式】(二)

ExcelVBA运用Excel的【条件格式】&#xff08;二&#xff09; 前面知识点回顾 1. 访问 FormatConditions 集合 Range.FormatConditions 2. 添加条件格式 FormatConditions.Add 方法 语法 表达式。添加 (类型、 运算符、 Expression1、 Expression2) 3. 修改或删除条件…...

肠道和大脑中犬尿氨酸代谢途径的紊乱

新出现的证据表明&#xff0c;肠道微生物群可能与宿主大脑相互作用&#xff0c;并在神经精神疾病的发病机制中发挥关键作用。然而&#xff0c;抑郁症中微生物-肠-脑轴相互作用的潜在机制仍不清楚。在这项研究中&#xff0c;建立了慢性约束应激 (CRS) 的小鼠模型&#xff0c;以研…...

vue通过后台返回的数字显示不同的文字内容,多个内容用、隔开

后台返回的数据 显示效果&#xff1a; html&#xff1a; <el-table-columnalign"center"label"使用过的小程序"width"124"v-if"activeTab 0"><template #default"scope"><divv-for"(item, index) in s…...

Flume工具详解

Flume是一个由Apache提供的开源日志收集系统&#xff0c;最初由Cloudera贡献。它以其高可用性、高可靠性和分布式特性而著称&#xff0c;被广泛应用于海量日志的采集、聚合和传输。以下是对Flume工具的详细解析&#xff1a; 一、概述 功能定位&#xff1a;Flume主要用于收集、…...

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中&#xff0c;默认关闭了 fileserver 这个应用&#xff08;不过&#xff0c;可以在conf/jetty.xml 中开启&#xff09;&#xff1b;在 5.14.0 版本后&#xff0c;彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ …...

上海市计算机学会竞赛平台2024年6月月赛丙组超级奇数

题目描述 如果一个十进制数的所有数字都是奇数&#xff0c;则称之为超级奇数&#xff0c;例如 35733573 就是一个超级奇数&#xff0c;而 3141531415 不是。按照从小到大排序&#xff0c;前几名的超级奇数为 1,3,5,7,9,11,13,15,17,⋯1,3,5,7,9,11,13,15,17,⋯ 给定一个超级…...

速盾:cdn业务优化

CDN&#xff08;Content Delivery Network&#xff09;是一种基于互联网的分布式网络架构&#xff0c;旨在提供更快速、可靠的内容传输服务。它通过将内容分发至多个节点&#xff0c;使用户可以从离他们更近的节点获取内容&#xff0c;从而提高访问速度和用户体验。 然而&…...

重生奇迹mu的地图名

地图之一&#xff1a;勇者大陆 勇者大陆地处奇迹大陆中央。终年阴雨连绵&#xff0c;气候潮湿闷热。植物由充满黑暗阴森气氛的草地所构成。这里的NPC数量是所有地图中最多的。因为地步交通要冲&#xff0c;所以也是玩家聚集最多的地方。 这里是剑士、魔法师、魔剑士和圣导师初…...

【CSS】缩写属性gap

在CSS Grid Layout&#xff08;网格布局&#xff09;和Flexbox&#xff08;弹性盒布局&#xff09;中&#xff0c;gap 是一个缩写属性&#xff0c;用于同时设置行间隙&#xff08;gutter&#xff09;和列间隙&#xff08;在Flexbox中通常称为“交叉轴间隙”&#xff09;的大小。…...

Perl 语言开发(八):子程序和模块

目录 1. 引言 2. 子程序的基本概念与用法 2.1 子程序的定义和调用 2.2 传递参数 2.3 返回值 2.4 上下文和返回值 3. 模块的基本概念与用法 3.1 模块的定义 3.2 使用模块 3.3 导出符号 3.4 模块的文件结构和命名 4. 实际应用中的子程序与模块 4.1 子程序参数验证与…...

自注意力机制和多头注意力机制区别

Ref&#xff1a;小白看得懂的 Transformer (图解) Ref&#xff1a;一文彻底搞懂 Transformer&#xff08;图解手撕&#xff09; 多头注意力机制&#xff08;Multi-Head Attention&#xff09;和自注意力机制&#xff08;Self-Attention&#xff09;是现代深度学习模型&#x…...

数据结构第14节 加权图

加权图是在图论中一种更为复杂的图结构&#xff0c;它扩展了无向图和有向图的概念&#xff0c;通过给图中的边附加一个数值来表示边的某种属性&#xff0c;如成本、距离、容量或相似度等。这个数值被称为边的“权重”。 定义 加权图可以被形式化地定义为一个三元组 ( G (V, …...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...