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

[入门JAVA数据结构 JAVADS] 哈希表的初步介绍和代码实现

目录

前言

哈希表的概念和诞生的原因

 哈希冲突

简单实现哈希表

基本属性

 插入

获取key的val

计算负载因子

 扩容(难点)

完整代码(方便大家复制自己去调试)

数据是int的

使用泛型实现的

结尾 

前言

笔者鸽了接近两个月后决定"勤政"了.尽力把学过的知识写下来.为了我自己,也为了我的读者.

本博客展示代码 均在本人的Github 有备份,地址为 MyJava/JavaDS2 at main · calljsh/MyJava

如果您觉得对您有启发和帮助,还请给个赞或者收藏,谢谢您

哈希表的概念和诞生的原因

我们如果正常想要去一组数据集合中找某一个数据,时间复杂度必然都不是O(1), 因为我们要进行多次的比较 搜索的效率取决于搜索过程中元素的比较次数。所以我们需要一个理想的方法,让搜索的过程一次就好!

如果构造一种存储结构,通过某种函 使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快 找到该元素 。哈希表就这么产生了!
哈希表(Hash Table)是一种数据结构,用于通过计算元素的哈希值来高效地存储和查找数据。它是基于数组实现的,并且通过哈希函数将元素映射到数组中的一个位置(即桶或槽),从而实现快速查找、插入和删除操作。 

通俗来说就是一个查字典的过程, 我们可以通过查读音或者查部首来存储和确定汉字的位置,字典就是哈希表,查读音或者查部首就是哈希函数,汉字就是我们的数据

通过查阅资料可知,哈希表的基本组成大概有这么几个部分

  • 哈希函数(Hash Function)
    哈希函数是哈希表的核心,负责将输入的键(Key)映射到表中的一个索引位置。理想的哈希函数能够均匀地分配键值,尽量减少碰撞。常见的哈希函数有除法法(通过键对一个素数取余)和乘法法(通过键与常数相乘后取余)等。

  • 桶(Bucket)或槽(Slot)
    哈希表内部通常使用一个数组来存储元素,每个数组元素被称为一个“桶”或“槽”。每个桶可以存放多个键值对,通常通过哈希函数计算得出的位置来决定数据放置在哪个桶中。桶的数量通常是哈希表的大小。

  • 碰撞处理机制(哈希冲突)(Collision Resolution)
    当两个不同的键通过哈希函数计算得出相同的索引位置时,称为碰撞(哈希冲突)。为了解决碰撞问题,哈希表采用不同的碰撞处理策略,常见的有:

    • 链式地址法(Chaining):每个桶存储一个链表(或其他数据结构),当发生碰撞时,将元素追加到该链表中。
    • 开放地址法(Open Addressing):如果发生碰撞,哈希表会按照一定的探测方式(如线性探测、二次探测或双重哈希)查找下一个空桶存放元素。
  • 负载因子(Load Factor)
    负载因子是哈希表中元素数量与桶的数量之间的比值。负载因子过高会导致频繁碰撞,从而降低性能。因此,哈希表通常会在负载因子超过某个阈值时进行扩容,增加桶的数量,以保持操作的效率。

  • 扩容(Rehashing)
    当哈希表的负载因子超过一定阈值时,哈希表会进行扩容。扩容通常是通过创建一个更大的数组,并重新计算所有元素的哈希值,重新分配到新的桶中。扩容通常是一个时间复杂度较高的操作,因此需要合理设置负载因子来平衡空间与时间效率。

举个例子 例如:数据集合{176459}

我们设置一个  哈希函数  hash(key) = key %cap , 假设我们的 cap = 10; 那么每个数据位置应该如下图所示

 哈希冲突

从举例来看,如果我再添加几个数据,例如14,15,16,17这不炸了吗?数组上已经有了数据了,这几个数据我们应该放到哪里去? 没错,这就是哈希冲突

对于两个数据元素的关键字 和 (i != j) ,有 != ,但有: Hash( ) == Hash( ) ,即: 不同关键字通过相同哈 希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞
常见的的缓解这一现象的方法上面已经举例过了,但尽管如此,资料表明,哈希冲突是不可避免的,我们只能通过更精细的设计去降低它带来的负面效果.
已经在理论上说了很多了,我们重点还是移动到我们的代码上,接下来,笔者自己通过" 链式地址法"去实现一个简单的哈希表.

简单实现哈希表

首先我们要明确一点,我们在这里实现的哈希表是一个"链表数组",也就是说,数组的每个索引都是一个链表

链式地址法(Chaining):每个桶存储一个链表(或其他数据结构),当发生碰撞时,将元素追加到该链表中。

如图所示

基本属性

首先我们要构建好结点,每个结点都需要有key 和 value, 还需要地址域,作为一个内部类.

    static class Node {public int key;public int val;public Node next;public Node(int key, int val) {this.key = key;this.val = val;}}

然后 创建 Node数组,写好我们的负载因子,选择0.75是因为JAVA系统库限制的负载因子为0.75 

    public Node[] arr;public int usedsize;public  static final   float  loadnum = 0.75f;public Hashmap() {this.arr = new Node[10];  // 初始化数组容量为 10}

 插入

插入方法的思路比较明确和简单,首先根据我们的哈希函数确定数据应该放的位置a,然后看看位置a是否已经有了其他的数据,如果有,就通过尾插法插入到链表的最后去(相同的key就对val进行替换),最后计算负载因子,如果超过0.75就进行扩容. 代码如下

  public void put(int key, int val) {int idx = key % arr.length;Node cur = arr[idx];// 如果链表已经存在,检查是否有相同 keywhile (cur != null) {if (cur.key == key) {cur.val = val;  // 更新值return;}cur = cur.next;}// 插入新节点(尾插法)Node newNode = new Node(key, val);// 如果当前桶为空,直接插入if (arr[idx] == null) {arr[idx] = newNode;} else {// 否则,找到链表的尾部插入新节点Node cur2 = arr[idx];while (cur2.next != null) {cur2 = cur2.next;}cur2.next = newNode;}usedsize++;if(loadnum()>loadnum){resize();}}

获取key的val

为了更方便地获取某个key的值也是我们创建哈希表的初衷,具体的思路就是查找它的哈希地址,然后遍历该索引的链表,去查找是否有对应key的val. 代码如下

    public  int get(int key){int idx = Math.abs(key % arr.length);Node cur = arr[idx];while(cur!=null){if(cur.key == key){return cur.val;}cur = cur.next;}return -1;}

计算负载因子

写一个私有方法,计算负载因子

负载因子(Load Factor)
负载因子是哈希表中元素数量与桶的数量之间的比值。负载因子过高会导致频繁碰撞,从而降低性能。因此,哈希表通常会在负载因子超过某个阈值时进行扩容,增加桶的数量,以保持操作的效率。

    private  float  loadnum(){return usedsize*1.0f/arr.length;}

 扩容(难点)

接下来就是我们的扩容,当计算到的负载因子>0.75时,我们就需要扩容,但是扩容要怎么扩?

我给出如下的具体思路

扩容操作的基本思路

  1. 创建新数组:我们需要一个新的、更大的数组来存储哈希表中的元素。在这个方法中,新数组的大小是当前数组大小的两倍(arr.length * 2)。
  2. 重新计算哈希值:由于哈希表的大小发生了变化,原有的哈希值将不再适用。我们需要根据新的数组大小重新计算每个元素的哈希值,并将元素重新放入新的数组中。
  3. 迁移元素:将原数组中的元素逐一移到新的数组中。元素需要根据新的数组大小(即新的桶数)重新定位到适当的位置。

1.扩容

 Node [] newarr = new Node[arr.length*2];

2.遍历旧数组

 for(int i=0;i<arr.length;i++){Node cur = arr[i];

为什么要创建结点呢?因为我们使用了链式法解决哈希冲突,所以每个桶的元素可能是一个链表

3.遍历链表并重新映射元素

            while(cur != null){Node temp = cur.next;int idx = cur.key % newarr.length;// 新的地址cur.next = newarr[idx];newarr[idx] = cur;cur = temp;}
  • 对于每个非空桶(链表),我们遍历该链表并将其中的每个元素(Node cur)从原数组中迁移到新数组中。
  • 重新计算索引:对于每个元素,我们重新计算它在新数组中的位置,使用新的数组长度来计算哈希值(cur.key % newarr.length)。这保证了每个元素被分配到新的桶(槽)中。
  • 重新连接链表:将原来的链表节点(cur)插入到新的数组桶中。由于我们采用链式法(cur.next = newarr[idx]),每次插入的元素都会成为该桶的链表头。
  • 移动到下一个节点:遍历链表,直到遍历完所有的元素(cur = temp)。

4.更新数组

arr = newarr;

我们将原数组 arr 引用指向新的数组 newarr,扩容完成

完整代码

private  void resize(){Node [] newarr = new Node[arr.length*2];for(int i=0;i<arr.length;i++){Node cur = arr[i];while(cur != null){Node temp = cur.next;int idx = cur.key % newarr.length;// 新的地址cur.next = newarr[idx];newarr[idx] = cur;cur = temp;}}arr = newarr;}

完整代码(方便大家复制自己去调试)

数据是int的

public class Hashmap {// 哈希桶 - 数组链表static class Node {public int key;public int val;public Node next;public Node(int key, int val) {this.key = key;this.val = val;}}// 建立数组public Node[] arr;public int usedsize;public  static final   float  loadnum = 0.75f;public Hashmap() {this.arr = new Node[10];  // 初始化数组容量为 10}public void put(int key, int val) {int idx = key % arr.length;Node cur = arr[idx];// 如果链表已经存在,检查是否有相同 keywhile (cur != null) {if (cur.key == key) {cur.val = val;  // 更新值return;}cur = cur.next;}// 插入新节点(尾插法)Node newNode = new Node(key, val);// 如果当前桶为空,直接插入if (arr[idx] == null) {arr[idx] = newNode;} else {// 否则,找到链表的尾部插入新节点Node cur2 = arr[idx];while (cur2.next != null) {cur2 = cur2.next;}cur2.next = newNode;}usedsize++;if(loadnum()>loadnum){resize();}}private  void resize(){Node [] newarr = new Node[arr.length*2];for(int i=0;i<arr.length;i++){Node cur = arr[i];while(cur != null){Node temp = cur.next;int idx = cur.key % newarr.length;// 新的地址cur.next = newarr[idx];newarr[idx] = cur;cur = temp;}}arr = newarr;}private  float  loadnum(){return usedsize*1.0f/arr.length;}public  int get(int key){int idx = Math.abs(key % arr.length);Node cur = arr[idx];while(cur!=null){if(cur.key == key){return cur.val;}cur = cur.next;}return -1;}
}

使用泛型实现的

我还写了一个利用泛型实现的,这样可以用在不同类型的数据中

public class Hashmap1<K, V> {// 哈希桶 - 数组链表static class Node<K, V> {public K key;public V val;public Node<K, V> next;public Node(K key, V val) {this.key = key;this.val = val;}}// 建立数组public Node<K, V>[] arr;public int usedsize;public static final float LOAD_FACTOR = 0.75f;// 构造函数,初始化数组容量public Hashmap1() {this.arr = new Node[10]; // 初始化容量为 10}// 插入或更新键值对public void put(K key, V val) {int idx = Math.abs(key.hashCode() % arr.length);  // 使用键的 hashCode() 来计算索引Node<K, V> cur = arr[idx];// 如果链表中存在相同的 key,更新对应的值while (cur != null) {if (cur.key.equals(key)) {cur.val = val;  // 更新值return;}cur = cur.next;}// 插入新节点(尾插法)Node<K, V> newNode = new Node<>(key, val);// 如果当前桶为空,直接插入if (arr[idx] == null) {arr[idx] = newNode;} else {// 否则,找到链表的尾部插入新节点Node<K, V> cur2 = arr[idx];while (cur2.next != null) {cur2 = cur2.next;}cur2.next = newNode;}usedsize++;// 判断是否需要扩容if (loadFactor() > LOAD_FACTOR) {resize();}}// 重新调整哈希表的大小private void resize() {Node<K, V>[] newarr = new Node[arr.length * 2];for (int i = 0; i < arr.length; i++) {Node<K, V> cur = arr[i];while (cur != null) {Node<K, V> temp = cur.next;int idx = Math.abs(cur.key.hashCode() % newarr.length); // 计算新索引cur.next = newarr[idx];newarr[idx] = cur;cur = temp;}}arr = newarr;}// 计算负载因子private float loadFactor() {return usedsize * 1.0f / arr.length;}// 根据键获取值public V get(K key) {int idx = Math.abs(key.hashCode() % arr.length);Node<K, V> cur = arr[idx];while (cur != null) {if (cur.key.equals(key)){System.out.println(key.hashCode());return cur.val;}cur = cur.next;}return null; // 如果没找到,返回 null}
}

结尾 

博客还是基本的介绍了一下怎么实现简单的哈希表,希望对于读者有用,也欢迎读者指出我博客中的错误,核实后有偿.

相关文章:

[入门JAVA数据结构 JAVADS] 哈希表的初步介绍和代码实现

目录 前言 哈希表的概念和诞生的原因 哈希冲突 简单实现哈希表 基本属性 插入 获取key的val 计算负载因子 扩容(难点) 完整代码(方便大家复制自己去调试) 数据是int的 使用泛型实现的 结尾 前言 笔者鸽了接近两个月后决定"勤政"了.尽力把学过的知识写下…...

谷歌外链好不好,关键看“搭配”!

做SEO的人都知道外链很重要&#xff0c;但有一个误区是只追求“高质量外链”&#xff0c;却忽略了外链结构的合理性。其实&#xff0c;外链就像饮食&#xff0c;光吃好东西不够&#xff0c;营养搭配得当才能健康发展。 谷歌对外链的要求&#xff0c;不仅是看它是不是dofollow、…...

【AI驱动的数据结构:包装类的艺术与科学】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 包装类装箱和拆箱阿里巴巴面试题 包装类 在Java中基本数据类型不是继承来自Object&#xff0c;为了…...

ElasticSearch 的核心功能

要深入理解 ElasticSearch 的核心功能&#xff0c;需要全面掌握其 全文搜索、分析、聚合 和 索引生命周期管理&#xff08;ILM&#xff09; 的设计原理和实际应用。 1. 全文搜索 ElasticSearch 的全文搜索是其核心功能之一&#xff0c;依赖于倒排索引和强大的分词、相关性评分…...

任务2 配置防火墙firewalld

基本概念 概述 支持动态更新防火墙规则 不重启即可创建、修改和删除规则 使用区域和服务来简化防火墙配置 区域 一组预定义的规则&#xff0c;防火墙策略集合&#xff08;或策略模板&#xff09; 把网络分配到不同的区域中&#xff0c;并为网络及其关联的网络接口或流量源…...

PHP入门到高级 -- 学习基础语法和概念

学习PHP的基础语法和概念是成为一名高级PHP开发者的关键。以下是一个逐步学习PHP并逐渐深入了解其高级特性的指南。 学习基础语法&#xff1a; 变量和数据类型&#xff1a;了解如何声明和使用变量&#xff0c;以及PHP支持的不同数据类型。运算符&#xff1a;掌握算术&#xf…...

MKS SERVO42E57E 闭环步进电机_系列5 串口(RS485)通讯示例

第1部分 产品介绍 MKS SERVO42E/57E 闭环步进电机是创客基地为满足市场需求&#xff0c;按工业级标准自主研发的一款产品。具备脉冲接口、RS485接口以及CAN接口&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&#xff0c;有效防止电机…...

自然语言编写的prompt为啥比不上编程语言prompt高效?

为什么会这样&#xff1f;从底层逻辑开始分析 这个问题本质上是在比较两种完全不同的"语言系统"。 就像去一家餐厅点菜&#xff0c;你可以说"我想来一份不太咸、稍微辣一点的宫保鸡丁"&#xff08;自然语言&#xff09;&#xff0c;也可以直接在平板上点…...

C#—LINQ详解及汇总

LINQ详解及汇总 LINQ&#xff08;Language Integrated Query&#xff09;是微软的一项技术&#xff0c;允许开发者以一种简洁的方式查询和操作数据&#xff0c;支持多种数据源&#xff0c;包括对象、数据库、XML和数据集。LINQ定义了约40个查询操作符&#xff0c;如select、fr…...

WebGAL 项目下载及安装教程

WebGAL 项目下载及安装教程 WebGAL A brand new web Visual Novel engine | 全新的网页端视觉小说引擎 [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/web/WebGAL 1、项目介绍 WebGAL 是一个全新的网页端视觉小说引擎&#xff0c;旨在提供美观、功能强大且易于…...

虚幻引擎游戏开发系列专题-官方编码标准或规约

遵守既定标准和最佳实践来编写可维护的代码。在虚幻游戏引擎中,存在着一些既定的编码标准和约定 ,养成良好的编码规范是写好一份优雅代码的第一步,并且在虚幻官方也强调了,某些编码标准的遵循是强制性的。 编码规约对程序员来说意味着什么 在软件开发中,软件生命周期的80%的成…...

n阶Legendre多项式正交性的证明

前言 在《n次Legendre(勒让德)多项式在区间(-1, 1)上根的分布及证明》这篇文章中&#xff0c;我们阐述了Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的根分布情况并给出了证明。本文将证明Legendre多项式在 [ − 1 , 1 ] [-1,1] [−1,1]上的正交性质。 正交多项式的定义…...

初学stm32 --- PWM输出

目录 STM32 PWM工作过程​编辑 STM32 PWM工作过程&#xff08;通道1为例&#xff09; PWM模式1 & PWM模式2 向上计数配置说明​编辑 STM32 定时器3输出通道引脚 自动重载的预装载寄存器 ​编辑 PWM输出相关库函数 输出比较初始化函数&#xff1a; 设置比较值函数&a…...

Git:查看分支、创建分支、合并分支

一、查看分支 查看的git命令如下&#xff1a; git branch # 列出本地已经存在的分支&#xff0c;并且当前分支会用*标记 git branch -r # 查看远程版本库的分支列表 git branch -a # 查看所有分支列表&#xff08;包括本地和远程&#xff0c;remotes/开头的表示远程分支&…...

爬虫学习案例8

爬取京东评论信息 采用DrissionPage自动化工具采集&#xff0c;感觉比Selenium工具好&#xff0c;真香。 安装第三方库 pip install DrissionPage pip install pandas pip install pyecharts pip install jieba pip install wordcloud1.安装DrissionPage库 DrissionPage安装…...

git 提交代码无法连接:Failed to connect to github.com port 443 after 21060 ms

项目场景&#xff1a; 在能够访问github仓库的情况下&#xff0c;生成本地代码并提交到github上时会遇到提交不成功的问题&#xff0c;如下&#xff1a; fatal: unable to access ‘https://github.com/Pitt-ding/opc_comm.git/’: Failed to connect to github.com port 443 …...

麒麟系统修改配置镜像源地址并安装openGL

1.编辑文件/etc/apt/sources.list 进入目录 cd /etc/apt/ 编辑文件&#xff08;需要root权限&#xff09; sudo vi sources.list 将镜像地址改为你指定的镜像地址 #deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe mul tiverse #deb http:…...

如何使用Navigator实现导航功能

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Widget的State,本章回中将介绍Route和Navigator,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 到目前为止,我们介绍的内容都在一个页面中,本章回中将介绍中在Flutter中如何进行页面切换,这里说的页面切…...

MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)

1.1创建ThreadLocal工具类&#xff08;作为业务逻辑结果存放类&#xff09; package org.springblade.sample.utils;public class QueryContext {private static final ThreadLocal<Long> totalInThreadLocal new ThreadLocal<>();public static void setTotalIn…...

Jmeter对图片验证码的处理【超详细】

Jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…...

匈牙利算法

匈牙利算法 1 概念2 依据3 目的4步骤5 案例6 测试 1 概念 匈牙利算法基于代价矩阵找到最小代价的分配方法&#xff0c;是解决分配问题中最优匹配(最小代价)的算法。 2 依据 代价矩阵的行或列同时加或减一个数&#xff0c;得到新的代价矩阵的最优匹配与原代价矩阵相同。 3 目…...

nginx学习总结(不包含安装过程)

1. nginx常见配置 http服务上支持【若干虚拟主机】。每个虚拟主机对应一个server配置项&#xff0c;配置项里面包含该虚拟主机相关的配置。 server{listen 80 default;server_name www.yonqin.com;index index.html index.htm index.php;root /data/www;location ~ .*\.(gif|…...

Android10 rk3399 以太网接入流程分析

Netd守护进程服务 Netd模块是Android中专门负责网络管理和控制的后台守护进程开发板路径./etc/init/netd.rc service netd /system/bin/netdclass mainsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inetonres…...

HTML与数据抓取:GET与POST方法详解

讲GET和POST就不能只讲GET和POST 你要讲HTTP请求的基本概念&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;主要用于Web浏览器与Web服务器之间的数据通信。HTTP是一个基于…...

DG常用启动方法与异常查找

--查看主库的状态&#xff1a; select a.inst_id,a.db_unique_name,a.database_role, a.protection_level,a.protection_mode,a.open_mode,a.log_mode,a.switchover_status, b.host_name,b.thread# from gv$database a left join gv$instance b on a.inst_idb.inst_id order by…...

C++ OpenGL学习笔记(4、绘制贴图纹理)

相关链接&#xff1a; C OpenGL学习笔记&#xff08;1、Hello World空窗口程序&#xff09; C OpenGL学习笔记&#xff08;2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制&#xff09; C OpenGL学习笔记&#xff08;3、绘制彩色三角形、绘制彩色矩形&#xff09; 通过前面…...

以二进制形式创建gitea仓库

1、官方文档&#xff1a; 数据库准备 | Gitea Documentation 使用二进制文件安装 | Gitea Documentation 2、具体操作 1&#xff09;创建gitea数据库 2&#xff09;检查是否安装 Git。要求 Git 版本 > 2.0。 如需升级git请参考以下链接&#xff1a;linux升级git版本-C…...

数据库系统原理:数据库安全性与权限控制

2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…...

bugkctf 渗透测试1超详细版

bugkctf 渗透测试1 下发环境进行访问 场景1 通过查看网页源代码成功找到1个flag 得到flag和提示 <!--flag{950d83a16ad47127859d414009432171} PS&#xff1a;下个flag网站管理员才能看到哦-->场景2 根据提示需要管理员权限&#xff0c;进行登录,直接登录需要邮箱和…...

window安装TradingView

目录 下载安装包 修改文件后缀&#xff0c;解压 将K线换成国内涨红跌绿样式 下载安装包 https://www.tradingview.com/desktop/ 下载完成后是.msix格式文件 &#xff08;我在win10和win11的系统中尝试运行msix都没有成功&#xff0c;所以放弃直接双击运行msix&#xff…...

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …...

log4j2漏洞复现(CVE-2021-44228)

靶场环境 步骤一&#xff1a;设置出战规则 步骤二&#xff1a;开启靶场 cd vulhub cd log4j cd CVE-2021-44228 docker-compose up -d docker ps 访问端口 靶机开启 步骤三&#xff1a;外带注入 获得dnslog 靶机访问dnslog 得到dnslog的二级域名信息 步骤四&#xff1a;构造…...

应用(APP)部署容器化演进之路

应用&#xff08;Application&#xff09;部署容器化演进之路 一、应用程序部署痛点 1.1 应用程序部署流程 举例&#xff1a;部署一个JAVA编程语言开发的Web应用&#xff0c;以War包放入Tomcat方式部署。 部署过程如下&#xff1a; 服务器配置运行环境:JAVA代码运行环境&am…...

Pytorch | 从零构建EfficientNet对CIFAR10进行分类

Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…...

Saprk和Flink的区别

1 、设计理念方面 Spark 的技术理念是使用微批来模拟流的计算&#xff0c;基于 Micro-batch &#xff0c;数据流以时间为单位被切分为一个个 批次&#xff0c;通过分布式数据集RDD 进行批量处理&#xff0c;是一种伪实时。 Flink 是基于事件驱动的&#xff0c;是面向流的处理…...

Spring Boot 动态定时任务管理系统(轻量级实现)

Spring Boot项目中&#xff0c;实现动态增删和启停定时任务的功能对于许多应用场景来说至关重要。虽然Quartz框架是一个广泛使用的解决方案&#xff0c;但其复杂性和重量级特性可能使得项目变得臃肿和难以维护。为了解决这个问题&#xff0c;本项目旨在实现一个轻量级的定时任务…...

开发微信小程序的过程与心得

起因 作为家长&#xff0c;我近期参与了学校的护学岗工作。在这个过程中&#xff0c;我发现需要使用水印相机来记录护学活动&#xff0c;但市面上大多数水印相机应用都要求开通会员才能使用完整功能。作为一名程序员&#xff0c;我决定利用自己的技术背景&#xff0c;开发一个…...

项目代码第6讲:UpdownController.cs;理解 工艺/工序 流程、机台信息;前端的“历史 警报/工艺 记录”

一、UpdownController.cs 1、前端传入 当用户在下图的“记录查询”中的 两个界面选项 中,点击“导出”功能时,向后端发起请求,请求服务器下载文件的权限 【权限是在Program.cs中检测的,这个控制器里只需要进行“谁在哪个接口下载了文件”的日志记录】 【导出:是用户把…...

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…...

uni-app开发收货地址管理

目录 一:功能描述 二:功能实现 一:功能描述 收货地址在个人中心的我的地址里面,点击我的地址可以查看我的收货地址列表,可以新增收货地址,点击特定收货地址可以编辑和删除该地址信息。 二:功能实现 1:收货地址列表 <view v-for="(item, index) in data_lis…...

BOE(京东方)“向新2025”年终媒体智享会落地成都 持续创新引领产业步入高价值增长新纪元

12月20日,BOE(京东方)“向新 2025”年终媒体智享会的脚步从上海延伸至成都。川渝之地,作为 BOE(京东方)产业生态战略布局中的关键一子,此刻再度成为行业瞩目的焦点。本次活动全面回溯了BOE(京东方)在2024年多个关键领域斩获的斐然佳绩,深入剖析了六大维度构建的“向新”发展格局…...

JavaWeb - ⭐ AOP 面相切面编程原理及用户校验功能实战

一、概述 定义&#xff1a; AOP (Aspect Oriented Programming 面向切面编程) &#xff0c;一种面向方法编程的思想 功能&#xff1a;管理 bean 对象的过程中&#xff0c;通过底层的动态代理机制对特定方法进行功能的增强或改变 实现方式&#xff1a;动态代理技术&#xff0c…...

鸿道Intewell工业操作系统,三大关键技术,领跑行业前沿

鸿道工业操作系统&#xff0c;是软件定义控制的工业实时操作系统&#xff0c;具备三大关键技术&#xff1a; 1、确定性计算与高实时响应(微秒级、关键指标) 提供确定性的计算与高实时的系统环境&#xff0c;保障工业生产运作的灵活高效。 2、微内核、并发处理(微内核的强大…...

java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)

在 Java 中封装 ElasticSearch&#xff08;ES&#xff09;数据库操作&#xff08;ES版本之间变动挺大的&#xff0c;别轻易换版本&#xff09;&#xff0c;可以使得与 ES 的交互更加简洁和易于维护。通过封装常见的操作&#xff0c;如插入文档、查询、更新和删除等&#xff0c;…...

HarmonyOS NEXT 技术实践-基于基础视觉服务实现骨骼点识别

本示例展示了如何在HarmonyOS Next中实现基于基础视觉服务的骨骼点识别功能。骨骼点识别是计算机视觉中的一项重要技术&#xff0c;广泛应用于运动分析、健身监控和增强现实等领域。通过使用HarmonyOS Next提供的视觉API&#xff0c;开发者能够轻松地对人物图像进行骨骼点检测&…...

广州大学计算机组成原理课程设计

一.课设性质&#xff0c;目的&#xff0c;任务 《计算机组成与系统结构课程设计》是计算机学院各专业集中实践性环节之一&#xff0c;是学习完《计算机组成与系统结构》课程后进行的一次全面的综合练习。其目的是综合运用所学计算机原理知识&#xff0c;设计并实现一台模型计算…...

【漏洞复现】CVE-2021-45788 SQL Injection

漏洞信息 NVD - cve-2021-45788 Time-based SQL Injection vulnerabilities were found in Metersphere v1.15.4 via the “orders” parameter. Authenticated users can control the parameters in the “order by” statement, which causing SQL injection. API: /test…...

【Java基础面试题035】什么是Java泛型的上下界限定符?

回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制&#xff0c;主要有上界限定符和下届限定符。 1&#xff09;上界限定符 (? extends T)&#xff1a; 定义&#xff1a;通配符?的类型必须是T或者T的子类&#xff0c;保证集合元素一定是T或者T的子类作用&…...

无需GPU也能跑的修图神器(祛痣、去水印、去路人)

背景 在这个视觉内容创作盛行的时代&#xff0c;大家对图片质量要求愈发严苛。无论是日常分享的自拍照想祛痣变得完美无瑕&#xff0c;还是摄影作品需去水印彰显原创&#xff0c;亦或是旅游打卡照要去路人还原美景。如今&#xff0c;一款能在 CPU 上流畅运行的修改神器应运而生…...

R语言数据分析案例47-上海译文出版社旗舰店图书分析和可视化

一、研究背景 随着数字化时代的发展&#xff0c;图书出版行业面临着日益激烈的市场竞争。上海译文出版社作为一家知名的出版机构&#xff0c;其旗舰店的图书销售数据蕴含着丰富的信息。对最新入库图书进行深入分析和可视化呈现&#xff0c;有助于出版社更好地了解市场动态、读…...