Java——StringBuilder和StringBuffer
StringBuilder和StringBuffer
- 字符串的不可变性
- 字符串修改
- StringBuilder和StringBuffer
- 1 字符串拼接
- 2 获取、修改和删除下标字符
- 3 插入字符
- 4 字符串替换
- 5 字符串反转
- 6 StringBuffer和StringBuilder类与String类的转换
- StringBuffer和StringBuilder类的区别
前言
在Java中String是⼀种不可变对象.字符串中的内容是不可改变,有时候修改成功其实是创建临时变量,但有时候修改次数过多的话,就会影响代码的效率,所以Java提供了StringBuilder和StringBuffer用来修改字符串内容
字符串的不可变性
String是⼀种不可变对象,字符串中的内容是不可改变,字符串不可被修改
下面是JDK17中String的部分源码
在String源码中其实被final修饰的,final修饰的是常量,所以不可以修改,并且其内部有私有成员,因此其并不是真正的修改内容,String的不可变性质
字符串修改
public class Test {public static void main(String[] args) {String s = "abc";s = s +"def";System.out.println(s);}
}
运行结果如下
上面说其不可以被修改,为什么这里的结果却修改了呢,其实这里本质是创建了临时变量,其实是对新对象的修改,并不是修改了原本的对象
,因此这样的修改创建临时变量会影响代码的效率
我们从下面这个代码来直观的感受其效率
public static long currentTimeMillis()
返回值是:long长类型
功能:获取当前的时间,单位是毫秒
public class Test {public static void main(String[] args) {//获取当前时间long start = System.currentTimeMillis();String s = "";for (int i = 0; i < 10000; i++) {s+=i;}//循环结束的时间long end = System.currentTimeMillis();//相减就得到了,这个创建临时变量循环的时间System.out.println(end-start);}
}
这样我们使用一个循环来判断其所创建临时变量所浪费的时间,获取进入循环的时间和结束循环的时间,二者相减就获得了经过循环的时间
运行结果如下
这个效率其实是很慢的,这时候就要引入[StringBuilder]和[StringBuffer]
public class Test {public static void main(String[] args) {//获取当前时间//Stringlong start = System.currentTimeMillis();String s = "";for (int i = 0; i < 10000; i++) {s += i;}//循环结束的时间long end = System.currentTimeMillis();//相减就得到了,这个创建临时变量循环的时间System.out.println("String的时间:"+(end - start));//StringBuilderlong start1 = System.currentTimeMillis();StringBuilder stringBuilder = new StringBuilder("");for (int i = 0; i < 10000; i++) {stringBuilder.append(i);//拼接}long end1 = System.currentTimeMillis();System.out.println("StringBuilder的时间:"+(end1-start1));//StringBufferlong start2 = System.currentTimeMillis();StringBuffer stringBuffer = new StringBuffer("");for (int i = 0; i <10000 ; i++) {stringBuffer.append(i);}long end2 = System.currentTimeMillis();System.out.println("StringBuffer的时间:"+(end2-start2));}
}
运行结果如下
虽然这个运行速率有所改变,但是这里的StringBuffer与StringBuilder的速率相近并且接近于0,String类的速率较慢
从结果中可以看出可以看到在对String类进⾏拼接时,效率是⾮常慢,因此:尽量避免对String的直接需要,如果要修改建议尽量使⽤StringBuffer或者StringBuilder
StringBuilder和StringBuffer
StringBuilder和StringBuffer与String使用类似,但是也有一些其String没有的方法
方法 | 说明 |
---|---|
StringBuffer append(String str) | 尾部追加 |
char charAt(int index) | 获取index下标的字符 |
int length() | 获取字符串长度 |
int capacity() | 获取底层保存字符串空间 |
ensureCapacity(int minimumCapacity) | 扩容 |
setCharAt(int index, char ch) | 将index下标字符改为ch |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str, int fromIndex) | 从fromIndex下标开始找str第一次出现的位置 |
int lastIndexOf(String str) | 从后向前找返回str第一次出现的位置 |
int lastIndexOf(String str, int fromIndex) | 从最后到fromIndex下标开始找str第一次出现的位置 |
StringBuffer insert(int offset, String c) | 在offset插入:八种基本类型与String类 |
StringBuffer deleteCharAt(int index) | 删除index下标字符 |
StringBuffer delete(int start, int end) | 删除从[start,end)下标字符 |
StringBuffer replace(int start, int end, String str) | 将[start,end)下标字符替换为str |
String substring(int start) | 从start下标开始一直到末尾存储到一个新的String类中 |
String substring(int start, int end) | [start,end)下标存储到一个新的String类中 |
StringBuffer reverse() | 将字符串进行反转 |
String toString() | 将所有字符按照String方式返回 |
这里的StringBuilder和StringBuffer方法类似,所以下面只以StringBuffer举例
1 字符串拼接
append(String str)
将str字符串拼接到后面
这个可以将基本八种类型&String类型都可以进行拼接
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("");stringBuffer.append(" ");stringBuffer.append("hello");System.out.println(stringBuffer);StringBuilder stringBuilder = new StringBuilder("");stringBuilder.append(" ");stringBuilder.append("hello");System.out.println(stringBuilder);}
}
运行结果如下
2 获取、修改和删除下标字符
1.获取下标字符
char charAt(index)
获取index下标字符
返回char类型
StringBuffer stringBuffer = new StringBuffer("abc");char ch = stringBuffer.charAt(1);System.out.println(ch);
运行结果如下
2.修改下标字符
char setCharAt(index)
获取index下标字符
返回void类型
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("abc");System.out.println("修改前:"+stringBuffer.charAt(1));// - 获取1下标的字符--’b'stringBuffer.setCharAt(1,'m');//修改1下标字符System.out.println("修改后:"+stringBuffer.charAt(1));}
}
)
注意:这里由于返回的是void类型,所以这里只是对 StringBuffer修改,不可以直接打印
如果直接打印其修改过程,编译器就会报错
3.删除下标字符
deleteCharAt(int index)删除index下标字符
deleteCharAt(int start,int end)删除[start,end)下标字符
返回值都是void
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("abcdef");System.out.println("修改前:"+stringBuffer.charAt(1));// - 获取1下标的字符--’b'stringBuffer.setCharAt(1,'m');//修改1下标字符System.out.println("修改后1下标后:"+stringBuffer);stringBuffer.deleteCharAt(1);//删除指定下标System.out.println("删除1下标后:"+stringBuffer);//删除下标区间的字符stringBuffer.delete(1,5);System.out.println("删除[1,5)下标字符后:"+stringBuffer);}
}
这里首先打印1下标字符,其次修改1下标字符为’m’,其次删除1下标字符,最后删除[1,5)下标字符后的stringBuffer
3 插入字符
insert(int offset, String str)
在offset插入字符串str
这里的str需要插入的可以是基本八种类型和String类
但是本质还是将其转化为字符串表示形式进行插入
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("aaaaa");stringBuffer.insert(1,"___");System.out.println(stringBuffer);stringBuffer.insert(3,3.12);System.out.println(stringBuffer);}
}
第一次是从1下标开始插入_ _ _
第二次会在其基础上的从3下标开始插入3.12,虽然是double类型,其实本质还是插入字符串类型
4 字符串替换
replace(int start, int end, String str)
将[start,end)下标字符替换为字符串str
如果str长度<这个区间的长度,从前向后替换,替换后多余的变成“”空白,字符串内容会减少
如果str长度>这个区间长度,编译器会自动扩容把这个字符串全部放进去,只修改[start,end)区间的字符,其他的不会修改
str字符串长度等于[start,end)区间长度
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("aaaaaa");System.out.println("原本其长度:"+stringBuffer.length());stringBuffer.replace(0,4,"AAAA");System.out.println(stringBuffer);System.out.println("取代后长度:"+stringBuffer.length());}
}
这里取代的字符串长度是等于[0,4)这个区间的大小的,都是为4,这是正常取代
原本字符串长度没有改变
str字符串长度小于[start,end)区间长度
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("aaaaaa");System.out.println("原本其长度:"+stringBuffer.length());stringBuffer.replace(0,4,"AA");System.out.println(stringBuffer);System.out.println("取代后长度:"+stringBuffer.length());}
}
这里我们是准备将[0,4)区间的字符替换为str的,但是这个str长度小于[start,end)区间长度
这个时候在取代的时候,编译器会将其区间替换,可以理解为多余的会变成”“空白
这里相当于 ”AA"替换4个位置,从前向后,多的就直接相当于空
这时候编译器会自动减小字符串长度
str字符串长度大于[start,end)区间长度
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("aaaaaa");System.out.println("原本其长度:"+stringBuffer.length());stringBuffer.replace(0,4,"AAAAAAAAAAA");System.out.println(stringBuffer);System.out.println("取代后长度:"+stringBuffer.length());}
}
这时候str字符串长度大于[0,4)区间长度,它不管你是否够方下,它直接将这些字符全部放在从start下标开始,直到放完结束,[0,4)下标以外的字符不会修改,只是下标可能变了,其实这里相当于给字符串扩容了
5 字符串反转
reverse()字符串反转
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("hello");System.out.println("反转前:"+stringBuffer);stringBuffer.reverse();System.out.println("反转后:"+stringBuffer);}
}
6 StringBuffer和StringBuilder类与String类的转换
直接转化的话是不可以的,编译器会报错
**toString()**方法将StringBuffer类转化为String类
public class Test {public static void main(String[] args) {StringBuffer stringBuffer = new StringBuffer("bbb");StringBuilder stringBuilder = new StringBuilder("ccc");String string = new String("aaa");//将其转化为String赋值string = stringBuffer.toString();System.out.println(string);string = stringBuilder.toString();System.out.println(string);}
}
运行结果如下,这里是不可以直接赋值,需要使用toString方法转化为String类
StringBuffer和StringBuilder类的区别
StringBuffer和StringBuilder从⽅法的功能上来说没有太⼤区别
但是二者方法内部有区别
StringBuffer和StringBuilder类的区别
1 方法功能都是一样的
2 其 StringBuffer类中的方法,前面多了一个synchronized修饰,这个相当于一个锁,有人使用就把锁锁上,使用完离开就将锁打开
3 因此StringBuffer是同步处理,是线程安全的,而StringBuilder类没有采取同步处理,线程不安全
到这里就结束了,预知后事如何,请听下回分解
相关文章:
Java——StringBuilder和StringBuffer
StringBuilder和StringBuffer 字符串的不可变性字符串修改StringBuilder和StringBuffer1 字符串拼接2 获取、修改和删除下标字符3 插入字符4 字符串替换5 字符串反转6 StringBuffer和StringBuilder类与String类的转换 StringBuffer和StringBuilder类的区别 前言 在Java中String…...
基于yolo11的BGA图像目标检测
1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像,达到识别要求,减少计算量 4.标注数据的精准程度 1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验 2.明确边界框贴合…...
MongoDB 复制集实战
MongoDB 复制集实战 MongoDB 复制集架构 一、复制集核心原理 主从架构与数据冗余 复制集由主节点(Primary)和多个从节点(Secondary)构成,所有节点存储相同数据集副本。 主节点:唯一接受写操作的节点&…...
一个服务器算分布式吗,分布式需要几个服务器
一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...
k8s之Ingress讲解
一、Ingress基本介绍 Ingress是管理k8s外部访问(http/https)的API对象,提供应用层的路由功能,处理第七层(http/https)流量,支持基于域名、路径的路由。与service不同的是,service处理…...
centos-LLM+EmbeddingModel+VectorDB-简单模型
参考: Ollama平台里最流行的embedding模型: nomic-embed-text 模型介绍和实践-CSDN博客 https://blog.csdn.net/skywalk8163/article/details/145498041 https://docs.cherry-ai.com/knowledge-base/data Installation — Sentence Transformers docum…...
Uniapp 持续出现 Invalid Host/Origin header 解决方法
目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...
密码学基础——古典密码学
目录 一、定义 特点: 二、发展阶段 三、代换密码 1.单表代换密码 1.1恺撒密码 1.2 移位变换 1.3 仿射变换 2.多表代换密码 维吉尼亚密码 四、置换密码 栅栏密码 一、定义 古典密码学是指在现代密码学出现之前,使用较为简单的数学方法和手工…...
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
Java 连接 Redis 的驱动分类及对比 1. Jedis 类型:纯 Java 实现的 阻塞式(同步) 客户端特点: 基于阻塞 IO,每个连接一个线程,适合中小型应用。支持单机、哨兵模式、集群模式。使用简单,直接操作…...
人工智能之数学基础:基于吉文斯变换完成矩阵的QR分解
本文重点 在数值线性代数中,QR分解是将矩阵分解为一个正交矩阵(Q)和一个上三角矩阵(R)的重要方法。它在求解线性方程组、计算矩阵特征值及最小二乘问题中具有广泛应用。吉文斯变换(Givens Transformation)作为实现QR分解的核心工具之一,通过平面旋转变换逐步消去矩阵元…...
后端框架入门:Django
Django 基础:模型、视图、模板Django REST Framework 的使用一、Django 概述 Django 是一个 高效、灵活、可扩展 的 Python Web 框架,主要用于快速开发 Web 应用 和 REST API。 📌 Django 的优势: ✅ MTV 架构:模型(Model)、视图(View)、模板(Template)分离,便于…...
16变量命名风格
给变量/函数/文件/类 起名字, 非常有讲究的~~ 1.起的名字要有描述性.不要使用 abc,xyz 这种比较无规律的名字来描述 2.如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词 C中,偏好使用_来进行单词的分割. 形如: student_count(变量) unordered_map(stl容…...
【自学笔记】jQuery语言基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 jQuery基础知识点总览1. jQuery简介2. jQuery选择器示例代码 3. jQuery事件示例代码 4. jQuery动画示例代码 5. jQuery Ajax示例代码 6. jQuery DOM操作示例代码 总…...
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期(220-280年)的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库,收录建安十二年(207年)至建兴十二年…...
读取excel作为第一列创建数据表,然后将值插入数据表
读取 Excel 文件。创建一个数据库表,其列名与 Excel 表格的列名相同。插入数据,对于每一行,如果数据为 #N/A,插入空值。 下面是一个 Python 示例代码,使用 pandas 读取 Excel 文件,创建数据库表࿰…...
14-SpringBoot3入门-MyBatis-Plus之CRUD
1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...
英语口语 -- 常用 1368 词汇
英语口语 -- 常用 1368 词汇 介绍常用单词List1 (96 个)时间类气候类自然类植物类动物类昆虫类其他生物地点类 List2 (95 个)机构类声音类食品类餐饮类蔬菜类水果类食材类饮料类营养类疾病类房屋类家具类服装类首饰类化妆品类 Lis…...
《汽车噪声控制》课程作业
作业内容 在MATLAB绘制给出单个正弦波或余弦波的时域图和频域图 绘制实测数据的时域图和频域图 图1 单个正弦波的时频图 图1 单个正弦波的时频图 % 正弦波参数设置 f0 1000; % 信号频率 1kHz Fs 16384; % 采样频率 16kHz T 0.05; % 信号持续时间 0.05秒 A 0.8; % 信号幅度…...
nginx的反向代理和负载均衡
http 协议反向代理 反向代理配置参数: proxy_pass;#用来设置将客户端请求转发给的后端服务器的主机 可以是主机名(将转发至后端服务做为主机头首部)、IP地址:端口的方式 也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支…...
栈 —— 数据结构基础刷题路程
一、P1739 表达式括号匹配 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//压栈void push(int data){a[t]data; } //取栈顶元素int top(){return a[t]; } //弹出栈顶元素void pop(){i…...
SQL语句(一)—— DDL
目录 一、SQL 基础知识 (一)SQL 通用语法 (二)SQL 分类 二、DDL —— 数据库操作 1、查询所有数据库 2、查询当前数据库 3、创建数据库 4、删除数据库 5、切换数据库 三、DDL —— 表操作 (一)查…...
ROS2 高级组件中的webots介绍
前言 这一篇文章主要是和大家分享一下关于ROS2 高级组件中的webots,会介绍关于webots的知识点,以及如何安装和测试环节,最后就是利用 webots 实现一个差速轮式机器人的运动仿真。 正文内容 webots 引入和学习资料 webots 是来自瑞士的 Cy…...
SvelteKit 最新中文文档教程(17)—— 仅服务端模块和快照
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …...
Java 基础-29-final关键字-详解
在Java编程语言中,final是一个非常重要的关键字,它用于不同的上下文中以表示某些东西是不可变的。本文将详细介绍final关键字的各种用法和其应用场景。 1. final变量 当你将一个变量声明为final时,这意味着一旦给这个变量赋值后,…...
从数据透视到AI分析,用四层架构解决运维难题
在数字化转型的浪潮中,企业 IT 系统已从单一架构演变为多云、多设备、多应用的复杂生态。传统监控工具因覆盖不全、响应滞后、分析能力弱而逐渐失效。Site24x7 以“全栈覆盖 智能协同”为核心,构建了一套四层递进式监控架构,实现从基础设施到…...
大智慧前端面试题及参考答案
如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...
PyQt学习记录
PyQt学习记录 要在界面上 创建一个控件,就需要在程序代码中 创建 这个 控件对应类 地一个 实例对象。 在Qt系统中,控件(widget)是 层层嵌套 的,除了最顶层的控件,其他的控件都有父控件。 几个函数 函数mo…...
人工智能赋能管理系统,如何实现智能化决策?
随着信息技术的飞速发展,人工智能(AI)已经成为推动各行各业变革的重要力量。在企业管理领域,人工智能技术的引入为管理系统的智能化决策提供了强有力的支持。本文将深入探讨人工智能如何赋能管理系统,实现智能化决策&a…...
【深度学习新浪潮】DeepSeek近期的技术进展及未来动向
一、近期技术进展 模型迭代与性能提升 DeepSeek-V3-0324版本更新:2025年3月24日发布,作为V3的小版本升级,参数规模达6850亿,采用混合专家(MoE)架构,激活参数370亿。其代码能力接近Claude 3.7,数学推理能力显著提升,且在开源社区(如Hugging Face)上线。DeepSeek-R1模…...
存储型XSS漏洞解析
一、存储型XSS漏洞的核心原理 定义与攻击流程 存储型XSS(Stored XSS)是一种将恶意脚本永久存储在服务器端(如数据库、文件系统)的跨站脚本攻击方式。其攻击流程分为四步: 注入阶段:攻击者通过输入点&…...
Python实现 MCP 客户端调用(高德地图 MCP 服务)查询天气工具示例
文章目录 MCP 官网GithubMCP 仓库简介架构高德地图 MCP 客户端示例python-sdk 客户端java-sdk 客户端 MCP 官网 https://modelcontextprotocol.io/introduction Github python-sdk:https://github.com/modelcontextprotocol/python-sdkjava-sdk:https…...
Flink介绍——实时计算核心论文之S4论文总结
PE对象的构成与功能 我们先来看下S4是怎么抽象流式计算的。 S4将所有的计算过程抽象为一个个Processing Element(处理元素)对象,简称为PE对象。 每一个PE对象,都有四部分组成,分别是: 功能(F…...
第二十四章:Python-folium库实现中国地图绘制
一、folium库简介 hchinamap库是一个专门用于绘制中国地图的R包,它通过与Highmaps图表库的结合,提供了一种简单的方式来绘制中国及其各省市自治区的地图。虽然hchinamap库是为R语言设计的,但在Python中也可以通过类似的库(如matpl…...
云巅之上:数字文明的重构与超越
序章:算力新纪元 2024年初春,当SpaceX的星舰将首批云计算节点送入近地轨道时,地球上的数字原住民们正通过云端AI助手规划着一天的行程。这场静默的革命已悄然进入新阶段——云计算不再只是工具,而是成为数字文明的"第六元素…...
蓝桥杯高频考点——高精度(含C++源码)
高精度 前言高精度加法例题思路及代码solution 1(初阶版 40分)solution 2(完全体 AC) 高精度乘法例题思路及代码solution 1(TLE 但是代码很清晰)solution 1的问题solution 2(优化 AC)…...
程序化广告行业(52/89):程序化创意深度剖析
程序化广告行业(52/89):程序化创意深度剖析 大家好!我一直对程序化广告领域充满热情,在学习过程中发现其中有很多有趣又实用的知识。今天写这篇博客,就是希望能和大家一起学习进步,深入探索程序…...
selenium和pytessarct提取古诗文网的验证码(python爬虫)
代码实现的主要功能: 浏览器自动化控制 验证码图像获取与处理 OCR验证码识别 表单自动填写与提交 登录状态验证 异常处理与资源清理 1. 浏览器初始化与页面加载 driver webdriver.Chrome() driver.get("https://www.gushiwen.cn/user/login.aspx?fro…...
封装可拖动弹窗(vue jquery引入到html的版本)
vue cli上简单的功能,在js上太难弄了,这个弹窗功能时常用到,保存起来备用吧 备注:deepseek这个人工智障写一堆有问题的我,还老服务器繁忙 效果图: html代码: <div class"modal-mask&qu…...
JavaScript重难点突破:期约与异步函数
同步和异步 同步(Synchronous) 定义:任务按顺序依次执行,前一个任务完成前,后续任务必须等待。 特点:阻塞性执行,程序逻辑直观,但效率较低 异步(Asynchron…...
Spring事务的传播机制
目录 Spring 中事务的实现编程式事务(了解即可):声明式事务(利用注解自动开启和提交事务):事务回滚注意事项: Spring 事务传播机制:1.Propagation.REQUIRED:7.Propagation.NESTED:Propagation.NESTED和1.Pr…...
LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
什么是向量搜索Vector Search?
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
处理网络请求时,我们经常会遇到需要中途取消请求的情况,比如用户在两个tab之间反复横跳的场景,如果每个接口都从头请求到结束,那必然会造成很大的服务压力。 AbortController是一个Web API,它提供了一个信号对象&…...
GitHub与Gitee各是什么?它们的区别与联系是什么?
李升伟 整理 GitHub 介绍 GitHub 是一个基于 Git 的代码托管平台,主要用于版本控制和协作开发。它支持多人协作,提供代码托管、问题跟踪、代码审查、项目管理等功能。GitHub 是全球最大的开源社区,许多知名开源项目都在此托管。 主要功能&…...
OpenCV图像形态学:原理、操作与应用详解
一、引言 图像形态学(Image Morphology)是图像处理领域的一个重要分支,它基于集合论、格论、拓扑学和随机函数理论,主要用于分析和处理图像的几何结构。形态学操作通过特定的结构元素(Structuring Element)…...
ubuntu git cola gui
直接的方法, samba, win 里用 tortoiseSVN 需要先在命令行,运行 git 命令,看到操作提示, 按照提示做 然后右键看 git diff 其它的方法 linux下可视化git工具git-cola安装与使用(HTTP方式)_git…...
RTX5080 安装torch,torchvision ,torchaudio 指南
一、前置准备 5080 显卡 是sm120 架构,只有torch的preview版本可以使用,而且该版本仅支持cuda12.8. 请你放弃下载以及使用低版本cuda cudnn torch 的想法。 请你学习conda 创建环境,激活环境,在虚拟环境里使用pip ,…...
ubuntu开发mcu环境
# 编辑 vim或者vscode # 编译 arm-none-eabi # 烧写 openocd 若是默认安装,会在/usr/share/openocd/scripts/{interface,target} 有配置接口和目标版配置 示例: openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg 启动后,会…...
《UNIX网络编程卷1:套接字联网API》第5章 TCP客户服务器程序示例
《UNIX网络编程卷1:套接字联网API》第5章 TCP客户/服务器程序示例 5.1 本章目标与示例程序概述 本章通过一个完整的TCP回射(Echo)客户/服务器程序,深入解析TCP套接字编程的核心流程与关键问题。示例程序的功能为:客户…...
花洒洗澡完毕并关闭后过段时间会突然滴水的原因探究
洗澡完毕后的残留水 在洗澡的过程中,我们通常会使用到大量的水。这些水会通过花洒管子到达花洒顶喷流出。由于大顶喷花洒的喷头较大,关闭后里面的存水会更多。 气压失衡后的滴水 当花洒关闭后,内部的水管和花洒头中仍存有一定量的水。由于…...