数据结构:顺序表的实现
顺序表是用一段物理地址连续的存储单元依次储存数据的线性结构,一般情况下采用数组储存,在数组上完成数据的增删减改。
这里我们定义一个MyArrayList类,用来实现顺序表的功能:
public class MyArrayList{int[] array;int usedsize;
public static final int DEFAULT_CAPACITY=10;
//构造方法public MyArrayList(){array=new int[DEFAULT_CAPACITY];}
}
创建一个数组,使用数组对数据进行增删查改,以及组织和描述。
有一个长度为6,有效长度是4的数组:(有效长度就是存储的有效的数据的个数)
提问:如何知道这个数组的有效长度:1.有人会说用遍历,遍历到0结束,有效长度就是就是0之前的长度。但如果用这种方法那下面这个数组有效长度就会有问题:
如果遍历到0结束,则这个数组有效长度是2,但实际这个数组有效长度是4。
所以为了更好的得到有效长度,我们定义一个新的整形变量usedsize,当数组增加一个新的元素,usedsize就加1。删减一个元素,usedsize就减1
实现size方法:
size方法是用来求取数组有效长度的,而数字有效长度为usedsize。
public int size(){return usedsize;
}
顺序表要实现的功能:
public class MyArrayList { private int[] array; private int usedsize; // 默认构造方法 public MyArrayList(){ } // 新增元素,默认在数组最后新增 public void add(int data) { } // 在 pos 位置新增元素 public void add(int pos, int data) { } // 判定是否包含某个元素 public boolean contains(int toFind) { return true; } // 查找某个元素对应的位置 public int indexOf(int toFind) { return -1; } // 获取 pos 位置的元素 public int get(int pos) { return -1; } // 给 pos 位置的元素设为 value public void set(int pos, int value) { } //删除第一次出现的关键字key public void remove(int toRemove) { } // 获取顺序表长度 public int size() { return 0; } // 清空顺序表 public void clear() { } // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的 public void display() { } }
实现display方法:
display方法是用来打印数组中的数据。
(不是顺序表的方法,为了方便看测试结果给出的)
我们要将数组的有效元素打印出来,就要遍历数组。
public void display() {for(int i=0;i<usedsize;i++){System.out.print(array[i]+" ");}
}
实现add方法:
add方法就是对数组进增加元素。
add一共有两个方法:
public void add (int data);
public void add(int pos,int data);
实现第一个add方法: 在实现增加元素的代码时,我们要判断该数组是否满了,满了就不能继续增加元素了,所以这里定义一个isFull方法来判断数组是否满了。
如果满了就需要扩容,我们又要定义一个扩容的grow的方法。
public boolean isFull(){return array.length==usedsize;
}
public void grow(){array= Arrays.copyOf(array,2*array.length);
}
public void add(int data){if(isFUll()){grow();}array[usedsize]=data;
}
实现第二个add方法时:1.不仅要判断数组是否满了,而且还要判断所提供的pos下标是否合法,即满足pos<usedsize且pos>=0,这里就可以给一个异常。
//定义一个插入下标异常类
public class PosIlleagl extends RuntimeException{public PosIlleagl(){}public PosIlleagl(String msg){System.out.println(msg);}
}
//顺序表的实现类
public class MyArrayList{
public boolean isFull(){return array.length==usedsize;
}
public void grow(){array= Arrays.copyOf(array,2*array.length);
}
public void add(int data){if(isFUll()){grow();}array[usedsize]=data;usedsize++;
}
//定义一个下表异常
private void checkpos(int pos) throws PosIlleagl{if(pos<0||pos>usesized){throw new PosIlleagl("插入位置不合法");}
}
public void add(int pos,int data){try{checkpos(pos); if(isFUll()){grow();}
int i=0;
for(i=usedsize-1;i>=pos;i++){array[i+1]=array[i];}}
array[pos]=data;
usedsize++;
}catch(PosIlleagl e){e.printStackTrace();
}
}
在两个add方法中的末尾都要将usesize++;
实现contains方法:
public boolean contains(int tofind);
contains方法是用来判定数组中是否包含tofind这个元素。
第一想到的方法就是依次遍历数组进行检查。找到了返回true,没找到返回false
public boolean contains(int tofind){int i=0;
for(i=0;i<usedsize;i++){if(array[i]==tofind){return true;}}
return false;
}
实现indexOf方法:
public int indexOf(int toFind);
indexOf方法用来查找toFind元素的所对应的下标。
也是用遍历数组的方式进行查找,找到了就返回下标,没找到就返回-1。
public int indexOf(int toFind){int i=0;for(i=0;i<usesized;i++){if(array[i]==toFind){return i;}}
return -1;
}
实现get方法:
public int get(int pos);
get方法是用来查找pos下标的值。
1.如果数组是空数组,也不能进行查找,可以给一个异常来判断。
2.这里pos的值不能小于0,也不能大于等于usedsize,之所以不能等于usedsize,因为这里usedsize的下标是没有值的。
比如:
这里的usedsize的值已经越界了。
所以在写代码前也要进行判断下标是否合理。可以给一个异常进行判断
//定义一个插入下标异常类
public class PosIlleagl extends RuntimeException{public PosIlleagl(){}public PosIlleagl(String msg){System.out.println(msg);}
}
//给一个判断空异常的类
public EmptyException(){public EmptyException(){}public EmptyException(String msg){System.out.println(msg);}
}
//实现顺序表的类
private void isEmpty() throws EmptyException{if(usedsize==0){throw new EmptyException("顺序表为空");}
}
private void checkpos2(int pos) throws PosIlleagl{if(pos<0||pos>=usedsize){throw new PosIlleagl("pos位置不合法");}
}
public class MyArrayList{public int get(int pos){try{isEmpty();checkpos2(pos);return array[pos];}catch(EmptyException e){e.printStackTrace();}catch(PosIlleagl e){e.printStackTrace();
}
return -1;}
}
实现set方法:
public void set(int pos, int value);
set方法就是将pos下标的元素改成value。
其实看到传参中有下标pos,我们都会想到pos下标是否为异常,并判断pos下标合法性
其次是判断数组是否为空。
//定义一个插入下标异常类
public class PosIlleagl extends RuntimeException{public PosIlleagl(){}public PosIlleagl(String msg){System.out.println(msg);}
}
//给一个判断空异常的类
public EmptyException(){public EmptyException(){}public EmptyException(String msg){System.out.println(msg);}
}
//实现顺序表的类
private void isEmpty() throws EmptyException{if(usedsize==0){throw new EmptyException("顺序表为空");}
}
private void checkpos2(int pos) throws PosIlleagl{if(pos<0||pos>=usedsize){throw new PosIlleagl("pos位置不合法");}
}
public class MyArrayList{public int set(int pos,int value){try{isEmpty();checkpos2(pos);array[pos]=value;}catch(EmptyException e){e.printStackTrace();}catch(PosIlleagl e){e.printStackTrace();
}}
}
实现remove方法:
public void remove(int toRemove);
remove方法就是将第一次出现的toRemove元素删除
如果要删除23这个元素,,就要先找到23这个元素的下标(通过之前的indexOf方法),就要把34这个元素往前移,44也往前移。
因为这里是找元素删除,没有传入下标,所以不用判断下标是否异常。只需要判断数组是否为空(用异常来判断)
//给一个判断空异常的类
public EmptyException(){public EmptyException(){}public EmptyException(String msg){System.out.println(msg);}
}
//实现顺序表的类
private void isEmpty() throws EmptyException{if(usedsize==0){throw new EmptyException("顺序表为空");}
}
public class MyArrayList{public void remove(int toRemove){try{isEmpty();int val=indexOf(toRemove);if(val==-1){return ;}
for(int i=pos;i<usedsize-1;i++){array[i]=array[i+1];}
usedsize--;}catch(EmptyException e){e.printStackTrace(); }}
}
实现clear方法:
public void clear();
clear方法是将数组元素清空。
因为这里我们的顺序表是基本数据类型,所以可以很简单的将usedsize=0;即可
如果是引用类型,就要将数组依次遍历,将引用类型数据置为null
public void clear(){usedsize=0;
}
代码如下:
建立一个下标不合理异常类:
public class PosIlleagl extends RuntimeException{public PosIlleagl(){}public PosIlleagl(String msg){System.out.println(msg);}
}
建立一个空异常类:
public class EmptyException extends RuntimeException{public EmptyException(){}public EmptyException(String msg){System.out.println(msg);}
}
MyArrayList类:
public class MyArrayList{int[] array;int usedsize;public static final int DEFAULT_CAPACITY=10;//构造方法public MyArrayList(){array=new int[DEFAULT_CAPACITY];}// 新增元素,默认在数组最后新增public void add(int data) {if(isfull()){grow();}array[usedsize]=data;usedsize++;}//检查节点是否合法private void checkpos(int pos) throws PosIlleagl{if(pos<0||pos>usedsize){throw new PosIlleagl("pos位置不合法");}}private void checkpos2(int pos) throws PosIlleagl{if(pos<0||pos>=usedsize){throw new PosIlleagl("pos位置不合法");}}private void isEmpty() throws EmptyException{if(usedsize==0){throw new EmptyException("顺序表为空");}}//数组扩容private void grow(){array= Arrays.copyOf(array,2*array.length);}//判断数组是否满了private boolean isfull(){return usedsize==array.length;}// 在 pos 位置新增元素public void add(int pos, int data) {try{checkpos(pos);if(isfull()){grow();}int i=0;for(i=usedsize-1;i>=pos;i--){array[i+1]=array[i];}array[pos]=data;usedsize++;}catch(PosIlleagl e){System.out.println("插入位置不合法");e.printStackTrace();}}// 判定是否包含某个元素public boolean contains(int toFind) {int i=0;for(i=0;i<usedsize;i++){if(array[i]==toFind){return true;}}return false;}// 查找某个元素对应的位置public int indexOf(int toFind) {int i=0;for(i=0;i<usedsize;i++){if(array[i]==toFind){return i;}}return -1;}// 获取 pos 位置的元素public int get(int pos) {try{isEmpty();checkpos2(pos);return array[pos];}catch(EmptyException e){e.printStackTrace();}catch(PosIlleagl e){e.printStackTrace();}return -1;}// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {try{isEmpty();checkpos2(pos);array[pos]=value;}catch(EmptyException e){e.printStackTrace();}catch(PosIlleagl e){e.printStackTrace();}}//删除第一次出现的关键字keypublic void remove(int toRemove) {try{isEmpty();int val=indexOf(toRemove);if(val==-1){return ;}for(int i=val;i<usedsize-1;i++){array[i]=array[i+1];}usedsize--;}catch(EmptyException e){e.printStackTrace();}}// 获取顺序表长度public int size() {return usedsize;}// 清空顺序表public void clear() {usedsize=0;}// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display() {for(int i=0;i<usedsize;i++){System.out.print(array[i]+" ");}}
}
顺序表的也有优缺点:
优点:因为顺序表的底层是一个数组,所以我们在查找目的下标的值的时候,时间复杂度可以到达O(1)
缺点:
(1)因为顺序表的底层是一个数组,把数据储存到连续的空间,所以在插入或者删除元素时,会将该位置后面的元素整体整体向后移或者向前移。
(2)在增容时,需要申请新的空间,然后拷贝数据,最后再释放旧的空间,造成的消耗也不小
(3)顺序表的增容一般是呈2倍增加,如果在下面这个场景下:我已经有了100个数据,数组也已经满了,但是我现在要增加5个数据,那如果我2倍增容,就会导致我多了100个内存,但只用了5个内存,内存利用率也很低。
所以为了解决上面的问题:我们引入一个新的数据结构——链表
相关文章:
数据结构:顺序表的实现
顺序表是用一段物理地址连续的存储单元依次储存数据的线性结构,一般情况下采用数组储存,在数组上完成数据的增删减改。 这里我们定义一个MyArrayList类,用来实现顺序表的功能: public class MyArrayList{int[] array;int usedsi…...
# 06_Elastic Stack 从入门到实践(六)
06_Elastic Stack 从入门到实践(六) 一、课程介绍 1、课程介绍 2、Nginx日志分析系统 3、Filebeat入门学习 4、Metricbeat入门学习 5、Kibana入门学习 6、Logstash入门学习 7、综合练习 二、Nginx 日志分析系统需求分析 1、业务需求 Nginx是一款非常优秀的web服务…...
[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析
拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学,一般又称河马爱学教育平台app,河马爱学。 关于学习,你可能也需要一个“豆包爱学”这样的AI伙伴,它将为你提供全方位的学习帮助…...
重装系统后的自用包
装驱动 sudo apt update sudo apt upgrade sudo apt install nvidia-driver-535搜狗输入法: https://shurufa.sogou.com/linux/guideClash verge: ubuntu20 下载1.7.7版本的 https://github.com/clash-verge-rev/clash-verge-rev/releases/tag/v1.7.7…...
4.22tx视频后台开发一面
总时长大概在一个小时,主要提问C、操作系统、计网以及数据库等方面,最后两个算法编程题。 一上来先介绍项目 Linux下的mybash命令处理器和内存池 mybash可以再总结归纳一下,一上来有点紧张没有条理 内存池是用边界标识法写的,…...
如何Ubuntu 22.04.5 LTS 64 位 操作系统部署运行SLAM3! 详细流程
以下是在本地部署运行 ORB-SLAM3 的详细步骤,基于官方 README.md 和最佳实践整理,适用于 Ubuntu 16.04/18.04/20.04/22.04 系统: 一、系统要求与依赖项安装 1. 基础系统要求 操作系统:Ubuntu 16.04/18.04/20.04/22.04ÿ…...
Ubuntu 上安装 Conda
在 Ubuntu 上安装 Conda(Anaconda 或 Miniconda)的完整步骤如下: --- **方法1:安装 Miniconda(推荐)** Miniconda 是 Anaconda 的精简版,只包含基本组件。 **1. 下载安装脚本** bash # 下载最…...
初级云计算运维工程师学习二
全面解析云计算服务模式:公有云、私有云、混合云及IaaS/PaaS/SaaS/DaaS 云计算部署模式:三种主要形式 1. 公有云(Public Cloud) 定义:云端资源开放给社会公众使用,由第三方云服务提供商通过互联网交付。 …...
物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键
在当今数字化时代,物联网(IoT)正以前所未有的速度蓬勃发展,其影响力已广泛渗透到各个领域,楼宇自控技术便是其中之一。从本质上讲,楼宇自控旨在实现对建筑物内各类机电设备的智能化管理与控制,为…...
数字孪生技术:企业数字化转型的助推器
在当今环境下,企业面临的挑战不断增加。从可持续发展目标的要求到员工数字技能的提升,转型的呼声越来越高。然而,即使是经验丰富的领导者,也很难在这种前所未有的商业环境下实现转型。企业如何在满足可持续发展目标的同时保持盈利…...
ESM 内功心法:化解 require 中的夺命一击!
前言 传闻在JavaScript与TypeScript武林中,曾有两大绝世心法:CommonJS与ESM。两派高手比肩而立,各自称霸一方,江湖一度风平浪静。 岂料,时局突变。ESM逐步修成阳春白雪之姿,登堂入室,成为主流正统。CommonJS则渐入下风,功力不济,逐渐退出主舞台。 话说某日,一位前…...
安全调度系统:安全管理的智能中枢
安全调度系统作为安全管理体系的核心枢纽,正在深刻改变着传统安全管理的模式和效能。这个集成了先进信息技术的智能化平台,通过实时监控、智能分析和快速响应三大核心功能,构建起全方位、多层次的安全防护网络,成为各类场所安全管…...
Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...
jsconfig.json文件的作用
jsconfig.json文件的作用 为什么今天会谈到这个呢?有这么一个场景:我们每次开发项目时都会给路径配置别名,配完别名之后可以简化我们的开发,但是随之而来的就有一个问题,一般来说,当我们使用相对路径时…...
Python线程全面详解:从基础概念到高级应用
一、线程基础概念 1.1 进程与线程的关系 进程是操作系统资源分配的基本单位,它是程序的一次执行过程。当我们将程序加载到内存中运行时,系统会为它分配CPU、内存、文件句柄等资源,这时就形成了一个进程。 线程是CPU调度的基本单位…...
学习模拟电路
学习模拟电路需要掌握以下几个关键领域的知识和技能,涵盖基础理论、器件特性、电路设计、分析工具以及实践应用: 1. 基础理论与概念 电路基本定律:欧姆定律、基尔霍夫电压定律(KVL)和电流定律(KCL…...
解码思维链:AI思维链如何重塑人类与机器的对话逻辑
第一章:思维链的诞生与进化 1.1 从"猜谜游戏"到"推理革命" 传统AI模型如同蒙眼解题的考生:当被问及"玛丽有12块饼干,吃掉4块后剩下多少",它们擅长预测答案,却无法展示"12-48&quo…...
css3新特性第六章(2D变换)
css3新特性第五章(2D变换) CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。 2D位移2D缩放2D旋转2D扭曲多重变换变换原点 一、2D位移 2D 位移可以改变元素的位置,具体使用方式如下: 先给元素添加 转换属性 transform 编写 transform 的具体值&…...
L2-2、示范教学与角色扮演:激发模型“模仿力“与“人格“
一、Few-shot 教学的核心原理与优势 在与大语言模型交互时,Few-shot(少样本)教学是一种强大的提示技术。其核心原理是通过提供少量示例,引导模型理解我们期望的输出格式和内容风格。 Few-shot 教学的主要优势包括: …...
MAC系统下完全卸载Android Studio
删除以下文件 /Applications/Android Studio.app /Users/用户名/Library/Application Support/Google/AndroidStudio2024.2 /Users/用户名/Library/Google/AndroidStudio /Users/用户名/Library/Preferences/com.google.android.studio.plist /Users/用户名/Library/Cache…...
rgw的d3n功能配置
背景 最近在看缓存相关,文件系统可以通过fscache加速,加速的效果就是读取的时候能够缓存,原理是在网关的地方加入一个高速缓存盘,这样在后续读取的时候,能够直接从缓存盘读取,这样能够减少与集群的交互&am…...
this._uid:Vue 内部为每个组件实例分配的唯一 ID
Vue 提供了一些方法可以帮助你区分组件实例,例如通过 this._uid(Vue 内部为每个组件实例分配的唯一 ID)或自定义标识符。 以下是具体的实现步骤和代码示例: console.log("当前组件实例ID:", this._uid, "时间戳:&…...
使用Python设置excel单元格的字体(font值)
一、前言 通过使用Python的openpyxl库,来操作excel单元格,设置单元格的字体,也就是font值。 把学习的过程分享给大家。大佬勿喷! 二、程序展示 1、新建excel import openpyxl from openpyxl.styles import Font wb openpyxl.…...
【深度学习】#8 循环神经网络
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 为了进一步提高长线学习的效率,该系列从本章开始将舍弃原始教材的代码部分,专注于理论和思维的提炼,系列名也改为“深度学习…...
三角形神经网络(TNN)
三角形神经网络(TNN)是一种新兴的神经网络架构,不过目前它并非像 CNN、RNN 等传统网络那样被广泛研究和应用,以下为你解释其原理并结合例子说明: 原理 基本结构 三角形神经网络的核心思想是构建一种类似三角形的层次…...
【JavaEE】-- MyBatis操作数据库(1)
文章目录 1. 什么是MyBatis2 MyBatis入门2.1 准备工作2.1.1 创建工程 2.2 配置数据库连接字符串2.3 写持久层代码2.4 单元测试 3. MyBatis的基础操作3.1 打印日志3.2 参数传递3.3 增(insert)3.3.1 返回主键 3.4 删(delete)3.5 改&…...
人工智能大模型备案与服务登记:监管体系的双轨逻辑与实操指南
一、核心差异:监管框架的分层设计 适用范围的本质分野 大模型备案:针对直接向公众提供生成式服务的自研或微调模型(如 ChatGPT 类产品),要求模型具备舆论属性或社会动员能力。典型场景包括智能客服、内容创作平台等。大…...
衡石ChatBI:依托开放架构构建技术驱动的差异化数据服务
在当今数字化浪潮中,企业对数据价值的挖掘和利用需求日益增长。BI(商业智能)工具作为企业获取数据洞察的关键手段,其技术架构的创新与发展至关重要。衡石科技的Chat BI凭借其独特的开放架构,在BI领域脱颖而出ÿ…...
AOSP Android14 Launcher3——RecentsView最近任务数据加载
最近任务是Launcher中的一个重要的功能,显示用户最近使用的应用,并可以快速切换到其中的应用;用户可以通过底部上滑停顿进入最近任务,也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过,本文就不…...
分析型数据库与事务型数据库?核心差异与选型指南
在当今数据驱动的业务环境中,选择合适的数据库架构已成为企业技术决策的关键。然而,面对事务型数据库和分析型数据库的选择,许多技术团队往往陷入困境:日常运行良好的系统在数据量激增时性能骤降,简单的查询在复杂分析…...
Linux-信号
信号是由用户,系统或者进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。 进程分为前台进程和后台进程,对于前台进程我们可以输入特殊的终端字符来给它发送信号,比如输入Ctrlc,发送一个中断信号 系…...
Oracle数据库学习之路-目录
Oracle数据库学习之路 一、安装 (一)数据库安装步骤详解 (二)开发工具安装与配置 二、基础语法篇 (一)基础 SQL 语法详解 (二)SQL 语法练习与案例分析 三、高级语法篇 &…...
用selenium4 webdriver + java 搭建并完成第一个自动化测试脚本
自动化测试任务: 百度搜索自己的姓名。点击第一个链接(或者第二个),在新的页面上,添加断言,验证你的名字是否存在。 实验资料百度网盘下载路径: 链接: https://pan.baidu.com/s/1nVlHX_ivres…...
晨控CK-FR12与欧姆龙NX系列PLC配置EtherNet/IP通讯连接操作手册
晨控CK-FR12系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题:围绕CK-FR12产品的EtherNet/IP通讯协议与欧姆龙PLC进行通讯配置…...
武装Burp Suite工具:RouteVulScan插件_被动扫描发现漏洞.
武装Burp Suite工具:RouteVulScan插件_被动扫描. RouteVulScan 是一款使用Java语言编写,基于Burp Suite API的插件,用于递归地检测潜在的脆弱路径。 该插件通过被动扫描的方式,对路径的各个层级进行深度分析。利用预设的正则表达…...
Selenium+Java 环境搭建
windows电脑环境搭建Chrome浏览器 1.下载 Google Chrome 网络浏览器 (一定要下载官方的!!!) 注:最好下载在浏览器默认的路径 便于查找,而且占内存不是很大 2.查看chrome浏览器的版本 3.下载…...
网易云IP属地可以查看城市吗?深度解析与使用指南
在互联网时代,用户的隐私和数据安全越来越受到关注。许多社交平台和应用都会显示用户的IP属地,以增加透明度和真实性。网易云音乐作为国内领先的音乐平台,也引入了IP属地显示功能。那么,网易云IP属地能否精确到城市?这…...
Cline 之Plan和Act模式
Cline 提供了 "Plan & Act"双模式开发框架。适用在不同的场景。 一、核心模式理念 通过结构化开发流程提升AI编程效率,采用"先规划后执行"的核心理念。 该框架旨在帮助开发者构建更易维护、准确性更高的代码,同时显著缩短开发…...
【Java面试笔记:基础】7.int和Integer有什么区别?
在Java中,int和Integer虽然都用于表示整数值,但它们在本质、用法和特性上有显著差异。 1. int 和 Integer 的区别 int: 原始数据类型:int 是 Java 的 8 个原始数据类型之一,用于表示整数。性能优势:直接存…...
嘻游后台系统与机器人模块结构详解:功能逻辑 + 定制改造实战
作为“嘻游电玩三端组件”系列的最后一篇,本篇将全面剖析平台自带的后台控制系统与机器人行为逻辑模块,包括:用户管理、房间配置、日志系统、机器人规则编排与行为策略扩展等。通过技术视角展示其整体框架与可拓展性,帮助开发者更…...
Linux 网络编程:select、poll 与 epoll 深度解析 —— 从基础到高并发实战
一、IO 多路复用:解决并发 IO 的核心技术 在网络编程中,当需要同时处理大量客户端连接时,传统阻塞式 IO 会导致程序卡在单个操作上,造成资源浪费。IO 多路复用技术允许单线程监听多个文件描述符(FD)&#…...
在统信UOS1060上安装Fail2Ban并通过邮件发送通知
在统信UOS1060上安装Fail2Ban并通过邮件发送通知 Fail2Ban 是一个开源的防止暴力攻击的软件,可以有效保护您的服务器免受频繁的登录失败攻击。本文将指导您如何在统信UOS 1060上安装Fail2Ban,并在IP被封禁后通过邮件发送通知。 步骤 1:查看…...
PyTorch 分布式 DistributedDataParallel (DDP)
在之前的讨论(或者如果你直接跳到这里)中,我们了解了 torch.nn.DataParallel (DP) 作为 PyTorch 多 GPU 训练的入门选项。它简单易用,但其固有的主 GPU 瓶颈、GIL 限制和低效的通信模式,往往让它在实际应用中难以充分发…...
精益数据分析(14/126):基于数据洞察优化产品与运营
精益数据分析(14/126):基于数据洞察优化产品与运营 在创业和数据分析的道路上,我们都在不断摸索前行。我一直希望能和大家共同学习、共同进步,所以今天继续为大家解读《精益数据分析》。这次我们将深入探讨HighScore …...
flutter 插件收集
2025年 1月10号Flutter插件手机 声音转文字 speech_to_text | Flutter package 文字转声音 flutter_tts | Flutter package 堆栈信息 stack_trace | Dart package 跳转到app设置里面 app_settings | Flutter package 轻松的动画 animations | Flutter package 日志打印 t…...
WPF特性分析
文章目录 WPF特性全面分析与性能优化指南引言WPF核心特性1. 声明式UI与XAML2. 硬件加速渲染3. 数据绑定与MVVM4. 样式与模板5. 动画系统 WPF与其他框架比较WPF vs. WinFormsWPF vs. UWPWPF vs. MAUI WPF性能优化最佳实践1. 内存管理优化2. UI虚拟化3. 使用冻结对象4. 减少视觉树…...
3.1goweb框架gin下
Gin 框架有内置的模板引擎,它允许你将数据和 HTML 模板结合,动态生成网页内容。 模板引擎基础使用 单模板文件示例 以下是一个简单的使用单个 HTML 模板文件的示例,展示了如何在 Gin 中渲染模板: package mainimport ("g…...
【全解析】深入理解 JavaScript JSON 数据解析
一、JSON 概述 1. 概念 JSON 全称为 JavaScript Object Notation,是一种轻量级的数据交换格式。它是 JavaScript 中用于描述对象数据的语法的扩展。不过并不限于与 JavaScript 一起使用。它采用完全独立于语言的文本格式,这些特性使 JSON 成为理想的数…...
影刀RPA怎么和AI结合,制作自动采集小红书爆款文章+自动用AI改写标题、内容+用AI文生图生成发文图片+自动在小红书上发布文章
环境: 影刀5.26.24 Win10专业版 doubao deepseek r1 wps 问题描述: 影刀RPA怎么和AI结合,制作自动采集小红书爆款文章+自动用AI改写标题、内容+用AI文生图生成发文图片+自动在小红书上发布文章,最后上传到飞书备份 解决方案: 1.主要流程如下: 全局变量设置(关键…...
懒人一键搭建符号执行环境V5K3
0.背景 在写完上一篇文章后发现,其实V5k3的组合也可以使用。Verilator v5.x 系列版本完全支持本项目的编译与仿真。 不同于 v3 版本,Verilator v5 引入了更严格的访问控制机制:要从 Verilator 生成的 C 仿真模型中访问内部信号或变量&#x…...