探索Java中的Map:领略键值对的无限魅力

目录

1、前言

2、介绍Map

2.1 什么是Map

2.2 Map的特点

3、常用的Map实现类

3.1 HashMap

3.2 TreeMap

3.3 LinkedHashMap

3.4 Hashtable

3.5 ConcurrentHashMap

4、操作Map的常用方法

5、Map的应用场景

5.1 缓存

5.2 数据存储

5.3 计数器

6、常见问题解答

6.1 HashMap与Hashtable的区别

6.2 TreeMap的排序原理

7、实际案例分析

7.1 使用Map实现一个简单的缓存系统

7.2 使用Map统计单词出现的次数

8、结语

1、前言

        在Java中,Map是一种非常常用且强大的数据结构。它提供了一种将键映射到值的简单方式,可以用来存储和操作键值对。

        Map可以存储任意类型的键和值,键与值之间是一一对应的关系。这使得Map非常适合用于存储和查找数据,尤其是当你需要根据某个键来查找对应的值时。

        Map的实现类有很多种,其中最常见的是HashMap。HashMap使用哈希表的方式来存储数据,它提供了快速的插入和查找操作。除了HashMap,还有TreeMap、LinkedHashMap等其他实现类,它们分别使用树和链表的方式来存储数据,有不同的特点和适用场景。

        使用Map的步骤很简单:首先创建一个Map对象,然后向其中添加键值对,最后可以通过键来获取对应的值。Map还提供了丰富的方法,可以进行遍历、删除、替换等操作。

        Map的使用场景非常广泛。比如,你可以使用Map来统计一段文本中每个单词出现的次数,将某个对象的属性映射到对应的值上,构建一个缓存,等等。无论在哪种情况下,Map都能够帮助你高效地处理数据。

        本文将深入探索Java中的Map,介绍它的基本用法、常见的操作,以及一些使用技巧。希望通过本文的学习,你能够领略键值对的无限魅力,并在实际开发中灵活运用Map来解决问题。让我们开始这个精彩的探索之旅吧!

2、介绍Map

2.1 什么是Map

        Map是一种数据结构,它用于存储键值对(Key-Value pairs)。在Map中,每个键(key)唯一且与一个值(value)相关联。通过给定的键可以快速地获取对应的值。Map通常用于需要通过键来查找对应的数据的情况,例如字典、电话簿等。

        在许多编程语言中,Map也被称为字典(dictionary)、哈希表(hash table)或关联数组(associative array)等。Map提供了一种高效的数据访问方式,可以快速地插入、删除和查找键值对。

        Map中的键和值可以是任意类型的数据,可以是基本数据类型,也可以是自定义类对象。在Java编程语言中,Map接口是由HashMap、TreeMap等类实现的。

2.2 Map的特点

Map的特点包括:

  1. 键-值对:Map是一种存储键值对的数据结构。每个键都是唯一的,通过键可以快速地检索到对应的值。

  2. 动态扩展:Map的大小是动态可变的,可以根据需要动态地添加或删除键值对。

  3. 高效的查找操作:通过键可以快速地定位到对应的值,查找操作的时间复杂度是常数级别的。

  4. 无序性:Map中的键值对是无序的,即键值对的顺序不固定。

  5. 可存储不同类型的数据:Map可以存储不同类型的数据,键和值可以是任意类型。

  6. 迭代操作:Map提供了迭代器,可以遍历所有的键值对。

  7. 可包含重复键:Map的键是唯一的,但值可以重复。

  8. 支持Null值和Null键:Map允许存储Null值和Null键。

  9. 可以用作缓存:Map可以用作缓存数据的结构,通过键快速地获取对应的值,避免重复计算。

总的来说,Map提供了一种高效的存储和查找键值对的数据结构,适用于需要快速查找和访问数据的场景。

3、常用的Map实现类

3.1 HashMap

        HashMap是Java中的一种数据结构,它基于哈希表实现。HashMap存储键值对,其中键是唯一的,并且可以通过键快速查找对应的值。

        HashMap的内部是由一个数组和链表组成的,每个数组元素称为一个桶(bucket),每个桶中会存储一个链表(或者红黑树)。当插入一个键值对时,首先根据键的哈希值确定它所在的桶,如果该桶没有元素,则直接将键值对插入桶中。如果该桶中已经存在元素,则需要遍历链表或者红黑树,找到键值对的位置。当查找一个键值对时,也是通过计算键的哈希值来确定它所在的桶,然后在桶中遍历链表或者红黑树,找到对应的值。

        HashMap具有快速的插入和查找性能,平均情况下的时间复杂度为O(1)。但是,如果hashCode方法返回的哈希值不均匀或者存在大量的哈希冲突,就会导致链表变得很长,从而降低HashMap的性能。为了解决这个问题,Java 8中引入了红黑树,当链表长度超过一定阈值时,会将链表转换为红黑树,提高查找效率。

        需要注意的是,HashMap是非线程安全的,如果在多线程环境下使用,需要加上相应的同步控制。

3.2 TreeMap

        TreeMap是Java集合框架中的一种有序映射。它实现了Java的Map接口,并且根据键的自然排序进行排序。

        TreeMap使用红黑树数据结构来存储键值对,并且保证键的有序性。红黑树是一种自平衡二叉搜索树,能够在O(log N)的时间复杂度下进行插入、删除和查找操作。

        与HashMap相比,TreeMap能够保证键的顺序,这对于需要按照键的顺序遍历的场景非常有用。在需要有序的映射数据结构的情况下,使用TreeMap是一个很好的选择。

        TreeMap的实现是非线程安全的,不适用于多线程环境。如果需要在多线程环境下使用有序映射,可以考虑使用ConcurrentSkipListMap。

        总之,TreeMap是Java集合框架中的一种有序映射,使用红黑树来存储键值对,并且保证键的有序性。

3.3 LinkedHashMap

LinkedHashMap是Java集合框架中的一种实现类,它继承自HashMap,并且使用双向链表维护元素的顺序。与HashMap不同的是,LinkedHashMap可以保证元素的插入顺序和访问顺序一致。在LinkedHashMap中,每个元素都包含一个指向前一个元素和后一个元素的指针。

LinkedHashMap的特点包括:

  1. 插入顺序和访问顺序一致:元素被插入LinkedHashMap的顺序会被保留,并且可以通过迭代器按照插入的顺序访问元素。
  2. 支持有序遍历:可以根据插入顺序或访问顺序进行有序遍历。
  3. 性能比HashMap稍低:由于需要维护链表的顺序,LinkedHashMap的性能比HashMap稍低。

LinkedHashMap常用的构造方法包括:

  1. LinkedHashMap():创建一个空的LinkedHashMap。
  2. LinkedHashMap(int initialCapacity):创建一个指定初始容量的LinkedHashMap。
  3. LinkedHashMap(int initialCapacity, float loadFactor):创建一个指定初始容量和加载因子的LinkedHashMap。
  4. LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder):创建一个指定初始容量、加载因子和访问顺序的LinkedHashMap。

LinkedHashMap常用的方法包括:

  1. put(Object key, Object value):将指定的键值对插入到LinkedHashMap中。
  2. get(Object key):返回指定键对应的值。
  3. remove(Object key):删除指定键对应的键值对。
  4. clear():清空LinkedHashMap中的所有键值对。
  5. size():返回LinkedHashMap中的键值对数量。

LinkedHashMap的主要应用场景是需要保留插入顺序或访问顺序的情况,例如LRU(Least Recently Used)缓存算法的实现。

3.4 Hashtable

Hashtable是Java中的一种数据结构,它也是Dictionary类的一个子类。Hashtable使用键值对的方式存储数据,其中键必须是唯一的而值可以重复。它是基于哈希表的数据结构,能够快速地插入和查找数据。

Hashtable的内部实现是一个哈希表,它使用哈希函数将键映射到哈希码,然后将数据存储在对应的位置上。当需要查找数据时,使用相同的哈希函数计算出哈希码,然后在对应位置上搜索。

Hashtable具有以下特点:

  1. 线程安全:Hashtable是线程安全的,可以同时被多个线程访问和修改。这是通过在每个方法上添加synchronized关键字来实现的。
  2. 无序性:Hashtable中的元素是无序的,插入和删除操作不会改变元素的顺序。
  3. 可以存储null值和null键:Hashtable允许存储null值和null键。
  4. 高效的插入和查找操作:由于使用了哈希表,Hashtable具有快速的插入和查找操作。平均情况下,插入和查找操作的时间复杂度为O(1)。

然而,由于Hashtable是线程安全的,所以在多线程环境下使用会影响性能。如果不需要线程安全的特性,可以考虑使用HashMap替代Hashtable。

3.5 ConcurrentHashMap

ConcurrentHashMap是Java集合框架中的一个类,它是线程安全的哈希表实现。它继承自AbstractMap类,实现了ConcurrentMap接口。

ConcurrentHashMap的设计目标是提供一种高效的并发访问方式,以取代Hashtable和SynchronizedMap等旧的线程安全集合类。相比于这些旧的集合类,ConcurrentHashMap在并发访问时可以提供更好的性能。

ConcurrentHashMap的内部结构与HashMap类似,都是使用哈希表来存储键值对。不同之处在于,ConcurrentHashMap在并发访问时采用了一种更细粒度的锁机制,使得多个线程可以同时访问不同的部分而不会造成阻塞。

ConcurrentHashMap的主要特点包括:

  • 线程安全:ConcurrentHashMap通过使用锁机制来保证并发访问的线程安全性。
  • 高效性能:ConcurrentHashMap的内部实现采用了一种分段锁的机制,使得多个线程可以同时进行读操作,从而提高了并发访问的性能。
  • 动态扩容:ConcurrentHashMap可以根据需要动态扩容,以适应数据量的变化。
  • 支持高并发:ConcurrentHashMap对于读操作的并发性能非常好,因为多个线程可以同时进行读操作。同时,它对于写操作的并发性能也提供了一定的优化。

总之,ConcurrentHashMap是一个高效的线程安全的哈希表实现,适用于需要在多个线程之间并发访问的场景。它可以提供较好的性能,并且能够动态地适应数据的变化。

4、操作Map的常用方法

操作 Map 的常用方法包括:

  1. 创建一个新的 Map 对象:

    Map<String, Integer> map = new HashMap<>();
    
  2. 添加键值对:

    map.put(key, value);
    
  3. 检查 Map 是否包含指定的键:

    boolean containsKey = map.containsKey(key);
    
  4. 获取指定键对应的值:

    Integer value = map.get(key);
    
  5. 获取 Map 的大小(包含的键值对数量):

    int size = map.size();
    
  6. 检查 Map 是否为空:

    boolean isEmpty = map.isEmpty();
    
  7. 删除指定键值对:

    map.remove(key);
    
  8. 遍历map:

        遍历Map可以使用entrySet()方法配合迭代器进行遍历,示例代码如下:

Map<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);// 使用entrySet()方法获取所有键值对的集合
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();// 使用迭代器遍历键值对集合
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();String key = entry.getKey();Integer value = entry.getValue();System.out.println("Key: " + key + ", Value: " + value);
}

以上代码会输出:

Key: Apple, Value: 1
Key: Banana, Value: 2
Key: Cherry, Value: 3

        9. 清空 Map:

map.clear();

注意:Map 是根据键来维护元素顺序的,所以不会有重复的键出现。如果向 Map 中添加重复的键,新的值会覆盖旧的值。

5、Map的应用场景

5.1 缓存

缓存是指将数据存储在快速访问的位置,以便在后续请求中更快地获取数据。Map的应用场景之一就是缓存。

在缓存中使用Map的优点包括:

  1. 快速访问:Map允许使用键值对的方式存储和检索数据,这意味着可以使用唯一的键快速访问值,而不需要迭代整个缓存。

  2. 灵活性:Map的灵活性使得可以根据实际需求选择适当的数据结构,例如使用HashMap进行快速检索,或使用LinkedHashMap进行顺序访问。

  3. 数据存储:Map可以存储不同类型的数据,例如对象、列表或其他复杂结构,这使得可以缓存各种类型的数据。

  4. 数据更新:Map可以方便地修改或更新缓存中的数据,例如添加、删除、修改或替换数据。

  5. 缓存策略:通过使用Map,可以实现各种缓存策略,例如LRU(最近最少使用)、LFU(最不常用)或FIFO(先进先出)。

  6. 内存管理:Map可以帮助管理缓存的内存使用,例如通过设置最大缓存大小或使用回收机制来限制内存占用。

在实际应用中,使用Map作为缓存的例子包括Web应用程序中的页面缓存、数据库查询结果缓存、图片缓存等。通过合理使用Map的特性和缓存策略,可以提高应用程序的性能和响应速度。

5.2 数据存储

Map数据结构提供了一种存储键值对的方式,可以用于存储和管理大量的数据。

在数据存储方面,Map的应用场景包括:

  1. 缓存:Map可以用来实现缓存,将一些频繁访问的数据存储在Map中,可以减少访问数据库或其他数据源的次数,提高系统的性能。

  2. 数据索引:Map可以用来建立数据的索引,提供快速的查找功能。例如,在一个大型的数据库系统中,可以使用Map将数据对象的某个属性作为键,将数据对象本身作为值,从而快速地根据某个属性来查找数据。

  3. 会话管理:Map可以用于管理用户的会话信息。在一个网站或应用中,每个用户都有一个唯一的会话ID,可以将会话ID作为键,将用户的会话信息作为值,存储在Map中。这样可以方便地管理和查询用户的会话信息。

  4. 数据缓存:Map可以用于实现数据缓存,将计算结果或数据对象存储在Map中,以便后续的访问。当需要访问某个数据时,首先在Map中查找,如果存在则直接返回,否则进行计算或查询操作,并将结果存储在Map中,以方便后续的访问。

  5. 数据的关联和映射:Map可以用于建立两个数据集之间的关联关系或映射关系。例如,可以使用Map将两个表的某个属性作为键,将两个表的对应数据对象作为值,从而建立两个表之间的关联关系。

总之,Map数据结构的灵活性和高效性使其成为数据存储的理想选择,在各种场景中都能发挥重要作用。

5.3 计数器

        计数器是Map的一个常见应用场景。计数器主要用于统计某个事件发生的次数。例如,在一个网站中,可以使用计数器统计每个用户登录网站的次数,或者统计每个商品被点击的次数。计数器可以帮助管理员监控和分析用户行为,了解用户对网站或商品的兴趣程度。通过将用户id或商品id作为key,将次数作为value,可以方便地统计每个用户或每个商品的点击次数。

6、常见问题解答

6.1 HashMap与Hashtable的区别

HashMap和Hashtable都是实现了Map接口的数据结构,用于存储键值对。它们之间的主要区别如下:

  1. 线程安全性:Hashtable是线程安全的,而HashMap是非线程安全的。Hashtable的所有方法都使用synchronized关键字进行同步,确保了多线程环境下的安全性,但也导致了性能较低。HashMap在多线程环境下可能会出现并发修改异常,因此在多线程环境下需要使用ConcurrentHashMap或使用同步手段来保证线程安全。

  2. null值:Hashtable不允许存储null值,而HashMap允许存储一个null键和多个null值。在Hashtable中插入null会抛出NullPointerException。

  3. 继承关系:Hashtable是早期的Java类,它实现了Dictionary接口,并继承了Dictionary类,而HashMap是新的Java类,它实现了Map接口,并继承了AbstractMap类。

  4. 性能:由于Hashtable是线程安全的,它的性能通常比HashMap低。在单线程环境下,HashMap的性能更好。

综上所述,如果不考虑线程安全性和对null值的需求,推荐使用HashMap,它具有更好的性能。如果需要线程安全性,可以考虑使用Hashtable或ConcurrentHashMap。

6.2 TreeMap的排序原理

TreeMap是一种根据键排序的Map集合,它的排序原理是根据键的自然排序或者通过比较器进行排序。

如果键实现了Comparable接口并且具有天然顺序,则会使用键的自然顺序进行排序。例如,如果键是整数类型,那么TreeMap会按升序对键进行排序。

如果键没有实现Comparable接口或者想要自定义排序顺序,可以通过传入一个实现了Comparator接口的比较器来进行排序。Comparator接口中的compare方法用于确定两个键的顺序。

在TreeMap中,每个键值对被封装为一个Entry对象,而Entry对象之间通过链表连接起来形成一个红黑树。红黑树是一种自平衡的二叉搜索树,通过保持树的平衡性,可以保证对数时间复杂度的操作性能。

当插入或删除键值对时,TreeMap会根据键的排序规则自动调整红黑树的结构,以保持树的平衡性。这样,在每次插入或删除操作之后,TreeMap都可以保持键的有序状态。

由于TreeMap是一个有序的Map集合,因此可以使用一些特定的方法来获取按顺序的子Map或者遍历有序键的集合。例如,可以使用firstKey()和lastKey()方法获取最小和最大的键;可以使用headMap()、tailMap()或者subMap()方法获取指定范围内的键的子Map。

7、实际案例分析

7.1 使用Map实现一个简单的缓存系统

使用java.util.Map可以很简单地实现一个简单的缓存系统。以下是一个示例代码:

import java.util.HashMap;
import java.util.Map;public class SimpleCache<K, V> {private final Map<K, V> cache;public SimpleCache() {this.cache = new HashMap<>();}public void put(K key, V value) {cache.put(key, value);}public V get(K key) {return cache.get(key);}public void remove(K key) {cache.remove(key);}public void clear() {cache.clear();}
}

你可以使用put方法将键值对存入缓存中,使用get方法获取缓存中的值,使用remove方法移除缓存中的项,使用clear方法清空缓存。

示例用法:

SimpleCache<String, Integer> cache = new SimpleCache<>();cache.put("key1", 1);
cache.put("key2", 2);System.out.println(cache.get("key1")); // 输出: 1
System.out.println(cache.get("key2")); // 输出: 2cache.remove("key1");System.out.println(cache.get("key1")); // 输出: null

这只是一个非常简单的缓存系统示例,实际的缓存系统可能需要更多的功能和优化。

7.2 使用Map统计单词出现的次数

可以使用HashMap来统计单词出现的次数。首先将文本分割成单词,然后遍历单词列表,使用HashMap来统计每个单词出现的次数。

import java.util.HashMap;
import java.util.Map;public class WordCount {public static void main(String[] args) {String text = "hello world hello java world";String[] words = text.split(" ");Map<String, Integer> wordCountMap = new HashMap<>();for (String word : words) {if (wordCountMap.containsKey(word)) {int count = wordCountMap.get(word);wordCountMap.put(word, count + 1);} else {wordCountMap.put(word, 1);}}for (Map.Entry<String, Integer> entry : wordCountMap.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}
}

输出结果:

java: 1
hello: 2
world: 2

8、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请考虑给予一点打赏。

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

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

相关文章

Spring中线程池ThreadPoolTaskExecutor的使用

一、为什么要使用线程池 在项目中使用多线程时&#xff0c;通常建议使用线程池而不是直接使用 new Thread 的方式来创建线程。下面是一些原因&#xff1a; 资源管理和性能优化&#xff1a; 使用线程池可以更好地管理系统资源&#xff0c;控制并发线程数&#xff0c;避免创建过…

SEO 分步教程:初学者掌握的 8 个简单基础知识

如果您刚刚开始使用搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;那么分步 SEO 教程是有序的。在这一点上&#xff0c;你可能已经听说过一些基本术语&#xff0c;如关键词研究和页面优化。但是&#xff0c;您如何应用迄今为止收集的所有知识呢&#xff1f; 如果您刚刚…

k8s的存储卷

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态 一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消…

获取直播间的最新评论 - python 取两个list的差集

python 取两个list的差集 作用&#xff1a;比如我要获取评论区列表&#xff0c;先获取了一遍&#xff0c;这个时候有人评论了几条&#xff0c;我再获取一遍后&#xff0c;找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…

微信公众号——微信公众号实现发送模板消息

准备工作 在调用微信接口获取AccessToken时&#xff0c;需要使用到微信公众号的appid及appsecret&#xff0c;获取方式如下&#xff1a; 1.已有公众号 已有公众号&#xff1a; 有属于自己的公众号账户&#xff0c;登录微信公众平台(https://mp.weixin.qq.com)&#xff0c;在…

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能&#xff0c;和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器&#xff0c;片上包含精度为 1%以内的 20MHz/40MHz 时钟&#xff0c;最…

起诉业务员飞单需要什么证据?

在商业活动中&#xff0c;业务员飞单是一种常见的违规行为&#xff0c;给企业带来了巨大的经济损失。如果企业怀疑业务员存在飞单行为&#xff0c;需要收集足够的证据来证明其行为&#xff0c;并采取法律手段维护企业的合法权益。那么&#xff0c;起诉业务员飞单需要什么证据呢…

【数据库原理】(19)在实际数据库设计中关系规范化的应用

一.关系规范化的基本原则 1. 规范化的目的和基本思想 目的&#xff1a;通过分解低一级范式的关系模式&#xff0c;转换为高一级范式的关系模式集合&#xff0c;以减少数据冗余和更新异常。 基本思想&#xff1a; “一事一地”&#xff1a;确保每个关系模式只描述一个概念、实…

odoo17 | 视图操作按钮

前言 到目前为止&#xff0c;我们主要通过声明字段和视图来构建我们的模块。在上一章中&#xff0c;我们刚刚通过计算字段和onchanges引入了业务逻辑。在任何真实的业务场景中&#xff0c;我们都会希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中&#xff0c;我们希望…

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素

代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素 文章目录 代码随想录算法训练营第一天 | 704. 二分查找、27. 移除元素1 数组理论基础&#xff08;基于面试&#xff09;1.1 面试问题针对 Python1.2 面试问题针对 C 2 LeetCode 704.二分查找2.1 二分查找的实现2.2 P…

Buzz 离线音频转字幕工具(完全免费,无需登录)

关于 Buzz Buzz 是一款可以自动识别语音为文本字幕的软件工具&#xff0c;基于 OpenAI 开源的 Whisper 自动语音识别模型&#xff0c;可以批量将音频或者是视频中的内容自动转化为带有时间的字幕&#xff0c;速度非常快&#xff0c;是一款能极大提高效率的生产力小工具。 Bu…

JavaScript-对象-笔记

1.字面量创建对象、对象的使用 对象就是一组 属性和方法的集合 属性&#xff1a; 特征 相当于变量 静态 是什么 方法&#xff1a; 行为 相当于函数 动态 干什么 创建对象 创建对象的第一种&#xff1a;使用字面量 {} 对象中的元素是键值对 使用逗号隔开 键:值 的形式 var 对象名…

Vue项目在ie浏览器中显示白屏优化提示

在工作中用到Vue开发项目&#xff0c;用户在IE浏览器打开页面&#xff0c;结果显示空白屏。作为开发者当然知道是浏览器版本过低导致语法不支持&#xff0c;但是用户不知情的情况下显示空白屏就很不友好。这时候有必要在页面上做点提示语告诉用户切换浏览器&#xff0c;下面是页…

千里之行始于足下,2024年低代码数字化选型“避坑指南“

千里之行&#xff0c;始于足下。企业数字化转型建设之路&#xff0c;亦始于选型。 在转型建设的过程中&#xff0c;数字化系统的选型往往被视为最关键的环节。一旦选型不当或出现失误&#xff0c;可能导致项目进展受阻&#xff0c;甚至直接导致项目失败。因此&#xff0c;一个良…

社交距离 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。 满足:每当一个员工进入时,…

Edge扩展插件如何安装位置?

Edge浏览器的扩展插件安装后&#xff0c;它们的相关文件通常存储在以下位置&#xff1a; 在Windows操作系统上&#xff1a; plaintext %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Extensions 这个路径会根据用户的配置和系统版本有所不同。%LOCALAPPDATA% 是一个环境变…

PyTorch简单易懂的解析 Dropout Layers应用,代码示例

目录 torch.nn子模块Dropout Layers详解 nn.Dropout 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout1d 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout2d 用途 用法 使用技巧 注意事项 代码示例 nn.Dropout3d 用途 用法 使用技巧 注意事项 代码…

【算法专题】动态规划之斐波那契数列模型

动态规划1.0 动态规划 - - - 斐波那契数列模型1. 第 N 个泰波那契数2. 三步问题3. 使用最小花费爬楼梯4. 解码方法 动态规划 - - - 斐波那契数列模型 1. 第 N 个泰波那契数 题目链接 -> Leetcode -1137. 第 N 个泰波那契数 Leetcode -1137. 第 N 个泰波那契数 题目&…

git如何仅合并项目下的某个文件夹

前言 假设目前在做的一个项目名为demoproject&#xff0c;目前版本为v1.0.0&#xff0c;标准开发都是在demoproject上进行的&#xff0c;但是有一个客户需要做定制化&#xff0c;需要将项目中的一些信息改为客户的&#xff0c;于是基于demoproject拉了一个v1.0.0-custom&#…

Unity C# 异步编程模式之等待直到完成模式(wait-until-done模式)

Unity的协程使用的就是wait-until-done模式&#xff0c;下面放上完整代码&#xff1a; using UnityEngine; using System.Threading; using System;delegate int MyDel(int first, int second);//声明委托类型public class AsyncWaitUntilDoneDemo : MonoBehaviour {void Star…