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

java基础 之 Hash家族(一)

文章目录

  • HashCode
    • 定义
    • 代码使用
    • 使用场景
  • HashMap
    • 定义
    • 常用方法
    • 使用场景
  • ConcurrentHashMap
    • 定义
    • 常用方法
    • 使用场景
  • HashTable
    • 定义
    • 常用方法
    • 使用场景
  • HashSet
    • 定义
    • 常用方法
    • 使用场景
    • 你想到过吗?
  • HashMap、ConcurrentHashMap、HashTable的对比
    • 总结

HashCode

定义

  • hashcode是Object类的一个方法。它返回一个对象的哈希码值。哈希码是一个整数,它用于在哈希表(如HashMap、HashSet等)中确定该对象的存储位置,从而能够快速的对对象进行存取操作

    例如,当我们存储一个对象到HashMap中时,HashMap会使用该对象的HashCode值来确定应该将对象存储在哈希表的哪个桶(bucket)中。如果两个对象的hashCode值不同,它们通常会被存储在不同的桶中,这样可以减少查找时的比较次数

代码使用

  • 未重写hashCode

    public class HashCodeTest {public static void main(String[] args) {Person p1 = new Person("张三", 18, "男");Person p2 = new Person("张三", 18, "男");System.out.println(p1.hashCode());	// 结果:1268447657System.out.println(p2.hashCode());	// 结果:1401420256System.out.println(p1.equals(p2));	// 结果:false}
    }class Person {private String name;private int age;private String gender;public Person(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}
    }
    
  • 重写hashCode(对Person类添加如下方法)
    在这里插入图片描述

    再运行上述代码,结果为:
    804914
    804914
    true

使用场景

  • 如果两个对象根据equals(Object)方法比较是想等的,那么它们的hashCode必须相同
    点击跳转 → java基础 之 重写equals时为什么要重写hashCode

HashMap

定义

  • 1、是基于哈希表的Map接口的实现
  • 2、允许使用null值和null键,但是不能保证映射顺序
  • 3、时间复杂度在大多数情况下为O(1),最坏情况下(如哈希冲突严重)会退化到O(N)
  • 4、hashMap的key与value类型可以相同也可以不同
  • 5、内部实现原理:

    (1)底层是一个哈希表数组,每个哈希表元素是一个链表(在java8及以后,当链表长度超过一定阈值时会转换为红黑树)
    (2)当存储键值对时,会根据键对象的hashCode计算出其哈希值,然后确定在哈希表数组中的存储位置
    (3)如果多个键的哈希值相同(即哈希冲突),则它们会被存储在同一个链表或红黑树中

常用方法

    public static void main(String[] args) {Map<Integer,String> map = new HashMap<>();map.put(1,"hello"); // 添加键值对Map<Integer,String> mapTemp = new HashMap<>();mapTemp.put(2,"world");map.putAll(mapTemp);    // 添加mapTemp的键值对到map中map.putIfAbsent(2,"java");  // 先判断key为2是否存在,不存在则添加,存在则不添加System.out.println(map.get(2));     // 结果为:worldmap.putIfAbsent(3,"java");System.out.println(map.get(3));    // 结果为:javamap.remove(3);  // 删除键为3的键值对boolean contains = map.containsKey(3);  // 判断键为3的键值对是否存在map.replace(2, "java2"); // 替换键为2的值为java2map.replaceAll((key, value)-> value.toUpperCase());// 将hashMap中的所有映射关系替换成给定的函数所执行的结果,即map中所有值都变成大写String value2 =map.get(2); // 获取指定key对应的value值:结果为:java2//  获取指定key对应的value值,如果key不存在则返回给定的默认值:结果为java4String vaule4 = map.getOrDefault(4, "java4");map.forEach((key, value)-> System.out.println(key + ":" + value));  // 遍历Set<Integer> set = map.keySet();    //  获取map中所有keySystem.out.println("---------");Collection<String> values = map.values();//  获取map中所有valueInteger size = map.size();  // 计算map大小System.out.println(size);boolean  isEmpty = map.isEmpty();   // 判断map是否为空map.clear();    // 清空map}

使用场景

单线程环境。如果不需要线程安全,HashMap 是最佳选择,因为它性能高且灵活。
需要支持空键和空值。如果需要存储 null 键或 null 值,HashMap 是唯一的选择。

ConcurrentHashMap

定义

  • 1、是java中一个线程安全的哈希表实现类,属于java.util.concurrent包
  • 2、 ConcurrentHashMap在多线程环境下可以高效的进行并发操作,而不会出现线程安全问题;
  • 3、在java1.8之前,ConcurrentHashMap通过分段锁(Segment)机制来保证线程安全;从java1.8开始,ConcurrentHashMap基于CAS(Compare And Swap)操作和synchronized锁来保证线程安全

常用方法

  • 1、常用方法同HashMap,此处不多说

  • 2、下面的方法是用来验证ConcurrentHashMap的线程安全的

    public static void main(String[] args) throws InterruptedException {ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();int threadCount = 10;CountDownLatch latch = new CountDownLatch(threadCount);// 启动多个线程并发写入for(int i=1;i<threadCount+1;i++){new Thread(()->{for(int j=1;j<1001;j++){String key = "key"+j;map.merge(key,1,Integer::sum);}latch.countDown();}).start();}latch.await();int total = map.values().stream().mapToInt(Integer::intValue).sum();System.out.println("总数为"+total);  
    }
    

    代码说明:

    • 1、无论打印几次,结果都是10000
    • 2、使用 map.merge(key, 1, Integer::sum) 原子性地更新键值对:
      (1)如果键不存在,直接将键值对 (“key” + j, 1) 写入 map。
      (2)如果键已经存在,调用 Integer::sum 方法,将当前值与 1 相加,然后更新键值对。
    • 3、每个线程完成写入操作后,调用 latch.countDown(),表示该线程已完成
    • 4、使用 map.values() 获取 map 中的所有值:
      (1)使用 stream() 将值集合转换为流。
      (2)使用 mapToInt(Integer::intValue) 将 Integer 对象转换为原始 int 类型。
      (3)使用 sum() 计算所有值的总和。
  • 大家也可以将ConCurrentHashMap替换成HashMap,然后运行,运行结果一定是小于10000的;

使用场景

  • 1、多线程环境下的缓存

    在多线程应用中,ConcurrentHashMap常用于实现线程安全的缓存。
    多个线程可以并发的读取和更新缓存数据,而不会出现数据不一致的问题。

  • 2、统计和计数

    ConcurrentHashMap适用于需要统计或计数的场景,尤其是多线程环境下

  • 3、线程安全的共享数据结构

    在多线程应用中,ConcurrentHashMap可以作为共享数据结构,允许多个线程安全的读取和更新数据

  • 4、分布式系统中的本地缓存

    在分布式系统中,ConcurrentHashMap可以用作本地缓存,存储从远程服务器获取的数据。多个线程可以并发的访问和更新缓存,提高系统的性能和响应速度

  • 5、高并发的web应用

    在高并发的web应用中,ConcurrentHashMap可以用于存储用户会话信息、配置信息等。它能够高效的处理多个请求的并发访问,提高系统的吞吐量。

  • 6、实时数据处理

    在实时数据处理系统中,ConcurrentHashMap可以用于存储和更新试试数据,例如股票价格、传感器数据等。多个线程可以并发的读取和更新数据,确保数据的实时性和准确性。

HashTable

定义

  • 1、HashTable是java中一个古老的线程安全的哈希表实现类,继承了Dictionary类,并实现了Map接口
    在这里插入图片描述

  • 2、HashTable的设计目标是提供线程安全的哈希表操作,但它在性能和灵活性上不如ConcurrentHashMap和HashMap

  • 3、HashTable是一个线程安全的哈希表,它通过同步方法(synchronized)来保证线程安全。即在多线程环境下,多个线程可以并发的访问和修改HashTable,而不会出现数据不一致的问题。

常用方法

  • 同HashMap

使用场景

  • 1、线程安全的共享数据
  • 2、HashTable可以存储配置信息
  • 3、旧代码兼容

HashSet

定义

  • 1、HashSet是java中一个基于哈希表实现的集合类,属于java.util包
  • 2、HashSet不允许重复的元素,并且不保证元素的顺序
  • 3、HashSet是线程不安全的,如果需要线程安全的集合,可以使用Collections.synchronizedSet或ConcurrentHashMap.newKeySet()
  • 4、HashSet是一个实现了Set接口的集合类。它使用哈希表来存储元素。由于哈希表的特性,HashSet提供了高效的添加、删除和查找操作,平均时间复杂度为O(1)
    在这里插入图片描述

常用方法

public static void main(String[] args) {HashSet<String> set = new HashSet<>();// 添加元素set.add("hello");set.add("world");set.add("hello");set.add("java");// 遍历集合for(String s : set){System.out.print(s+" ");  // hello world java(顺序可能不同)}// 集合的长度System.out.println(set.size()); // 3// 判断集合中是否包含某个元素System.out.println(set.contains("hello"));  // trueSystem.out.println(set.contains("python")); //  false// 删除集合中的元素System.out.println(set.remove("hello"));    //  trueSystem.out.println(set.remove("python"));   //  falseSystem.out.println(set.size()); // 2  只剩下了world javaHashSet<String> anotherSet = new HashSet<>();anotherSet.add("apple");anotherSet.add("banana");anotherSet.add("watermelon");// 添加另一个集合的元素set.addAll(anotherSet);for(String s : set){System.out.print(s+"  ");   // banana  apple  world  java  watermelon(顺序可能不同)}System.out.println();// 迭代器遍历Iterator<String> iterator = set.iterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");  //  banana  apple  world  java  watermelon(顺序可能不同)}// 转换成数组Object[] arr = set.toArray();   // set集合转换成数组String[] strArr = set.toArray(new String[0]);   // set集合转换成String数组// retainAll(): 交集,返回的结果是该集合有没有被更改(假设set中有world、java、banana、orange、watermelon )System.out.println(set.retainAll(anotherSet));  //  true:保留的是banana、apple、watermelonSystem.out.println("-------");// removeAll(): 差集,返回的结果是该集合有没有被更改(假设set中有world、java、banana、orange、watermelon )System.out.println(set.removeAll(anotherSet));  //  true;保留的是world javaset.clear();System.out.println(set.isEmpty());//  true}

使用场景

  • 去重:可以用来去除重复的元素
  • 快速查找:HashSet提供了高效的查找操作,适用于快速判断某个元素是否存在的场景
  • 存储唯一标识符:HashSet可以用来存储唯一标识符,例如用户ID、文件名等
  • 集合运算:addAll实现集合的并集、retainAll 实现集合的交集、removeAll实现集合的差集

你想到过吗?

  • 如果hashset中的内容不变,每次遍历出来的内容顺序应该是固定的

    如果 HashSet 中的内容不变,每次遍历出来的内容顺序应该是一个固定的顺序,但这个顺序是不确定的,无法预先知晓。

    1. 固定的顺序(在内容不变的情况下)

      • HashSet 中的元素确定后,只要没有对集合进行任何修改操作(如添加、删除元素等),那么元素在哈希表中的存储位置就不会改变。在遍历时,会按照桶的顺序以及桶中元素的存储顺序来访问元素。对于具体的实现(如 Java 中的 HashSet 实现),如果没有对集合进行修改,每次遍历都会按照相同的顺序访问元素。

      • 例如:

        public static void main(String[] args) {Set<String> hashSet = new HashSet<>();hashSet.add("hello");hashSet.add("world");hashSet.add("java");hashSet.add("java");hashSet.add("python");for(String s : hashSet){System.out.print(s+" ");  // python  world java hello}System.out.println();Iterator<String> iterator = hashSet.iterator();while(iterator.hasNext()){System.out.print(iterator.next()+" ");  // python  world java hello}
        }
        
      • 假设在这两次遍历之间没有对 hashSet 进行修改,那么两次遍历的输出顺序是相同的

    2. 顺序不确定的原因(从整体特性角度)

      • HashSet 是基于哈希表实现的,元素的存储位置主要由元素的哈希值决定。它不保证集合中元素的顺序,因为哈希表的存储机制不是按照元素的添加顺序或者其他自然顺序来组织的。
      • 不同的元素可能因为哈希值和桶的分配规则而有不同的存储位置顺序,这个顺序与元素添加的顺序无关。
    3. 不能保证顺序固定的原因(从不同实现或环境角度)

      • 不同的 Java 实现(如不同供应商的 JDK)可能会对 HashSet 的内部实现进行优化,例如改变桶的分配策略或者哈希值的计算方式等。这些改变可能会导致元素的存储顺序不同,从而影响遍历顺序。
      • 即使在同一个 Java 实现中,不同的运行环境(如不同的硬件架构、操作系统等)也可能导致 HashSet 的内部存储和遍历顺序出现差异,因为底层的内存管理等因素可能会间接影响哈希表的存储和访问方式。

HashMap、ConcurrentHashMap、HashTable的对比

  • 线程安全性
    • HashMap是非线程安全

      HashMap 的方法(如 put、get、remove 等)没有同步机制,因此在多线程环境中,多个线程同时对 HashMap 进行写操作可能会导致数据不一致或并发错误

    • Hashtable是线程安全

      Hashtable 的方法是同步的(synchronized),这意味着在多线程环境中,多个线程可以安全地并发访问和修改 Hashtable,而不会导致数据不一致。

    • ConcurrentHashMap是线程安全

      ConcurrentHashMap 使用了更细粒度的锁(分段锁或基于 CAS 的锁)来实现线程安全,而不是像 Hashtable 那样对整个表进行同步。这使得 ConcurrentHashMap 在多线程环境中性能更高。

  • 性能
    • HashMap性能高

      由于没有同步机制,HashMap 在单线程环境中性能非常高,适合频繁的读写操作。
      在多线程环境中,需要额外的同步机制(如 Collections.synchronizedMap)来保证线程安全,但这会增加性能开销。

    • Hashtable性能低

      由于所有方法都是同步的,Hashtable 在多线程环境中虽然安全,但性能较差。每次只有一个线程可以访问表,这会导致较高的锁开销。

    • ConcurrentHashMap性能高

      ConcurrentHashMap 使用了分段锁或基于 CAS 的锁机制,允许多个线程同时访问不同的段,从而显著提高了并发性能。

    • 在高并发场景中,ConcurrentHashMap 的性能远优于 Hashtable

  • 空值处理
    • HashMap支持空键和空值

      HashMap 允许一个键为 null,也允许多个值为 null。

    • Hashtable不支持空键和空值

      Hashtable 不允许键或值为 null,否则会抛出 NullPointerException。

    • ConcurrentHashMap不支持空键,但支持空值

      ConcurrentHashMap 不允许键为 null,但允许值为 null。

  • 迭代器
    • HashMap迭代器是快速失败的(fail-fast)

      如果在迭代过程中修改了集合(除了通过迭代器的 remove 方法),会抛出 ConcurrentModificationException。

      Iterator<Map.Entry<String, Integer>> iterator = hashMap.entrySet().iterator();
      while (iterator.hasNext()) {Map.Entry<String, Integer> entry = iterator.next();hashMap.put("newKey", 2); // 抛出 ConcurrentModificationException
      }
      
    • Hashtable迭代器也是快速失败的

      与 HashMap 类似,如果在迭代过程中修改了集合,会抛出 ConcurrentModificationException

    • ConcurrentHashMap迭代器是弱一致的(weakly consistent)

      迭代器不会抛出 ConcurrentModificationException,并且在迭代过程中允许对集合进行修改。迭代器返回的元素是基于当前迭代状态的快照,可能会遗漏或重复某些元素。

  • 使用场景
    • Hashtable过时的类

      Hashtable 是早期 Java 中的类,现在不推荐使用。如果需要线程安全,建议使用 ConcurrentHashMap 或通过 Collections.synchronizedMap 包装 HashMap。

    • ConcurrentHashMap高并发环境

      在多线程环境中,ConcurrentHashMap 是最佳选择,因为它提供了高性能的线程安全机制。
      需要线程安全且不支持空键。如果需要线程安全且不允许空键,ConcurrentHashMap 是合适的选择。

总结

  • HashMap:单线程环境,高性能,支持空键和空值。
  • Hashtable:线程安全但性能低,不支持空键和空值,已过时。
  • ConcurrentHashMap:高并发环境,高性能,线程安全,不支持空键但支持空值。
    在实际开发中,推荐使用 HashMap 和 ConcurrentHashMap,尽量避免使用 Hashtable。

相关文章:

java基础 之 Hash家族(一)

文章目录 HashCode定义代码使用使用场景 HashMap定义常用方法使用场景 ConcurrentHashMap定义常用方法使用场景 HashTable定义常用方法使用场景 HashSet定义常用方法使用场景你想到过吗&#xff1f; HashMap、ConcurrentHashMap、HashTable的对比总结 HashCode 定义 hashcode是…...

windows服务器部署jenkins工具(二)

jenkins的大致流程&#xff1a;新增任务->配置任务->构建&#xff08;打包&#xff09;项目->部署&#xff08;发布&#xff09; 具体如何使用&#xff0c;我这里就不多讲了。这次就给大家讲讲&#xff0c;jenkins安装之后使用过程中存在的一些问题。 1.maven项目如…...

机器学习第二十讲:网格搜索 → 像尝试所有密码组合找最佳解锁方式

机器学习第二十讲&#xff1a;网格搜索 → 像尝试所有密码组合找最佳解锁方式 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 网…...

【人工智能发展史】从黎明到曙光01

人工智能的史诗&#xff1a;从黎明到曙光 序曲&#xff1a;晨曦微露 故事的序幕拉开于一个思想激荡的年代&#xff0c;1956年&#xff0c;达特茅斯会议的钟声&#xff0c;如同第一缕晨曦&#xff0c;宣告了"人工智能"纪元的到来。那个夏天&#xff0c;在新罕布什尔…...

ollama使用gpu运行大模型

罗列ollma镜像 ollama list拉取ollama镜像源里面的模型&#xff1a; ollama pull qwen2:1.5b下载CudaToolkit https://developer.nvidia.com/cuda-toolkit-archive 我这里选择11.7的万金油版本&#xff0c;从来没出过bug Ollama安装好后&#xff0c;为了让推理跑在GPU上&am…...

Linux电源管理——PSCI初始化流程和多核启动流程

目录 一、PSCI 初始化流程 1、PSCI设备树节点 2、PSCI kernel初始化流程 get_set_conduit_method set_conduit psci_probe 二、CPU PSCI 操作初始化流程 1、CPU 设备树节点 2、 struct cpu_operations 3、kernel 流程 cpu_read_bootcpu_ops smp_init_cpus 三、CPU…...

Linux问题排查-引起服务器带宽使用率高的内鬼

Linux网络流量监控与瓶颈分析全攻略&#xff1a;从基础命令到进程级方案 一、网络带宽查询与实时流量监控 1. 查询主机网络带宽 网卡理论带宽 通过ethtool命令查看网卡最大支持速率&#xff0c;例如&#xff1a; ethtool eth0 # 替换为实际网卡名&#xff08;如ens33&#x…...

《微服务架构设计模式》笔记

思维导图 1-3章 4-6 章 5-13 章 资料 配套代码仓库&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者网站&#xff1a;https://microservices.io/...

基于JDBC的信息管理系统,那么什么是JDBC呢?

JDBC 即 Java Database Connectivity&#xff0c;是 Java 语言中用于与数据库进行交互的一套 API。它提供了一种标准的方式&#xff0c;让 Java 程序能够连接到各种不同类型的数据库&#xff0c;并执行 SQL 语句来实现对数据库的查询、插入、更新和删除等操作。 主要功能 建立…...

百度地图的地铁图API所有城市的城市名和citycode的对照关系列表

百度地图的地铁图API所有城市的城市名和citycode的对照关系列表 城市keywordcitycode北京beijing131上海shanghai289广州guangzhou257深圳shenzhen340重庆chongqing132天津tianjin332石家庄shijiazhuang150南京nanjing315成都chengdu75沈阳shenyang58杭州hangzhou179武汉wuhan2…...

信息学奥赛一本通 1853:【08NOIP提高组】传纸条 | 洛谷 P1006 [NOIP 2008 提高组] 传纸条

【题目链接】 ybt 1853&#xff1a;【08NOIP提高组】传纸条 洛谷 P1006 [NOIP 2008 提高组] 传纸条 【题目考点】 1. 动态规划&#xff1a;坐标型动态规划 【解题思路】 抽象问题&#xff0c;存在m乘n的网格&#xff0c;每个格子中有一个数值&#xff0c;即同学愿意帮忙的…...

APM32小系统键盘PCB原理图设计详解

APM32小系统键盘PCB原理图设计详解 一、APM32小系统简介 APM32微控制器是国内半导体厂商推出的一款高性能ARM Cortex-M3内核微控制器&#xff0c;与STM32高度兼容&#xff0c;非常适合DIY爱好者用于自制键盘、开发板等电子项目。本文将详细讲解如何基于APM32 CBT6芯片设计一款…...

【Linux我做主】探秘进程与fork

进程和fork 父子进程和forkgithub地址前言1. 进程的标识符PID1.1 查看系统内所有的进程1.2 kill杀掉进程1.3 获取进程的PID1.4 bash与父子进程 2. 创建进程与fork2.1 fork创建子进程2.2 fork困惑的解释0. fork的工作原理1. 为什么给子进程返回0&#xff0c;给父进程返回子进程P…...

学习python day4

1.顺序语句结构 #赋值语句 name张三 age20 a,b,c,droom#字符串分解赋值 print(a,b,c,d) #输入输出也是典型的顺序结构 nameinput(请输入您的姓名&#xff1a;) ageeval(input(请输入您的年龄&#xff1a;)) #使用eval进行转换 print(姓名&#xff1a;,name) print(年龄&#x…...

如何通过外链建设提升Shopify独立站的权重和排名

一、外链质量评估与筛选原则 相关性优先 选择与自身行业、产品或目标用户群体高度相关的网站&#xff08;如行业论坛、垂直媒体、评测博客&#xff09;交换外链&#xff0c;避免低相关性垃圾链接导致搜索引擎惩罚。 权威性指标 关注外链来源网站的域名权威&#xff08;DA…...

高并发内存池|六、page cache的设计

六、page cache的设计 1. page cache的结构 page cache 也是一个哈希桶结构&#xff0c;但它的映射结构与前两个 cache 不同。它的每一个桶是容量从 1 到 128 页大小的内存块&#xff0c;桶中的每个内存块由 SpanList 管理。page cache 的内存由其向系统申请所得&#xff0c;…...

C++线程池实现

C线程池实现 知识点补充为什么要实现线程池线程池的实现过程 知识点补充 在C11中引入了对线程库的支持&#xff0c;接下来我们介绍一下跟线程相关的一些知识点&#xff1a; 线程对象的构造方式 在C11中主要提供的三种线程的构造方式&#xff1a;无参构造、带参构造和调用移动构…...

#Redis缓存篇#(七)分布式缓存

目录 一 单节点Redis 1 单节点的问题 二 分布式缓存 1 Redis持久化 &#xff08;1 RDB持久化 &#xff08;2 AOF持久化 2 Redis主从集群 &#xff08;1 搭建主从架构 &#xff08;2 主从数据同步原理 3 Redis哨兵 &#xff08;1 哨兵的作用和原理 &#xff08;2 搭…...

【VSCode】安装与 ssh 免密登录

【VSCode】安装与 ssh 免密登录 下载SSH 登录设置免密登录关闭远程连接删除ssh连接&#xff08;慎用&#xff01;&#xff01;&#xff01;删除了建立的连接就没有了&#xff01;&#xff01;&#xff09; 下载 https://code.visualstudio.com/docs/?dvwin64user 选择安装路径…...

【Python解决八皇后问题】回溯算法与优化策略全解析

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现基础回溯实现位运算优化…...

判断一个元素是否在可视区域

判断元素是否在可视区域的方法 方法一:offsetTop 和 scrollTop 通过计算元素的 offsetTop 和容器的 scrollTop 来判断元素是否位于视口内。这种方法适用于简单的垂直滚动场景。 优点: 实现简单,性能较好。缺点: 不支持复杂的布局结构(如嵌套滚动),无法处理水平方向上的可…...

作物遗传与种质创新利用全国重点实验室-随笔10

作物遗传与种质创新利用全国重点实验室依托于南京农业大学&#xff0c;2022年11月完成国家重点实验室重组工作&#xff0c;由原名称“作物遗传与种质创新国家重点实验室”正式更名为“作物遗传与种质创新利用全国重点实验室”。 实验室面向国家粮食安全和农业高质量发展的重大战…...

分布式电源的配电网无功优化

分布式电源(Distributed Generation, DG)的大规模接入配电网,改变了传统单向潮流模式,导致电压波动、功率因数降低、网损增加等问题,无功优化成为保障配电网安全、经济、高效运行的关键技术。 1. 核心目标 电压稳定性:抑制DG并网点(PCC)及敏感节点的电压越限(如超过5%…...

游戏引擎学习第301天:使用精灵边界进行排序

回顾并为今天的内容做准备 昨天&#xff0c;我们解决了一些关于排序的问题&#xff0c;这对我们清理长期存在的Z轴排序问题很有帮助。这个问题我们一直想在开始常规游戏代码之前解决。虽然不确定是否完全解决了问题&#xff0c;但我们提出了一个看起来合理的排序标准。 有两点…...

网络框架二次封装:基于Kotlin的高扩展性网络请求框架完整实现

完整目录结构 1. 架构设计1.1 分层架构1.2 核心组件1.3 接口关系图2. 基础配置实现2.1 NetworkConfig完整代码2.2 CacheConfig完整代码3. 核心网络客户端3.1 SmartHttpClient完整实现3.2 单例管理3.3 服务创建与执行4. DSL请求构建器4.1 NetworkRequest完整实现4.2 生命周期绑…...

高噪声下扩展边缘检测算子对检测边缘的影响

目录 一、常见的边缘检测算子 二、扩展边缘检测算子对检测边缘的影响 三、结论 一、常见的边缘检测算子 Sobel 算子: Prewitt算子;...

Linux 内核音视频架构(V4L2 )介绍

一.概述 Linux 内核中的 V4L2&#xff08;Video for Linux Two&#xff09;框架 是用于管理音视频设备&#xff08;如摄像头、电视调谐器、视频采集卡等&#xff09;的核心子系统。 它提供了一套统一的接口&#xff0c;使得用户空间应用程序能够方便地访问和控制硬件设备&…...

专业 YouTube SEO 方案:打造高排名视频的关键步骤

YouTube 是全球订阅量最高的社交媒体平台之一。YouTube 为发布创意视频内容和针对特定受众开展营销活动提供了无限可能&#xff0c;是任何品牌内容营销策略的重要组成部分。 但是&#xff0c;为了发展您的 YouTube 频道并消除噪音&#xff0c;优化您的视频内容以便可以在搜索结…...

基于STM32的智能台灯_自动亮度_久坐提醒仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)

这里写目录标题 1.主要功能2.仿真设计3.程序设计4.设计报告5.下载链接 基于STM32的智能台灯_自动亮度_久坐提醒仿真设计 (Proteus仿真程序设计设计报告讲解视频&#xff09; 仿真图Proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1…...

labview硬件部分——压力测量

0kg的电压需要我们手动输入&#xff01;在不放东西的时候的电压&#xff0c;先运行一次程序&#xff0c;将其记录后写到程序中的0kg输入按键即可。 整体的程序&#xff1a;...

Mysql索引实战1

对于上面这两种 name>‘a’ 和 name>‘zzz’ 的执行结果&#xff0c;mysql最终是否选择走索引或者一张表涉及多个索引&#xff0c;mysql最终如何选择索引&#xff0c;我们可以用trace工具来一查究竟&#xff0c;开启trace工具会影响mysql性能&#xff0c;所以只能临时分析…...

在实际网络部署中,静态路由的优先级通常高于RIP

是的&#xff0c;在实际网络部署中&#xff0c;静态路由的优先级通常高于RIP&#xff0c;尤其是在中小型网络或对可控性要求高的场景中。以下是关键原因和典型应用场景分析&#xff1a; 1. 为何静态路由比RIP更受青睐&#xff1f; (1) 简单性与可靠性 静态路由&#xff1a; 手…...

Linux系统编程-DAY02

一、标准io 1.写文件 fgets函数中判断有多少行&#xff0c;且判断最后一个是不是终止符 if( buf[strlen(buf) - 1] \n ) 2. wc命令行&#xff1a;字符统计 wc -l 文件名 行数 文件名 3. write 用于操作二进制的文件&#xff08;文办文件和图片文件也可以…...

【C++ 真题】P5736 【深基7.例2】质数筛

P5736 【深基7.例2】质数筛 题目描述 输入 n n n 个不大于 10 5 10^5 105 的正整数。要求全部储存在数组中&#xff0c;去除掉不是质数的数字&#xff0c;依次输出剩余的质数。 输入格式 第一行输入一个正整数 n n n&#xff0c;表示整数个数。 第二行输入 n n n 个正…...

自制操作系统day6(GDTR、段描述符、PIC、实模式和保护模式、16位到32位切换、中断处理程序、idt的设定、EFLAG寄存器)(ai辅助整理)

day6 分割源文件&#xff08;harib03a&#xff09; 优点 按照处理内容进行分类&#xff0c;如果分得好的话&#xff0c;将来进行修改时&#xff0c;容易找到地方。如果Makefile写得好&#xff0c;只需要编译修改过的文件&#xff0c;就可以提高make的速度。单个源文件都不长。…...

大模型评测与可解释性

随着大模型在各个领域展现出惊人的能力,我们对其性能的评估和对其决策过程的理解变得尤为重要。一个模型即使在基准测试中表现出色,也可能在实际应用中遇到意想不到的问题。同时,由于大模型的复杂性,它们常常被视为“黑箱”,这给其在关键领域的应用带来了挑战。 本章将深…...

【TTS回顾】StyleTTS 深度剖析:TTS+风格迁移

写在前面 这篇博客我们回顾一下StyleTTS,当时的背景是,文本转语音(TTS)技术,早已不再满足于仅仅将文字转化为可听的语音。行业需要的是“真人TTS”,AI 不仅能“说得清楚”,更能“说得生动”、“说得有感情”,甚至能模仿特定人物的说话风格。富有表现力的语音合成,即能…...

GStreamer (四)交叉编译

交叉编译 下载链接库交叉编译1、下载Gstreamer &#xff08;方式二 &#xff09;&#xff0c;进入到编译目录2、在gst-build目录下创建交叉编译配置文件cross_file.txt3、修改meson_options.txt中libmount选项为false&#xff0c;否则编译前需要先编译libmount。4、在gst-build…...

电路设计基础

只有当电容两端的电压等于0伏的时候&#xff0c;就是这一点的电压和这一点电压之间没有压差的时候&#xff0c;我门才可以把电容当成是一根导线&#xff0c;如果当我电容比如说它己经充到有一个1伏的电压了&#xff0c;这个时候我们是不可以把电容当成是导线的&#xff0c;所以…...

C语言——函数递归与迭代

&#xff08;1&#xff09;递归的例子&#xff1a; 顺序打印一个整数&#xff0c;打印整数的每一位。 例如&#xff1a; input:1234 output:1 2 3 4 input:520 output:5 2 0 我们可能会想到用这种方法&#xff1a;&#xff08;但是运行之后&#xff0c;我们发现结果是事…...

详解 C# 中基于发布-订阅模式的 Messenger 消息传递机制:Messenger.Default.Send/Register

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

8 种快速易用的Python Matplotlib数据可视化方法

你是否曾经面对一堆复杂的数据&#xff0c;却不知道如何让它们变得直观易懂&#xff1f;别慌&#xff0c;Python 的 Matplotlib 库是你数据可视化的最佳伙伴&#xff01;它简单易用、功能强大&#xff0c;能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…...

嵌入式开发学习日志(linux系统编程--文件读写函数(2))Day25

一、linux操作命令 【wc】&#xff1a;指定字符统计&#xff1b; 【file 文件名】&#xff1a;可以查看文件的类型&#xff1b; 二、写入函数【fwrite】————可写入二进制文件 形式&#xff1a; size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE…...

离线服务器Python环境配置指南

离线服务器Python环境配置指南&#xff1a;避坑与实战 0. 场景分析&#xff1a;当服务器与世隔绝时 典型困境&#xff1a; 无法访问国际网络&#xff08;如PyPI、Conda官方源&#xff09;服务器处于内网隔离环境安全策略限制在线安装 解决方案矩阵&#xff1a; 方法适用场…...

Java线程池调优与实践经验

在Java面试中&#xff0c;线程池调优是一个常见且重要的考察点&#xff0c;尤其是当涉及Spring生态时&#xff0c;ThreadPoolTaskExecutor的使用经验通常会被深入追问。以下是针对该问题的结构化回答&#xff0c;结合原理、实践和调优经验&#xff1a; 1. 线程池调优的核心参数…...

Python 包管理工具核心指令uvx解析

uvx 是 Python 包管理工具 uv 的重要组成部分&#xff0c;主要用于在隔离环境中快速运行 Python 命令行工具或脚本&#xff0c;无需永久安装工具包。以下是其核心功能和使用场景的详细解析&#xff1a; 一、uvx 的定位与核心功能 工具执行器的角色 uvx 是 uv tool run 的别名&a…...

力扣-三数之和

1.题目描述 2.题目链接 LCR 007. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 3.题目代码 import java.util.*; class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);int tempnums.length-1;Set<List<Integer>…...

【AI模型学习】ESM2

文章目录 1. 版本2. 开始2.1 安装2.2 使用预训练模型2.2.1 代码2.2.2 讲解 2.2 结构预测 3. 任务类型总结1. 蛋白质结构预测&#xff08;ESMfold&#xff09;2. 特征嵌入提取&#xff08;esm-extract&#xff09;3. 零镜头变体预测&#xff08;ESM-1v/ESM-2&#xff09;4. 逆向…...

c++11特性——可变参数模板及emplace系列接口

文章目录 可变参数模板基本语法和使用sizeof...运算符 从语法角度理解可变参数模板包扩展通过编译时递归解析参数包直接对解析行为展开 emplace系列接口举例讲解emplace_back的实现 可变参数模板 可变参数模板是c11新特性中极其重要的一节。前文我们提到过&#xff0c;c11中对…...

深入理解 Pre-LayerNorm :让 Transformer 训练更稳

摘要 在超深 Transformer 与大语言模型&#xff08;LLM&#xff09;时代&#xff0c;归一化策略直接决定了模型能否稳定收敛、推理性能能否最大化。把归一化层从 “残差之后” 挪到 “子层之前”&#xff08;Pre-LayerNorm&#xff0c;Pre-LN&#xff09;&#xff0c;再将传统…...