美女做暧暧免费视频网站/福州百度分公司
🌲Java集合类HashTable解析
- 🌲Java集合类HashTable解析
- 摘要
- 引言
- Hashtable是什么?
- Hashtable vs. HashMap:何时使用Hashtable?
- 多线程环境:
- 历史遗留系统:
- 不需要进行特殊操作:
- Hashtable的内部工作原理
- 唯一性约束和键值对
- Hashtable在Java编程中的示例
- Hashtable的性能和复杂度分析
- Hashtable的线程安全性
- 1. 方法级同步
- 2. 效率和性能
- 3. 替代选择
- 4. 其他同步方法
- Hashtable的使用建议和最佳实践
- Hashtable在现代Java框架中的应用
- 1. **遗留系统和老代码库**
- 2. **特殊需求**
- 3. **Spring Framework和其他框架**
- 未来展望:Hashtable的演化和替代品
- 1. **ConcurrentHashMap 和其他并发集合**
- 2. **JDK 中新的数据结构**
- 3. **函数式编程和流式API**
- 4. **非阻塞数据结构**
- 5. **Java内部优化和更新**
- 总结
- 参考资料
博主 默语带您 Go to New World.
✍ 个人主页—— 默语 的博客👦🏻
《java 面试题大全》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨
🌲Java集合类HashTable解析
摘要
在本篇技术博客中,作为博主,我将深入探讨Java中的Hashtable集合类,为你提供全面的了解。我们将从Hashtable的基本概念开始,逐步深入,讨论其内部工作原理、性能、线程安全性,以及在现代Java框架中的应用。还将探讨Hashtable的未来发展趋势和替代选择,以帮助你更好地应用这一重要工具。
引言
Java中的Hashtable是一个重要的集合类,用于存储键值对数据。它提供了一种高效的数据管理方式,但也有一些限制和注意事项。在本文中,我们将从基础开始,深入解析Hashtable,帮助你充分理解其工作原理和在不同情况下的使用场景。
Hashtable是什么?
Hashtable是一种基于哈希表的数据结构,用于存储键值对。它具有高效的数据检索和插入操作,是Java集合框架中的一员。Hashtable通过键的哈希码来快速查找值,因此在查找大量数据时非常高效。
Hashtable通常用于需要快速查找和插入数据的情况,因为它在平均情况下提供了常数时间复杂度的操作。它具有以下特点和用途:
- 键值对存储:Hashtable存储键值对,其中每个键都唯一。可以使用键来查找对应的值,因此它适用于需要将数据与唯一标识符相关联的情况。
- 哈希函数:Hashtable使用哈希函数将键转换为哈希码,这个哈希码确定了存储位置。哈希码的分布应尽量均匀,以确保高效的数据访问。
- 高效的数据操作:Hashtable提供了快速的数据查找操作,通常在常数时间内完成。这使得它适用于大型数据集的数据检索,例如在数据库中使用索引进行快速查询。
- 线程安全:Hashtable是同步的,这意味着多个线程可以同时访问它而不会出现数据竞争问题。然而,这也会导致一些性能开销。在Java中,有一种替代的非同步哈希表叫做HashMap,适用于单线程环境。
- 可序列化:Hashtable可以序列化,因此可以将其保存到文件或通过网络传输,然后再重新加载。
需要注意的是,Hashtable虽然提供了高效的数据操作,但在某些情况下,由于同步性能开销,可能不适用于高并发的应用程序。在这种情况下,可以考虑使用ConcurrentHashMap等其他数据结构。此外,Hashtable不允许存储null键或null值。如果需要存储null值,可以使用HashMap或其他类似的数据结构。
Hashtable是一种经典的数据结构,用于在键值对存储、快速数据查找和插入、线程安全以及可序列化等方面提供了一定的优势。然而,还有一些其他方面需要注意:
- 性能开销: 由于Hashtable是同步的,它在多线程环境中提供了线程安全,但这也意味着在高并发情况下可能会引入一些性能开销。在某些情况下,非同步的数据结构,如HashMap,可能更适合高并发应用程序,前提是开发者能够确保线程安全。
- 均匀的哈希码分布: 哈希表的性能与哈希码的均匀分布有关。如果哈希函数不够均匀,可能导致数据分布不均匀,从而降低Hashtable的效率。因此,设计好的哈希函数对于Hashtable的性能至关重要。
- 不允许null键或null值: Hashtable不允许存储null键或null值。如果需要存储null值,可以考虑使用HashMap或其他允许null的数据结构。在Hashtable中,如果尝试存储null键或值,将会引发NullPointerException。
- 容量管理: Hashtable需要进行容量管理,以确保其性能。如果数据集变得很大,可能需要调整容量以减少哈希冲突。这通常需要重新创建更大容量的Hashtable,并重新散列数据。
总之,Hashtable是一个有用的数据结构,但在选择使用它时,开发者需要考虑性能、线程安全和哈希码分布等因素,并在需要时考虑其他替代方案,以满足特定应用程序的需求。
Hashtable vs. HashMap:何时使用Hashtable?
Hashtable和HashMap都用于存储键值对,但它们之间有一些重要的区别。Hashtable是线程安全的,适合多线程环境下的使用,而HashMap则不是。因此,当需要线程安全性时,Hashtable是更好的选择。
Hashtable 和 HashMap 都是用于存储键值对的数据结构,但它们在特定方面有所不同。在多线程环境下,Hashtable 是线程安全的,而 HashMap 则不是。Hashtable 在设计时就考虑了线程安全,通过在方法级别使用 synchronized
来实现同步,这意味着在多线程并发操作时,Hashtable 能够确保线程安全。
当考虑何时使用 Hashtable 时,以下情况是值得考虑的:
多线程环境:
如果你的应用在多线程环境中需要使用一个基本的键值对存储结构,并且需要确保线程安全,那么使用 Hashtable 是一个不错的选择。
历史遗留系统:
在某些情况下,由于历史原因,可能会发现旧的代码或遗留系统在使用 Hashtable。在这种情况下,如果没有必要的话,可能会继续使用 Hashtable。
不需要进行特殊操作:
Hashtable 是一种较早的实现,它限制了一些灵活性,例如不允许键或值为 null。如果你的应用中不需要这些特殊操作,并且线程安全对你来说更为重要,那么使用 Hashtable 可能是合适的选择。
然而,需要注意的是,随着 Java 版本的更新,引入了更为先进的并发工具和数据结构,例如 ConcurrentHashMap。ConcurrentHashMap 提供了比 Hashtable 更好的性能,因为它使用了更为精细的锁机制来提高并发性能,因此在许多情况下更推荐使用 ConcurrentHashMap 而不是 Hashtable,特别是在高并发的场景下。
总体而言,使用 Hashtable 主要基于对线程安全的需求。但在大多数现代应用程序中,有更好的选择,如 ConcurrentHashMap,以平衡性能和线程安全。
Hashtable的内部工作原理
Hashtable的内部实现是基于哈希表的。它使用键的哈希码来计算存储位置,并处理碰撞(多个键映射到同一个位置)的情况。深入了解Hashtable的内部工作原理有助于理解其性能特点。
Hashtable的内部工作原理如下:
- 哈希表:Hashtable内部维护一个固定大小的哈希表,通常是一个数组。这个数组的每个元素通常被称为"桶"或"存储桶"。每个桶可以存储一个或多个键值对。
- 哈希函数:当你插入一个键值对时,Hashtable首先使用键的哈希函数来计算键的哈希码。哈希函数的目标是将键均匀分散到哈希表的不同桶中。这个哈希码通常是一个整数,用来确定存储位置。
- 存储位置计算:通过哈希码,Hashtable确定将键值对存储在哪个桶中。通常,通过取哈希码的模运算(取余数)来计算桶的索引,以确定存储位置。
- 处理碰撞:碰撞是指多个键具有相同的哈希码,因此它们被映射到相同的桶。Hashtable使用不同的方法来处理碰撞,最常见的方法是链地址法(Chaining)和开放寻址法(Open Addressing)。
- 链地址法:每个桶内维护一个链表,当发生碰撞时,新的键值对会被添加到链表中。这允许多个键值对共享相同的桶。
- 开放寻址法:当发生碰撞时,Hashtable会尝试寻找下一个可用的桶,直到找到一个空桶或者达到一定的尝试次数。这种方法不使用链表,而是在哈希表中线性探测可用的桶。
- 数据检索:当你需要查找一个特定键的值时,Hashtable使用相同的哈希函数计算键的哈希码,然后找到对应的桶。对于链地址法,它需要遍历链表以找到正确的键值对。对于开放寻址法,它需要按照一定的规则查找下一个桶,直到找到匹配的键值对。
总的来说,Hashtable的内部工作原理基于哈希表,使用哈希函数将键映射到桶中,并使用适当的碰撞解决方法来处理多个键映射到相同桶的情况。这使得Hashtable能够快速查找和插入数据,同时保持较低的平均时间复杂度。
唯一性约束和键值对
Hashtable确保键值对的唯一性,这意味着同一个键不能对应多个不同的值。这个特性在许多应用中非常有用,例如缓存和数据索引。
Hashtable确实在键值对中强制唯一性约束。每个键都必须是唯一的,这意味着不同的键不能映射到相同的值。这种特性确保了Hashtable中的数据不会混淆或重复,使其非常适合用于存储具有唯一标识符的数据。
这种唯一性约束对于许多应用非常有用,例如:
- 数据索引:Hashtable可以用于创建索引,其中键是唯一标识符,值是与该标识符相关的数据。这使得可以通过唯一的键快速查找和检索相关的数据。
- 缓存:在缓存中,Hashtable可以用于存储缓存的数据,其中键是请求或查询的唯一标识符,值是缓存的结果。这确保了不同请求或查询使用相同的唯一标识符时可以快速获取缓存数据。
- 数据管理:在许多数据管理应用中,唯一性约束是至关重要的,以确保数据的一致性和准确性。
需要注意的是,如果尝试将一个已存在的键值对存储到Hashtable中,它会覆盖原有的值,因为键必须是唯一的。如果需要允许多个相同的键映射到不同的值,可以考虑使用其他数据结构,如HashMap,它允许键重复,但不保证有序性。
Hashtable在Java编程中的示例
让我们通过一些Java代码示例来演示如何使用Hashtable来管理数据:
import java.util.Hashtable;
import java.util.Enumeration;public class HashtableExample {public static void main(String[] args) {// 创建一个 Hashtable 实例Hashtable<Integer, String> hashtable = new Hashtable<>();// 添加键值对到 Hashtablehashtable.put(1, "Apple");hashtable.put(2, "Banana");hashtable.put(3, "Orange");// 获取特定键的值String value = hashtable.get(2);System.out.println("Value at key 2: " + value);// 遍历 Hashtable 中的键值对Enumeration<Integer> keys = hashtable.keys();while (keys.hasMoreElements()) {Integer key = keys.nextElement();String val = hashtable.get(key);System.out.println("Key: " + key + ", Value: " + val);}// 检查 Hashtable 是否包含特定键或值boolean keyExists = hashtable.containsKey(3);boolean valueExists = hashtable.contains("Grapes");System.out.println("Key 3 exists: " + keyExists);System.out.println("Value 'Grapes' exists: " + valueExists);// 删除特定键的值hashtable.remove(1);System.out.println("Hashtable after removing key 1: " + hashtable);}
}
Hashtable的性能和复杂度分析
了解Hashtable操作的时间复杂度和性能特点对于选择合适的数据结构至关重要。Hashtable的查找和插入操作通常是常数时间复杂度,因此非常高效。
Hashtable的性能和时间复杂度分析如下:
- 插入(Insertion):向Hashtable插入一个键值对通常是常数时间复杂度,即O(1),因为它使用哈希函数计算存储位置,并直接在该位置插入数据。在平均情况下,插入操作非常快。
- 查找(Retrieval):查找一个特定键的值也通常是常数时间复杂度,即O(1),因为Hashtable使用哈希码来快速定位存储位置,并直接检索值。在平均情况下,查找操作非常高效。
- 删除(Deletion):删除操作通常也是常数时间复杂度,即O(1),因为Hashtable可以直接定位要删除的键值对并执行删除操作。
- 碰撞处理:性能与碰撞处理方法有关。对于链地址法(Chaining),当发生碰撞时,查找和插入操作的时间复杂度仍然是常数时间,但在极端情况下,如果所有键都映射到相同的桶,性能可能会下降为线性时间。对于开放寻址法(Open Addressing),性能受到负载因子的影响,当负载因子较高时,性能可能会下降。
- 负载因子:Hashtable的性能也与负载因子有关。负载因子是Hashtable中已存储键值对数量与桶的总数之比。通常情况下,负载因子越低,性能越好。当负载因子达到一定阈值时,Hashtable可能需要调整桶的大小,以保持性能。这个调整操作的复杂度通常是O(n),其中n是桶的数量。
总的来说,Hashtable提供了高效的数据插入和查找操作,通常在常数时间内完成。然而,需要注意负载因子和碰撞处理,它们可能会影响Hashtable的性能。在实际应用中,合理选择哈希函数、合适的桶大小和负载因子是保持Hashtable高性能的关键因素。如果负载因子过高或哈希函数不均匀,性能可能会下降。
Hashtable的线程安全性
Hashtable是线程安全的,这意味着多个线程可以同时访问它而不会导致数据不一致性。我们将深入探讨Hashtable的线程安全性,并与其它同步方法进行比较。
Hashtable 是线程安全的数据结构,它是通过在方法级别使用 synchronized
来确保线程安全的。这意味着对于大多数方法(如 put
、get
、remove
等)的调用都将被同步,以确保同一时间只有一个线程可以执行这些方法,从而避免数据不一致性的问题。
这里有几点关于 Hashtable 的线程安全性值得注意:
1. 方法级同步
Hashtable 中的所有公共方法都被标记为 synchronized
,这使得每个方法在同一时间只能由一个线程执行。这确保了对 Hashtable 的并发访问是线程安全的。
2. 效率和性能
尽管线程安全是 Hashtable 的一个优点,但它也有一些缺点。由于方法级别的同步,这可能会导致性能问题,尤其是在高并发环境下。因为一次只有一个线程可以访问 Hashtable,其他线程可能需要等待。这种同步机制可能会成为性能瓶颈。
3. 替代选择
随着 Java 平台的发展,后续引入了更为高效的并发集合类,比如 ConcurrentHashMap。ConcurrentHashMap 使用了更精细的锁机制,允许多个读操作并发进行,而不会阻塞其他读操作,从而提高了并发性能。相比之下,Hashtable 的同步策略在性能上略显滞后。
4. 其他同步方法
除了 Hashtable 和 ConcurrentHashMap,还有其他方式来实现线程安全的数据结构,比如使用 Collections.synchronizedMap() 方法。这个方法可以把一个非线程安全的 HashMap 转换成线程安全的 Map,但性能可能也会受到影响,因为它是通过在每个公共方法上添加同步来实现的。
总的来说,Hashtable 是线程安全的,但其性能可能不如一些后续引入的并发集合类。在新的代码中,更推荐使用 ConcurrentHashMap 或者其他基于并发性能更优越的集合类,除非需要兼容已有的遗留系统或历史代码。
ashtable的线程安全性是通过在其所有公共方法上使用synchronized
关键字来确保的。这确保了在同一时刻只有一个线程可以访问Hashtable的方法,从而防止多个线程同时修改数据,确保了线程安全。
然而,这种方法级别的同步也引入了一些性能上的问题,尤其是在高并发环境下。由于一次只有一个线程可以访问Hashtable,其他线程可能需要等待,这可能导致性能瓶颈。这在并发高、负载大的环境下可能成为问题。
随着Java平台的发展,后续引入了更高效的并发集合类,例如ConcurrentHashMap。ConcurrentHashMap使用了更细粒度的锁机制,允许多个读操作并发进行,而不会阻塞其他读操作,从而提高了并发性能。相比之下,Hashtable的同步策略在性能上稍显滞后。
除了Hashtable和ConcurrentHashMap,还有其他方法可以实现线程安全的数据结构,比如使用Collections.synchronizedMap()
方法。这个方法可以把一个非线程安全的HashMap转换成线程安全的Map,但性能可能会受到影响,因为它是通过在每个公共方法上添加同步来实现的。
综合来看,虽然Hashtable是线程安全的,但在性能方面存在一些局限性。在需要更好并发性能的情况下,建议使用ConcurrentHashMap或者其他更现代化、性能更优的并发集合类。
Hashtable的使用建议和最佳实践
为了保证代码的稳定性和性能,我们将提供使用Hashtable时的最佳实践,包括如何处理异常情况和优化性能。
使用Hashtable时,以下是一些最佳实践和建议,以确保代码的稳定性和性能:
- 选择合适的键和哈希函数:
- 键应该是不可变的,以确保它们的哈希码不会变化。
- 实现好的哈希函数应该分散键的分布均匀,以减少碰撞的可能性。
- 设置合适的初始容量和负载因子:
- 初始容量应该根据预期的键值对数量来选择,以避免频繁的哈希表调整操作。
- 负载因子决定了哈希表何时进行扩容。通常,负载因子较小(例如0.75)可以提高性能,但会占用更多内存。
- 处理空键和空值:
- Hashtable不允许存储空键或空值。在插入键值对之前,应检查键和值是否为null以避免异常。
- 处理碰撞:
- 碰撞是不可避免的。使用合适的碰撞处理方法,如链地址法或开放寻址法,以确保数据一致性。
- 为哈希表选择适当的大小和负载因子,以减少碰撞的概率。
- 线程安全性:
- Hashtable是同步的,适用于多线程环境。但请注意,同步操作可能会对性能产生一定影响。如果只在单线程环境下使用,可以考虑使用非同步的HashMap。
- 性能优化:
- 考虑负载因子的影响,当负载因子接近阈值时,考虑增加容量以降低碰撞率。
- 定期评估哈希函数的性能,以确保它能够均匀分布键。
- 避免频繁的插入和删除操作,因为这可能导致哈希表调整操作,影响性能。
- 异常处理:
- 处理可能的异常情况,如空键或空值,以确保代码的健壮性。
- 注意可能抛出的异常,如
NullPointerException
或ConcurrentModificationException
,并合理处理它们。
- 备份数据:
- 如果需要持久性,定期备份Hashtable中的数据,以防止数据丢失。
- 考虑其他数据结构:
- 考虑使用其他数据结构,如HashMap,如果你需要更高的性能,可以在单线程环境下运行。
总的来说,Hashtable是一个强大的数据结构,用于管理键值对,并提供高效的查找和插入操作。然而,在使用时需要注意一些细节,以确保代码的稳定性和性能。根据具体的应用场景和需求,可能还需要考虑其他替代数据结构,如HashMap或ConcurrentHashMap。
Hashtable在现代Java框架中的应用
Hashtable在现代Java框架和库中仍然有广泛的应用。我们将探索如何将Hashtable与Spring Framework等流行框架一起使用,以满足不同的需求。
在现代的Java框架和库中,虽然 Hashtable 在过去是常用的,但由于其线程安全性能损耗以及其他更先进的数据结构的出现,它在一些新的框架和库中的使用并不十分普遍。然而,仍有一些情况下可以看到其在现代 Java 开发中的应用。
1. 遗留系统和老代码库
在一些遗留系统或者早期开发的老代码库中,你可能会发现仍在使用 Hashtable。这可能是因为旧代码的维护、历史原因或者与其他旧系统的兼容性。这种情况下,Hashtable可能会被保留下来用于一些特定的功能。
2. 特殊需求
在一些少数情况下,Hashtable 可能被用于满足一些特殊需求。例如,Hashtable 是线程安全的,因此在特定要求线程安全的场景下(即便是对性能要求不是特别高),仍有可能使用它。
3. Spring Framework和其他框架
在像 Spring Framework 这样的现代框架中,Hashtable 的使用相对较少。Spring 提供了更现代和性能更好的选择,比如 ConcurrentHashMap 和 ConcurrentSkipListMap。这些数据结构提供了更好的并发性能,因此在 Spring Framework 或其他现代框架中更常见。
当涉及到并发性能、大规模数据操作、或者更高级的数据结构需求时,现代框架往往会选择其他更适合当前需求的数据结构而非Hashtable。
虽然Hashtable在特定情况下可能仍然有用,但在现代 Java 开发中,更推荐使用 ConcurrentHashMap 或其他并发集合类,因为它们提供了更好的性能和扩展性,能够更好地满足现代应用程序的需求。
未来展望:Hashtable的演化和替代品
最后,我们将讨论Hashtable的未来发展趋势和可能的替代选择,以帮助你保持与技术的发展同步。
1. ConcurrentHashMap 和其他并发集合
ConcurrentHashMap 是Hashtable的现代替代品之一。它通过精细的锁机制提供了更好的并发性能,允许多个读操作并发进行而不阻塞其他读操作。它是更适合现代高并发环境下的选择。
2. JDK 中新的数据结构
Java发展过程中,引入了一些新的数据结构,例如 ConcurrentSkipListMap 和 CopyOnWriteArrayList 等。它们在不同的使用场景下提供了更好的性能和功能。
3. 函数式编程和流式API
Java 8 引入的 Stream API 和函数式编程范式提供了一种更为流畅的数据处理方式。它使用了函数式编程思想,并允许开发者以更简洁的方式对数据进行操作,减少了对传统集合类的直接依赖。
4. 非阻塞数据结构
随着并发编程的发展,非阻塞数据结构如 ConcurrentLinkedQueue 和 ConcurrentLinkedDeque 等日益受到关注。这些数据结构通过无锁算法来实现并发,避免了锁带来的性能损耗。
5. Java内部优化和更新
随着 Java 平台的不断更新,可能会对现有的数据结构和集合类进行优化和改进,以适应更为复杂和高效的应用场景。
在未来,随着对并发性能和数据处理需求的不断增长,Hashtable 在新代码中的应用可能会进一步减少,而更为现代化、高效的并发集合类和新的数据结构将会得到更广泛的应用。建议在项目中根据具体需求选择合适的数据结构,特别是考虑到性能和并发需求时。
总结
通过本文,我们对Java中的Hashtable集合类有了深入的了解。我们介绍了其基本概念、与HashMap的比较、内部工作原理、性能、线程安全性以及最佳实践。此外,我们还探讨了Hashtable在现代Java应用中的应用和未来趋势。希望这篇博客对你有所帮助。
参考资料
- Java Hashtable Documentation
- Java Collections Framework
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )
点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。
相关文章:

【JavaSE专栏55】Java集合类HashTable解析
🌲Java集合类HashTable解析 🌲Java集合类HashTable解析摘要引言Hashtable是什么?Hashtable vs. HashMap:何时使用Hashtable?多线程环境:历史遗留系统:不需要进行特殊操作: Hashtable…...

Apollo上机实践:一次对自动驾驶技术的亲身体验
上机实践 概述自动驾驶通信分布式系统开发模式开发工具 自动驾驶感知传感器特性感知流程及算法部署感知模型 自动驾驶决策规划决策规划流程和算法使用 Dreamview 进行控制在环的规划调试开发规划场景和算法 福利活动 主页传送门:📀 传送 概述 Apollo 是…...

QTcpServer简单的TCP服务器连接
1、简介 简单实现控制TCP服务器获取连接的套接字。点击断开服务器即可关闭所有连接,最大连接数量为5个。 声明源文件 #include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {//设置固定大小setFixedSize(1024,600);b…...

LeetCode热题100——双指针
双指针 1.移动零2.盛最多水的容器3.三数之和 1.移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 // 题解:使用双指针,其中快指针指向非零元素,慢指针指向首个零元素下…...

Ubuntu ARMv8编译Qt源码以及QtCreator
最近需要在NVIDIA小盒子上面跑一个程序,一开始想着在Ubuntu x64下交叉编译一版,后来发现libqxcb.so 这个库在configure时就会一直报错,多方查找怀疑可能是由于硬件不支持在x64环境下编译AMR架构的xcb库。 所以最后在ARM下直接编译Qt源码了&am…...

虚机Centos忘记密码如何重置
1进入开机前的页面,选中第一个,按“e”键,进入编辑模式 2找到ro crashkernel项,将ro替换成 rw initsysroot/bin/sh 3 Ctrlx mount -o remount, rw / chroot /sysroot chroot /sysroot passwd root 输入两次密码 touch /.a…...

OpenGL_Learn02
1. 监听窗口,绑定回调函数 #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << "变了…...

基于STC系列单片机实现外部中断0控制按键调节定时器0产生PWM(脉宽调制)的功能
#define uchar unsigned char//自定义无符号字符型为uchar #define uint unsigned int//自定义无符号整数型为uint sbit PwmOut P1^0;//位定义脉宽调制输出为单片机P1.0脚 uchar PwmTimeCount;//声明脉宽调制时间计数变量 uchar PwmDutyCycle;//声明脉宽调制占空比变量 void Ti…...

vue3中 reactive和ref的区别
在Vue 3中,reactive和ref都是用于响应式数据的API。它们的主要区别在于使用方式和返回值类型。 reactive: reactive函数用于将一个对象转换为响应式对象。它接收一个普通的JavaScript对象,并返回一个被代理的响应式对象。这意味着当响应式对…...

docker的安装部署nginx和mysql
小白自己整理,如有错误请指示! 自我理解:docker就是把应用程序所用的依赖程序,函数库等相关文件打包成镜像文件,类似系统光盘,然后可以在任意电脑上安装使用(方便运维人员部署程序)…...

测试C#调用Aplayer播放视频(1:加载Aplayer控件)
微信公众号“Dotnet跨平台”的文章《开源精品,使用 C# 开发的 KTV 点歌项目》中使用了迅雷开源APlayer播放引擎。最近在学习有哪些能拿来播放视频的组件或控件,于是准备试试,根据文章中的介绍,在迅雷APlayer播放引擎网站中下载了A…...

二叉树的遍历+二叉树的基本操作
文章目录 二叉树的操作一、 二叉树的存储1.二叉树的存储结构 二、 二叉树的基本操作1.前置创建一棵二叉树:1. 定义结点 2.简单的创建二叉树 2.二叉数的遍历1.前序遍历2.中序遍历3.后序遍历4.层序遍历 3.二叉树的操作1.获取树中节点的个数2.获取叶子节点的个数3.获取…...

Go 语言gin框架的web
节省时间与精力,更高效地打造稳定可靠的Web项目:基于Go语言和Gin框架的完善Web项目骨架。无需从零开始,直接利用这个骨架,快速搭建一个功能齐全、性能优异的Web应用。充分发挥Go语言和Gin框架的优势,轻松处理高并发、大…...

Docker底层原理:Cgroup V2的使用
文章目录 检查 cgroup2 文件系统是否已加载检查系统是否已挂载 cgroup2 文件系统创建 cgroup2 层次结构查看 cgroup2 开启的资源控制类型启用 cgroup2 资源控制设置 cgroup2 资源限制加入进程到 cgroup2 检查 cgroup2 文件系统是否已加载 cat /proc/filesystems | grep cgroup…...

历年上午真题笔记(2014年)
解析:A 网络设计的三层模型 : 接入层:Layer 2 Switching,最终用户被许可接入网络的点,用户通过接入层可以访问网络设备。 汇聚层:Layer2/3 Switching,访问层设备的汇聚点,负责汇接配线单元,利用二、三层技术实现工作组分段及网络故障的隔离,以免对核心层网络设备造…...

数据库软考知识
分布式数据库透明性 封锁 加上共享锁之后只能加共享锁,加上排他锁之后,啥锁都不能加。 分布式数据库特性 伪传递定理 SQL函数定义,有点冷 来了奥,更冷 存储过程 很重要,下午第二大题也是数据库...

学习笔记|配对样本均数T检验|SPSS常用的快捷键|规范表达|《小白爱上SPSS》课程:SPSS第六讲 | 配对样本均数T检验
目录 学习目的软件版本原始文档配对样本均数T检验一、实战案例二、案例解析三、统计策略四、SPSS操作1、正态性检验2、配对样本T检验 五、结果解读六、规范报告1、规范表格2、规范文字 划重点Tips:SPSS常用的快捷键 学习目的 SPSS第六讲 | 配对样本均数T检验 软件版本 IBM S…...

python内置模块smtplib、email 发送电子邮件
一、简介 smtplib 是 Python 的标准库之一,用于发送电子邮件。它提供了一个简单的接口来连接到 SMTP(Simple Mail Transfer Protocol)服务器,并通过该服务器发送电子邮件。 email 是 Python 的标准库之一,用于处理电子…...

Qt使用QWebEngineView一些记录
1.关闭软件警告: Release of profile requested but WebEnginePage still not deleted. Expect troubles! 原因,系统退出关闭view,没有释放page。 解决办法:手动释放page 顺便把view也释放了。 Widget::~Widget() {updateIni…...

【2023.10.30练习】C语言-判断等式成立
计算机能力挑战初赛2020.20题 题目描述: 输入正整数A、B、C(0<A,B,C<10000),若用、-、*、/、%之一组成等式(即ABC,是上述运算符之一,),则输出“YES”,否则输出“NO”; 输入: 第一行输入…...

Wpf 使用 Prism 实战开发Day03
一.实现左侧菜单绑定 效果图: 1.首先需要在项目中创建 mvvm 的架构模式 创建 Models ,放置实体类。 实体类需要继承自Prism 框架的 BindableBase,目的是让实体类支持数据的动态变更! 例如: 系统导航菜单实体类 / <summary>/// 系统导航菜单实体类…...

JavaEE-cookie和session
本部分内容包括 cookie基本概念,sendcookies和getcookies代码; session基本概念,session实现登陆界面; 上述过程中涉及的代码如下: 1 import javax.servlet.ServletException; import javax.servlet.annotation.WebSe…...

Java设计模式之命令模式
目录 定义 结构 案例 优点 缺点 使用场景 JDK源码解析 Thread中start与run方法的区别 定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增…...

记录一段帮朋友写的代码,使用牛顿-拉夫逊方法解方程
要求 已知公式: t G A B F r B r 2 2 F A 2 B G A F ln ( r − A ) C o n s t t\frac{GAB}{F}r\frac{Br^2}{2F}\frac{A^2BGA}{F}\ln (r-A)Const tFGABr2FBr2FA2BGAln(r−A)Const 其中 t 的值为0-1000,每间隔25取一次值A2.12941E-10B0.…...

滑动窗口限流算法实现一
固定算法 原理:固定算法是将时间线分隔成固定大小的时间窗口,每个窗口都会有个计数器,用来记录窗口时间范围内的请求总数,如果窗口的请求总数达到最大限定值,会认定流量超限。比如将窗口大小设为1分钟,每分…...

简单明了!网关Gateway路由配置filters实现路径重写及对应正则表达式的解析
问题背景: 前端需要发送一个这样的请求,但出现404 首先解析请求的变化: http://www.51xuecheng.cn/api/checkcode/pic 1.请求先打在nginx,www.51xuecheng.cn/api/checkcode/pic部分匹配到了之后会转发给网关进行处理变成localho…...

EMQX内置Web管理控制台-Dashboard
一、Dashboard概述 EMQX Dashboard官网文档:https://docs.emqx.com/zh/enterprise/v5.1/dashboard/introduction.html 1、简介 EMQX 为用户提供了一个功能强大的内置管理控制台,即 EMQX Dashboard。通过这个控制台的 Web 界面,用户可以轻松监…...

计算机网络重点概念整理-第四章 网络层【期末复习|考研复习】
计算机网络复习系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言四、网络层4.1 网络层功能4.1.1 电路交换、报文交换与分组交换4.1…...

数组转树形数据
const nodes [{ id: 3, name: 节点C, pid: 1 },{ id: 6, name: 节点F, pid: 3 },{ id: 0, name: root, pid: null },{ id: 1, name: 节点A, pid: 0 },{ id: 8, name: 节点H, pid: 4 },{ id: 4, name: 节点D, pid: 1 },{ id: 2, name: 节点B, pid: 0 },{ id: 5, name: 节点E, p…...

react动态插入样式
在开发组件过程中,偶尔需要动态的插入css,比如在在iframe中渲染组件后,iframe中是没有样式的,所以需要手动插入样式。 插入样式 通常是在useLayoutEffect中动态创建style标签 useLayoutEffect(() > {if (!ref.current) {cons…...