滚雪球学Java(67):深入理解 TreeMap:Java 中的有序键值映射表

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录

  • 前言
  • 摘要
  • TreeMap
    • 概述
    • 源代码解析
    • 应用场景案例
    • 优缺点分析
      • 优点
      • 缺点
    • 类代码方法介绍
      • 构造方法
      • 读取方法
      • 写入方法
      • 转换方法
    • 测试用例
      • 测试用例
      • 测试结果
      • 测试代码分析
      • 性能测试
        • 测试代码演示
        • 测试结果
        • 测试代码分析
    • 结论
  • 总结
    • 附录源码
  • ☀️建议/推荐你
  • 📣关于我

前言

  在 Java 编程中,我们经常需要使用到键值映射表这种数据结构。其中,HashMap 是最常用的一种,它能够以 O(1) 的时间复杂度完成插入、查找、删除等操作。但是,HashMap 并不能对键进行排序,因此如果我们需要按有序方式来保存键值对,就需要使用到 TreeMap了。

摘要

  本篇文章将深入介绍 TreeMap 的原理、源码实现、应用场景、优缺点以及相关测试用例。

TreeMap

概述

  TreeMap 是一种基于红黑树实现的有序键值映射表。它实现了 Map 接口,并且根据键的自然排序或者根据一个 Comparator 进行排序。在 TreeMap 中,键值对是按照键进行排序的,因此遍历 TreeMap 时得到的键值对是有序的。

源代码解析

TreeMap 的主要实现类是 TreeMap 类。我们来看一下它的源码实现。

public class TreeMap<K,V> extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable {
    
    // 省略了一些常量和字段的定义
    
    public TreeMap() {
        comparator = null;
    }
    
    public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
    
    // 省略了一些构造方法的定义
    
    public Set<Map.Entry<K,V>> entrySet() {
        return new EntrySet();
    }
    
    // 省略了一些方法的定义
    
}

  从代码中可以看出,TreeMap 实现了 Map 接口和 NavigableMap 接口,并且继承了 AbstractMap。它也提供了多个构造方法,可以根据需要选择。

  如下是部分源码截图:

在这里插入图片描述

  下面我们来看一下 TreeMap 中最重要的实现类 Entry。Entry 类表示 TreeMap 中的一个键值对,它包含了键和值两个属性,其中键是有序的。

static final class Entry<K,V> implements Map.Entry<K,V> {
    K key;
    V value;
    Entry<K,V> left = null;
    Entry<K,V> right = null;
    Entry<K,V> parent;
    boolean color = BLACK;

    /**
     * Make a new cell with given key, value, and parent, and with
     * {@code null} child links, and BLACK color.
     */
    Entry(K key, V value, Entry<K,V> parent) {
        this.key = key;
        this.value = value;
        this.parent = parent;
    }

    // 省略了一些方法的定义
}

  Entry 类中定义了一个 boolean 类型的 color 属性,它表示该节点的颜色,用于红黑树的平衡操作。Entry 类中还包含了 left、right、parent 三个指针,用于指向该节点的左子节点、右子节点和父节点。

  如下是部分源码截图:

在这里插入图片描述

应用场景案例

  以下是使用 TreeMap 的一个实际案例。我们有一个成绩表,需要按照学生姓名的字典序进行排序,而 TreeMap 刚好可以满足这个需求。

import java.util.*;

public class ScoreTable {
    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("Tom", 85);
        map.put("Jack", 92);
        map.put("Lily", 76);

        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

运行结果如下:

Jack : 92
Lily : 76
Tom : 85

  从运行结果可以看出,TreeMap 把学生姓名按照字典序排序后输出。

优缺点分析

以下是 TreeMap 的优缺点分析。

优点

  1. TreeMap 可以对键进行排序,因此遍历 TreeMap 时得到的键值对是有序的。
  2. TreeMap 可以根据自然顺序或者自定义比较器进行排序。
  3. TreeMap 的内部实现使用红黑树,因此插入、查找、删除等操作的时间复杂度为 O(log n)。

缺点

  1. TreeMap 要求键是可比较的,因此不能存储自定义对象类型的键。
  2. TreeMap 的内部结构是红黑树,它比 HashMap 内部的哈希表结构要占用更多的内存,因此 TreeMap 的空间复杂度要高于 HashMap。
  3. 对于频繁的插入、删除操作,TreeMap 的效率不如 HashMap 高。

类代码方法介绍

以下是 TreeMap 类中一些常用的方法的介绍。

构造方法

   // 构造一个空的 TreeMap
   public TreeMap()

   // 构造一个 TreeMap,并指定一个比较器进行排序
   public TreeMap(Comparator<? super K> comparator)

代码拓展

  这段代码是 Java 中 TreeMap 类的构造函数,用于创建 TreeMap 对象。

  第一个构造函数 public TreeMap() 创建一个空的 TreeMap,没有指定任何比较器,默认使用自然排序(即实现 Comparable 接口)。

  第二个构造函数 public TreeMap(Comparator<? super K> comparator) 创建一个 TreeMap 对象,并指定一个特定的比较器来对键进行排序。Comparator 参数是用于比较键的比较器,它可以是任何实现了 Comparator 接口的类或者 lambda 表达式。通过这个构造函数,我们可以根据自己的需要自定义排序规则。

  注意,TreeMap 的键必须实现 Comparable 接口或者在创建 TreeMap 时指定一个 Comparator 比较器,否则会抛出 ClassCastException 异常。

读取方法

   // 获取 TreeMap 的大小
   public int size()

   // 判断 TreeMap 是否为空
   public boolean isEmpty()

   // 获取 TreeMap 中键为 key 对应的值
   public V get(Object key)
   
   // 获取 TreeMap 中比键 key 大的最小键值对
   public Map.Entry<K,V> higherEntry(K key)
   
   // 获取 TreeMap 中比键 key 大的最小键
   public K higherKey(K key)
   
   // 获取 TreeMap 中比键 key 小的最大键值对
   public Map.Entry<K,V> lowerEntry(K key)
   
   // 获取 TreeMap 中比键 key 小的最大键
   public K lowerKey(K key)
   
   // 获取 TreeMap 中键值比 key 大的最小键值对,如果 TreeMap 为空则返回 null
   public Map.Entry<K,V> ceilingEntry(K key)
   
   // 获取 TreeMap 中键值比 key 大的最小键,如果 TreeMap 为空则返回 null
   public K ceilingKey(K key)
   
   // 获取 TreeMap 中键值比 key 小的最大键值对,如果 TreeMap 为空则返回 null
   public Map.Entry<K,V> floorEntry(K key)
   
   // 获取 TreeMap 中键值比 key 小的最大键,如果 TreeMap 为空则返回 null
   public K floorKey(K key)
   
   // 获取 TreeMap 中最小的键值对
   public Map.Entry<K,V> firstEntry()
   
   // 获取 TreeMap 中最小的键
   public K firstKey()
   
   // 获取 TreeMap 中最大的键值对
   public Map.Entry<K,V> lastEntry()
   
   // 获取 TreeMap 中最大的键
   public K lastKey()

代码拓展

  这段代码是 TreeMap 类中的一些常用方法,具体说明如下:

  • size():返回 TreeMap 的大小(即键值对个数)。
  • isEmpty():判断 TreeMap 是否为空,如果为空则返回 true,否则返回 false。
  • get(key):返回键为 key 对应的值,如果 key 不存在则返回 null。
  • higherEntry(key):返回 TreeMap 中比键 key 大的最小键值对,如果不存在则返回 null。
  • higherKey(key):返回 TreeMap 中比键 key 大的最小键,如果不存在则返回 null。
  • lowerEntry(key):返回 TreeMap 中比键 key 小的最大键值对,如果不存在则返回 null。
  • lowerKey(key):返回 TreeMap 中比键 key 小的最大键,如果不存在则返回 null。
  • ceilingEntry(key):返回 TreeMap 中键值比 key 大的最小键值对,如果 TreeMap 为空则返回 null。
  • ceilingKey(key):返回 TreeMap 中键值比 key 大的最小键,如果 TreeMap 为空则返回 null。
  • floorEntry(key):返回 TreeMap 中键值比 key 小的最大键值对,如果 TreeMap 为空则返回 null。
  • floorKey(key):返回 TreeMap 中键值比 key 小的最大键,如果 TreeMap 为空则返回 null。
  • firstEntry():返回 TreeMap 中最小的键值对,如果 TreeMap 为空则返回 null。
  • firstKey():返回 TreeMap 中最小的键,如果 TreeMap 为空则抛出 NoSuchElementException 异常。
  • lastEntry():返回 TreeMap 中最大的键值对,如果 TreeMap 为空则返回 null。
  • lastKey():返回 TreeMap 中最大的键,如果 TreeMap 为空则抛出 NoSuchElementException 异常。

  这些方法可以帮助我们操作 TreeMap 中的键值对,常用于查询和遍历操作。

写入方法

   // 插入键值对
   public V put(K key, V value)
   
   // 删除键值对
   public V remove(Object key)
   
   // 清空 TreeMap
   public void clear()

代码拓展

  这是针对 Java 中的 TreeMap 类进行的方法分析:

  1. put(K key, V value): 该方法用于将指定的键值对插入到 TreeMap 中。如果 TreeMap 中已经有该键,则用新的值替换旧的值,并返回旧的值;如果 TreeMap 中没有该键,则插入该键值对,并返回 null。

  2. remove(Object key): 该方法用于从 TreeMap 中删除指定的键及其对应的值。如果 TreeMap 中有该键,则删除该键值对,并返回其对应的值;如果 TreeMap 中没有该键,则返回 null。

  3. clear(): 该方法用于清空 TreeMap 中的所有键值对。调用该方法后,TreeMap 的大小变为 0,但 TreeMap 仍然存在。

转换方法

   // 返回 TreeMap 的副本
   public Object clone()

   // 返回 TreeMap 中键的有序集合
   public Set<K> keySet()

   // 返回 TreeMap 中键值对的集合
   public Set<Map.Entry<K, V>> entrySet()

   // 返回 TreeMap 中值的无序集合
   public Collection<V> values()

代码拓展

  这段代码是 Java 中 TreeMap 类的几个常用方法的声明,具体解释如下:

  1. public Object clone() 方法会返回一个 TreeMap 的副本,也就是一个新的 TreeMap,其中包含与原始 TreeMap 相同的键值对。这个方法可以用来创建原始 TreeMap 的副本,以在对副本进行操作时不影响原始 TreeMap。

  2. public Set<K> keySet() 方法会返回 TreeMap 中所有键的有序集合。该方法可以用于遍历 TreeMap 中的所有键。

  3. public Set<Map.Entry<K, V>> entrySet() 方法会返回 TreeMap 中所有键值对的集合。集合中每个元素都是一个 Map.Entry 对象,包含键和相应的值。该方法可以用于遍历 TreeMap 中的所有键值对。

  4. public Collection<V> values() 方法会返回 TreeMap 中所有值的无序集合。该方法可以用于遍历 TreeMap 中的所有值。

  需要注意的是,TreeMap 的键必须是可比较的对象,并且按照键的自然顺序进行排序。如果要使用自定义比较器对键进行排序,可以使用 TreeMap 的另一个构造函数,该构造函数接受一个实现了 Comparator 接口的比较器对象作为参数。

测试用例

以下是针对 TreeMap 的测试用例。

测试用例

测试 TreeMap 的基本操作,包括插入、删除和遍历。

package com.demo.javase.day67;

import java.util.Map;
import java.util.TreeMap;

/**
 * @Author bug菌
 * @Date 2023-11-06 12:10
 */
public class TreeMapTest {

    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("Tom", 85);
        map.put("Jack", 92);
        map.put("Lily", 76);
        map.put("Bob", 88);

        System.out.println("Initial TreeMap:");
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }

        map.remove("Lily");

        System.out.println("\nAfter removing Lily:");
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

运行结果如下:

Initial TreeMap:
Jack : 92
Lily : 76
Bob : 88
Tom : 85

After removing Lily:
Bob : 88
Jack : 92
Tom : 85

具体执行截图如下:

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  此代码是一个简单的关于 TreeMap 的使用示例。 TreeMap 是基于红黑树实现的,可以保证有序性,且插入、删除、查找的时间复杂度是 O(log n)。

  该代码创建了一个 TreeMap 对象,键类型为 String,值类型为 Integer。然后向 TreeMap 中添加了四个键值对。接着打印出初始 TreeMap 中的所有键值对。再移除 key 为 “Lily” 的键值对,最后再次打印出移除后的 TreeMap 中的所有键值对。

运行结果如下:

Initial TreeMap:
Jack : 92
Lily : 76
Bob : 88
Tom : 85

After removing Lily:
Bob : 88
Jack : 92
Tom : 85

  可以看到,初始 TreeMap 中所有键值对的顺序是按照键的自然顺序进行排序的(即按照字母顺序)。而移除 key 为 “Lily” 的键值对后,再次打印出的所有键值对的顺序仍然是有序的。这证明 TreeMap 确实有序,且移除操作也能保持 TreeMap 的顺序性。

性能测试

测试 TreeMap 的性能,包括插入、查找和删除操作的时间消耗。

测试代码演示
package com.demo.javase.day67;

import java.util.TreeMap;

/**
 * @Author bug菌
 * @Date 2023-11-06 12:12
 */
public class TreeMapPerformanceTest {
    private static final int SIZE = 1000000;

    public static void main(String[] args) {
        System.out.println("TreeMap Performance Test:");
        System.out.println("-------------------------");

        TreeMap<Integer, Integer> map = new TreeMap<>();

        // Insert test
        long start = System.currentTimeMillis();

        for (int i = 0; i < SIZE; i++) {
            map.put(i, i);
        }

        long end = System.currentTimeMillis();

        System.out.println("Insert " + SIZE + " elements time: " + (end - start) + "ms");

        // Search test
        start = System.currentTimeMillis();

        for (int i = 0; i < SIZE; i++) {
            map.get(i);
        }

        end = System.currentTimeMillis();

        System.out.println("Search " + SIZE + " elements time: " + (end - start) + "ms");

        // Delete test
        start = System.currentTimeMillis();

        for (int i = 0; i < SIZE; i++) {
            map.remove(i);
        }

        end = System.currentTimeMillis();

        System.out.println("Delete " + SIZE + " elements time: " + (end - start) + "ms");
    }
}
测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

运行结果如下:

TreeMap Performance Test:
-------------------------
Insert 1000000 elements time: 148ms
Search 1000000 elements time: 64ms
Delete 1000000 elements time: 65ms

在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这是一个测试TreeMap性能的Java程序,主要进行了三项测试:

  1. 插入测试:向TreeMap中插入1000000个元素,并记录时间;
  2. 查找测试:在TreeMap中查找1000000个元素,并记录时间;
  3. 删除测试:从TreeMap中删除1000000个元素,并记录时间。

  通过这些测试,可以评估TreeMap在插入、查找和删除操作时的性能。

结论

  本文对 Java 中的有序键值映射表 TreeMap 进行了详细的介绍。我们讲解了 TreeMap 的原理、源码实现、应用场景、优缺点以及相关测试用例。通过本文的学习,我们能够更加深入地理解 TreeMap,以及在实际开发中如何正确地使用它。

总结

  本篇文章主要介绍了 Java 中的有序键值映射表 TreeMap,包括其原理、源码实现、应用场景、优缺点以及相关测试用例。从文章中可以了解到,TreeMap 是一种基于红黑树实现的有序键值映射表,可以根据键进行排序,遍历 TreeMap 时得到的键值对是有序的。同时,TreeMap 的内部实现使用红黑树,因此插入、查找、删除等操作的时间复杂度为 O(log n)。文章还提供了针对 TreeMap 的测试用例,对其进行性能测试,以评估 TreeMap 在插入、查找和删除操作时的性能。

  …
  好啦,这期的内容就基本接近尾声啦,若你想学习更多,可以参考这篇专栏总结《「滚雪球学Java」教程导航帖》,本专栏致力打造最硬核 Java 零基础系列学习内容,🚀打造全网精品硬核专栏,带你直线超车;欢迎大家订阅持续学习。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++学习之list容器

C++ list基本概念 在C++中,std::list是一个双向链表(doubly linked list)容器,它包含在 <list> 头文件中。下面是一些关于C++ std::list的基本概念: 双向链表结构:std::list是由多个节点组成的双向链表结构,每个节点包含数据元素和指向前一个节点和后一个节点的指…

ABCDE联合创始人BMAN确认出席Hack .Summit() 2024香港Web3盛会

ABCDE联合创始人和普通合伙人BMAN确认出席Hack .Summit() 2024&#xff01; ABCDE联合创始人和普通合伙人BMAN确认出席由 Hack VC 主办&#xff0c;并由 AltLayer 和 Berachain 联合主办&#xff0c;与 SNZ 和数码港合作&#xff0c;由 Techub News 承办的Hack.Summit() 2024区…

穿越Redis单线程迷雾:从面试场景到技术内核的解读

目录 ​编辑 前言 Redis中的多线程 I/O多线程 Redis中的多进程 结论 延伸阅读 前言 很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案…

Kotlin学习 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

C++ Primer 笔记(总结,摘要,概括)——第4章 表达式

目录 4.1 基础 4.1.1 基本概念 4.1.2 优先级与结合律 4.1.3 求值顺序 4.2 算术运算符 4.3 逻辑和关系运算符 4.4 赋值运算符 4.5 递增和递减运算符 4.6 成员访问运算符 4.7 条件运算符 4.8 位运算符 4.9 sizeof运算符 4.10 逗号运算符 4.11 类型转换 4.11.1 算数转换…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

day3:界面跳转,qss与对话框

思维导图 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配…

成像光谱遥感技术中的AI革命:ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能在解…

【Effective Objective - C】—— 系统框架

【Effective Objective - C】—— 系统框架 47.熟悉系统框架CoreFoundation框架其他框架要点 48. 多用块枚举&#xff0c;少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点 49.对自定义其内存管理语义的collection使用无缝桥接要点 50.构…

虚拟机器centos7无法识别yum 命令异常处理笔记

问题现象 启动虚拟机后执行ipconfig 提示未找到该命令,然后执行yum install -y net-tools提示 curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"的错误 [roothaqdoop~]# ifconfig -bash: ifconfig: 未找到命令 [roothadoop~]# yum install …

【QT 5 +Linux下软件桌面快捷方式+qt生成软件创建桌面图标+学习他人文章+第二篇:编写桌面文件.desktop】

【QT 5 Linux下软件桌面快捷方式qt生成软件创建桌面图标学习他人文章第二篇&#xff1a;编写桌面文件.desktop】 1、前言2、实验环境3、自我学习总结-本篇总结1、新手的疑问&#xff0c;做这件事目的2、了解.desktop3、三个关键目录以及文件编写1、目录&#xff1a;/opt/2、目录…

ChatGPT回答模式

你发现了吗&#xff0c;ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时&#xff0c;不仅仅给出…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

T-Dongle-S3开发笔记——移植LVGL

添加lvgl组件 idf.py add-dependency lvgl/lvgl>8.* 新建终端执行命令后出现了新的文件&#xff1a; 清除再编译后才会出现lvgl库 优化为本地组件 以上方式修改了组件文件内容重新编译后文件又会变回去。 所以我们要把lvgl变成本地组件 1、要把 idf_component.yml 文…

【Python】遇到的一些小问题及解决办法汇总

【工具】&#xff1a;pycharm 【环境】&#xff1a;Windows 一、数据集路径导入报错 【错误提示】&#xff1a; SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape 如图&#xff1a; 【原因分析】&a…

visual studio2022使用tensorRT配置

只记录tensorRT在vs中使用时的配置&#xff0c;下载和安装的 文章主页自己寻找。 下载好TensorRT和对应的cuda之后&#xff0c;把tensorRT的锻炼了和lib文件复制粘贴到cuda对应的文件夹中&#xff0c;以方便调用。 完成之后打开vs新建一个tensorRT的项目&#xff0c;然后开始配…

文件上传漏洞--Upload-labs--Pass20--数组绕过

一、漏洞原理 漏洞来源&#xff1a;count()函数漏洞。 现自定义一个数组 arr[]&#xff0c;定义arr[0]1,arr[3]2, 此时count(arr)的值为2&#xff0c;则arr[count[arr]]即为arr[2]&#xff0c;但是arr[2]未定义&#xff0c;即为一个空值&#xff0c;若使用count()函数的本意是…

Windows10和Ubuntu22.04双系统安装

概要&#xff1a; 本篇演示Windows10和Ubuntu22.04双系统的安装&#xff0c;先安装Windows10&#xff0c;再安装Ubuntu22.04。 先安装Ubuntu22.04&#xff0c;后安装Windows10见&#xff1a; Ubuntu22.04和Windows10双系统安装-CSDN博客 一、说明 1、电脑 笔者的电脑品牌…

PhpStorm 2023:卓越的代码质量,无与伦比的调试体验 mac/win版

JetBrains PhpStorm 2023是一款针对PHP开发者的强大集成开发环境(IDE)&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和测试PHP应用程序。 PhpStorm 2023 软件获取 首先&#xff0c;JetBrains PhpStorm 2023具备强大的代码编辑功能&#xff0…