- 博客(137)
- 收藏
- 关注
原创 HashMap底层采用数组+链表而非数组+数组的设计,主要基于以下原因及两者的对比:
HashMap选择数组+链表(及树化)的设计,是在内存效率、操作性能、实现复杂度之间权衡的结果,尤其适合高频插入/删除且冲突可控的场景。:当冲突严重时(如Java 8中链表长度≥8),可转换为红黑树,将查找时间从O(n)优化至O(log n)。:插入可能导致扩容(复制元素),删除可能需要移动元素或标记空洞,时间复杂度可能为O(n)。:良好的哈希函数会限制桶内元素数量(通常较少),此时链表与动态数组的性能差异不大。:无需指针,但可能因扩容导致未使用的预留空间(如容量为4的数组仅存2个元素)。
2025-04-06 22:51:16
142
原创 1. 标准库的强依赖(核心原因)
/ 若移动是noexcept则移动,否则拷贝。// 可能触发拷贝而非移动(性能下降)拷贝构造函数通常允许抛出异常(如内存不足),因为源对象保持不变,程序状态可回滚。移动操作应仅涉及指针交换、整型赋值等简单操作,避免可能抛出的操作(如内存分配)。如果移动可能失败,说明设计存在问题(应改用拷贝或重构资源管理)。(因为移动中抛出异常会导致数据丢失,破坏容器的一致性)。强制开发者确保移动操作不会失败,从而避免上述问题。,编译器或标准库可能选择保守的拷贝策略,牺牲性能。现有元素到新内存,而非拷贝(为了性能)。
2025-04-06 22:50:50
507
原创 多进程/线程访问动态库全局变量的安全性
场景安全性原因多进程访问动态库全局变量安全每个进程有独立的数据段副本多线程访问动态库全局变量不安全(需同步)同一进程的线程共享数据段,导致竞态条件代码示例(线程安全问题)cpp复制// 动态库中定义全局变量// 线程函数(不安全)i++) {// 竞态条件// 解决方案:使用互斥锁i++) {
2025-04-06 22:50:02
322
原创 C++中的静态函数和静态成员函数具有以下特点:
/ 错误,无法访问非静态成员。关键字修饰的非成员函数,作用域仅限于当前编译单元(即定义它的源文件),具有内部链接性。// 合法,通过对象访问私有成员。// 隐藏Base::func()// 正确,可访问静态成员。:静态成员函数通过类或对象间接操作数据,而静态函数独立于类存在。:不能直接访问类的非静态成员(变量或函数),只能操作静态成员。关键字声明,属于类本身而非类的实例,可直接通过类名调用。:派生类可定义同名静态函数,但会隐藏基类版本,而非覆盖。:属于类作用域,可通过对象实例间接访问非静态私有成员。
2025-04-03 20:05:34
259
原创 这个LRUCache的实现是正确的,能够有效地处理缓存的获取和更新操作,符合LRU(最近最少使用)策略的要求。以下是对代码的分析和改进建议:正确性分析数据结构选择:使用双向链表list来维护缓存
缓存已满时,删除链表尾部节点(最久未使用)并更新哈希表,然后将新节点插入链表头部。来维护缓存项的访问顺序,最近访问的项在链表头部,最久未访问的项在尾部。存储键到链表迭代器的映射,确保了O(1)时间复杂度的查找、插入和删除操作。方法将对应节点移动到链表头部,保持访问顺序,时间复杂度O(1)。操作不会使链表迭代器失效,保证了哈希表中迭代器的有效性。:将节点移动操作提取为成员函数,减少重复代码。:调整代码顺序,成员变量私有化,增加可维护性。:若键存在,更新值并将节点移动到链表头部。),提高代码复用性和可读性。
2025-04-02 23:34:52
866
原创 HashMap底层采用数组+链表而非数组+数组的设计,主要基于以下原因及两者的对比:
HashMap选择数组+链表(及树化)的设计,是在内存效率、操作性能、实现复杂度之间权衡的结果,尤其适合高频插入/删除且冲突可控的场景。:当冲突严重时(如Java 8中链表长度≥8),可转换为红黑树,将查找时间从O(n)优化至O(log n)。:插入可能导致扩容(复制元素),删除可能需要移动元素或标记空洞,时间复杂度可能为O(n)。:良好的哈希函数会限制桶内元素数量(通常较少),此时链表与动态数组的性能差异不大。:无需指针,但可能因扩容导致未使用的预留空间(如容量为4的数组仅存2个元素)。
2025-04-02 23:34:16
305
原创 以下是C/C++后台开发常见的高概率面试题
快排(分治,平均O(n log n))、堆排序(构建大顶堆)、归并排序(稳定,O(n)空间)12。同步阻塞、非阻塞、多路复用(select/poll/epoll)、异步IO(如IOCP)112。TCP可靠传输(三次握手、四次挥手、超时重传、滑动窗口),UDP无连接、高效但不可靠112。虚拟内存作用(扩展物理内存、隔离进程空间)、页面置换算法(LRU、FIFO)1113。状态码:200(成功)、404(未找到)、502(网关错误)11。反转链表、检测环(快慢指针)、合并有序链表、删除重复节点12。
2025-04-01 16:20:49
451
1
原创 这个错误是由于链接器找不到JSON库(如JsonCpp)中的Json::Value构造函数导致的。以下是逐步解决方案:安装JSON库:确保系统中已安装JsonCpp开发库。Ubuntu/De
target_link_libraries(你的目标名称 PRIVATE JsonCpp::JsonCpp)完成以上步骤后重新编译,链接错误应被解决。如果问题依旧,请检查JsonCpp的安装完整性或尝试重新安装。这个错误是由于链接器找不到JSON库(如JsonCpp)中的。如果JsonCpp安装在非标准路径,使用。确保系统中已安装JsonCpp开发库。:请参考相应包管理器安装。在编译命令中添加链接选项。
2025-03-30 21:43:25
238
1
原创 阻塞式IO与非阻塞IO的区别
data = socket.recv() # 立即返回,若有数据则返回数据,否则抛异常。data = socket.recv() # 调用recv()后,程序卡在这里等待数据。print("暂时无数据,继续处理其他任务") # 程序继续执行其他逻辑。print("收到数据:", data) # 数据到达后才会执行。当程序发起一个I/O操作(如读取文件、网络数据)时,:提高CPU利用率,支持高并发(如同时处理数千连接)。)检查操作状态,实现并发处理多个I/O。I/O结果(阻塞式、非阻塞式均属此类)。
2025-03-30 21:42:10
384
1
原创 . 架构演进1. 单机架构只有一台服务器, 这个服务器负责所有的工作应用服务, 指的是我们写的服务器程序数据库服务, 值得指的是如MySQL如果业务进一步增长, 用户量和数据量都变多, 服
如果一台主机扩展到极限了, 还是不够用, 这时就要引入多台主机了, 此时的系统就叫做**“分布式系统”**(引入分布式, 是万不得已, 系统的复杂程度会大大提高, 出现bug的概率也会提高)(需要进行性能测试, 找到是哪个环节出现了瓶颈, 再去对症下药, 是很困难的)负载均衡, 就像一个组的领导一样, 要负责管理, 要负责把任务分配给每一个组员。但是, 一个主机上面能增加的硬件资源也是有限的, 取决于主板的扩展能力。(机械硬盘, 便宜, 慢 固态硬盘(SSD硬盘), 贵, 快)
2025-03-29 18:54:56
272
1
原创 一. 概念解释1. 应用(Application)/ 系统(System)2. 模块(Module)/ 组件(Component)3. 分布式(Distributed)4. 集群(Cluste
平时我们常说的 4 个 9 即系统可以提供 99.99% 的可⽤性,5 个 9 是 99.999% 的可⽤性,以此类推。MySQL 集群中,只有其中⼀台服务器上数据库允许进⾏数据的写⼊(增/删/改),其他数据库的数据。通常不⽤太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即。集群中,通常有⼀个程序需要承担更多的职责,被称为主;数据库分别⼯作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。被部署于多台服务器上的、为了实现特定⽬标的⼀个/组特定的组件,整个整体被称为集群。
2025-03-29 18:54:05
394
原创 一. redis中的string命令redis中的字符串, 直接就是按照二进制的方式存储的, 不会做任何编码转换不仅可以存储数据, 还可以整数, 普通文本字符串, JSON, xml, 二进制数据一.
如果key不存在, 则让新的value覆盖旧的value, 可能回盖面原来的数据类型, 原来的key的生存时间也会失效。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集。redis中的字符串, 直接就是按照二进制的方式存储的, 不会做任何编码转换。编码问题的,客户端传入的命令中使用的是什么字符集编码,就存储什么字符集编码。如果key不存在, 创建新的键值对。
2025-03-29 18:53:28
196
1
原创 一. redis数据库介绍redis中的database是现成的, 用户不能够自己创建新的数据库, 也不能删除已有的数据库默认redis提供了16个数据库, 标号0~15这16个数据库中的数据是
redis中的database是现成的, 用户不能够自己创建新的数据库, 也不能删除已有的数据库。这16个数据库中的数据是隔离的, 相互之间不会有影响。默认redis提供了16个数据库, 标号0~15。实际使用redis很少关注数据库。二. redis数据库操作命令。获取当前数据库中key的个数。一. redis数据库介绍。删除当前数据库中所有key。删除所有数据库中所有key。默认使用的数据库是0号。
2025-03-29 18:52:54
157
原创 . RabbitMQRabbit, 兔⼦的意思 互联⽹⾏业很多公司, 都喜欢⽤动物命名产品, 或者作为公司的logo, 吉祥物. ⽐如: 腾讯的企鹅, 京东的 狗, 美团的袋⿏, 携程的海豚,阿⾥就
Rabbit, 兔⼦的意思 互联⽹⾏业很多公司, 都喜欢⽤动物命名产品, 或者作为公司的logo, 吉祥物. ⽐如: 腾讯的企鹅, 京东的 狗, 美团的袋⿏, 携程的海豚,阿⾥就更多了, 蚂蚁, ⻜猪,天猫,菜⻦, 闲⻥, 盒⻢…Rabbit 也是⼀个公司名. MQ ( message queue ) 消息队列 的意思 , RabbitMQ 是 Rabbit企业下的⼀个消息队列产品.RabbitMQ 是⼀个实现了 AMQP 的 消息队列 服务,是当前主流的消息中间件之⼀.五. 安装RabbitMQ。
2025-03-29 18:52:24
237
1
原创 1. 什么是需求在多数软件公司,需求分为两部分:用户需求和软件需求。1.1 用户需求用户需求是甲方或终端用户提出的需求,通常比较简略,可能只是一句话。例子:实现一个声控灯实现一个软件
注意:用户需求不能直接作为开发和测试的依据,产品经理需要进行需求分析(技术可行性、市场可行性、成本投入和收益占比等)后,才能转变为软件需求。软件需求(或功能需求)详细描述了开发人员必须实现的软件功能,是测试人员进行测试工作的基本依据。需求------计划------设计------编码------测试------运行维护。软件生命周期从需求开始,经历计划、设计、编码、测试、运行维护,直到软件不再维护。在多数软件公司,需求分为两部分:用户需求和软件需求。用户需求:女朋友说“我饿了”。需求分析:明确建房目标。
2025-03-29 18:51:27
124
原创 . 软件测试的生命周期软件测试贯穿于软件的整个生命周期。 软件测试的生命周期是指测试流程,这个流程是按照一定顺序执行的一系列特定的步骤,去保证产品质量符合需求。每个阶段有不同的目标和交付产物。需
如:错别字、界面格式不规范,页面显示重叠、不该显示的要隐藏,描述不清楚,提示语丢失,文字排列不整齐,光标位置不正确,用户体验感受不好,可以优化性能的方案等。需要注意的是,测试人员不应该一味地要求对Bug进行修改,因为修改可能带来回归的风险,同时带来的是回归测试的工作量,如果时间比较紧迫,修改后剩余的时间若不足以做一次有效的回归测试,可能不修改是个明智的选择。开发代表主要从修改缺陷的难度和风险出发,考虑缺陷修改需要付出的代价,以及可能影响的范围、可能引发的风险等,如果决定要修改,还要讨论出修改的初步方案。
2025-03-29 18:50:45
239
原创 1. 测试用例的概念什么是测试用例?测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。设计测试用例原则一
测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。页面响应时间是否可以接受,关注包括热启动、冷启动时间、页面切换、前后台切换、首字时间,首屏时间等。性能测试和功能测试的区别是:功能测试检查软件是否做了,而性能测试测试软件做的好不好。功能测试 + 界面测试 + 性能测试 + 兼容性测试 + 易用性测试 + 安全测试。除了万能公式之外,还有⼀个⽐较常⽤的测试类型:弱⽹测试、安装卸载测试。
2025-03-29 18:49:49
375
原创 Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)
Linux操作系统中,环形队列RingQueue的进一步使用,以及通过两个互斥锁保护生产者之间的互斥与消费者之间的互斥
2025-03-25 20:10:26
947
原创 Linux操作系统7- 线程同步与互斥6(POSIX信号量与环形队列生产者消费者模型)
Linux操作系统中信号量的使用与RingQueue环形队列实现生产者消费者模型
2025-03-24 22:24:45
894
原创 Linux操作系统7- 线程同步与互斥5(POSIX条件变量生产者消费者模型的进一步使用)
Linux中生产者消费者模型的进一步使用,包含处理结构体数据,三线程两队列模型,多生产多消费模型
2025-03-23 19:14:12
902
原创 Linux操作系统7- 线程同步与互斥4(基于POSIX条件变量的生产者消费者模型)
Linux中使用条件变量和互斥锁实现BlockQueue阻塞队列的生产者消费者模型
2025-03-22 15:16:40
1399
原创 Linux操作系统7- 线程同步与互斥3(POSIX条件变量的使用,线程循环打印数字)
Linux操作系统中条件变量的使用,完成线程之间的同步与互斥
2025-03-21 16:11:47
1039
原创 Linux操作系统7- 线程同步与互斥2(互斥锁的原理,死锁的概念与守卫锁的使用)
Linux中互斥锁的原理与CAS,死锁的概念与基于RAII的lockguard的封装与使用
2025-03-20 14:29:17
954
原创 36.C++哈希1(STL中unordered_set/unordered_map的使用)
C++STL无序序列式容器unordered_set/unordered_map的使用
2025-03-17 21:46:54
863
原创 Linux操作系统6- 线程1(线程基础,调用接口,线程优缺点)
线程的概念,linux中的线程,线程库pthread,线程的资源共享与独立,线程的优缺点
2025-03-09 22:41:45
1445
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人