自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 资源 (1)
  • 收藏
  • 关注

原创 手写跳表数据结构

跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。

2022-06-04 14:39:38 424 1

原创 设计模式之适配器模式(Adapter)

1.定义适配器模式(Adapter)指的是将一个类的接口转换成另一个可以兼容的接口。比如我们日常生活中的转换头、古早时期使用的电池万能充,就相当于程序中使用的适配器模式。2.适配器模式的种类2.1.类适配器模式类适配器模式通过多重继承,将一个接口与另一个接口进行匹配。而对于一些面向对象语言如C#、Java不支持多重继承,那么我们就可以继承一个类,同时实现多个接口来达到适配器的效果。如下图所示:Adaptee:适配者类,它是需要被访问的、需要被适配的组件 Target:目标接口,当前

2022-05-25 16:39:50 754

原创 设计模式之模板模式(Template)

1.定义定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定实现。它属于行为模式中的一种。通俗的讲: 一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写一些方法实现,但调用逻辑将以抽象类中定义的方式进行。2.类图3.手写举例国人现在喜欢喝茶或者喝咖啡,两者都各有各的好处。喝咖啡和喝茶都有有着大致相同的步骤,把茶叶或者咖啡粉导入杯子中,然后倒上热水冲开,最后凉一会儿再喝。3.1.定义抽象类p

2022-05-25 15:15:00 501

原创 设计模式之观察者模式(Observer)

1.开发中的常用场景:聊天室程序的,服务器转发给所有客户端 邮件订阅 Servlet中,监听器的实现 JDK的AWT中事件处理模型,基于观察者模式的委派事件模型(DelegationEventModel) • 事件源----------------目标对象 • 事件监听器------------观察者 京东商城中,群发某商品打折信息2. 核心角色2.1 抽象被观察者角色:  也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主

2022-05-24 22:55:04 191

原创 设计模式之代理模式(Proxy)

代理设计模式主要对方法前后实现增强应用场景1 打印日志2 AOP底层通过代理模式封装3 事务@Transactional 底层AOP4 Mybatis中的mapper接口5 全局捕获异常6 Lcn、Seata、分表分库框架sharding-jdbc 代理数据源7 自定义注解生效8 Rpc远程调用技术(通过dubbo调用接口只会引入接口)代理模式优缺点优点:实现扩展功能、对方法实现增强、安全性、解决代码冗余提高代码复用机制缺点:生成非常多的class文件(代理类)代理模式的

2022-05-24 21:09:52 225

原创 设计模式之工厂模式(Factory)

三种工厂模式的区别模式 说明 简单工厂 用来生产同一等级结构中的任意产品。 (对于增加新的产品,需要修改已有代码) 工厂方法 用来生产同一等级结构中的固定产品。(支持增加任意产品) 抽象工厂 用来生产不同产品族的全部产品。 (对于增加新的产品,无能为力;支持增加产品族) 1.简单工厂模式(又称静态工厂模式)接口定义public interface Game { void run();}Game实现类CFpublic cla

2022-05-23 23:39:54 313

原创 设计模式之单例模式(Singleton)

一.单例模式的定义:单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。二.单例模式

2022-05-23 19:50:55 217

原创 JWT详解

项目中做用户身份验证和系统登录时常常会用到JWT,因此在看了一系列相关的文章后,找到了一篇总结的比较详细的博客,分享给需要的人。内容有点多,就不转载了,直接上链接吧。JWT详解_baobao555#的博客-CSDN博客_jwt...

2022-05-15 21:01:02 196

转载 Spring Cloud Gateway 服务网关的部署

一、为什么需要服务网关:1、什么是服务网关:传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。那有了网关之后,能够起到怎样的改善呢? 网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处在于:(1)简化客户端的工作。网关将微服务封装起来后,...

2022-05-15 11:46:10 694

转载 Feign的工作原理分析

Feign的简单介绍Feign组件主要用于微服务项目中,用来简化服务之间的远程调用,相信大家对他的使用方法已经相当熟悉了。那么Feign到底是如何实现服务的远程调用的呢?又是如何发送请求的呢?发送的请求又是什么样子的呢?本文主要就针对这三个对Feign的原理做一个简单的分析。上面这张图是我按照自己的理解简单的画了一下Feign的主要工作流程,下面将结合Feign底层的源码对工作原理进行详细的分析。Feign的工作原理根据上图我将流程分为主要的三个步骤:通过动态代理在本地实例化远程接口-&

2022-05-15 11:08:41 311

转载 SpringCache整合Redis实现项目缓存解决方案

前言  说实话,在写这一篇文章之前我一直没有搞懂一个问题。明明我们项目中使用最多的缓存技术就是Redis,用Redis就完全就可以搞定缓存的问题了,为什么还有一个SpringCache,以及SpringCache和Redis之间的区别。一、 为什么要使用缓存缓存是将数据直接存入内容中,读取效率比数据库的更高 缓存可以有效地降低数据库压力,为数据库减轻负担二、 常见的缓存中间件Redis、Memcached、Guava、Caffeine,其中Redis和Memcached使用的较多,各自也有

2022-05-14 11:26:13 986

原创 面试常客之手写LFU缓存机制

LFU比LRU的实现更复杂,代码量更大。有两种方式,一是自己实现哈希链表这种数据结构,然后再解答。另一种是使用Java的HashMap和LinkedHashSet来实现,直接使用内置数据结构来解答。直接上代码吧,注释的很清楚了。第一种:自己实现哈希链表这种数据结构class LFUCache { //存储key,value,freq Map<Integer, Node> keyTable; //存储freq和双链表 Map<I

2022-05-09 23:03:43 590

原创 面试常客之手写LRU缓存机制

这道题既能考察LRU缓存机制的原理,又能考察手写数据结构的能力,可谓是“一箭双雕”。Java中的LinkedHashMap能够保证HashMap的有序性,但直接用内置的数据结构就没啥意义了,而且Java的LinkedList的操作时间复杂度不能保证O(1),因此这里我们手写一下哈希链表。哈希表直接用内置的了,当然我这里之前也手写过一个,需要的伙伴可以自己结合一下,手写HashMap_@Sup的博客-CSDN博客直接上代码吧,注释的很清楚了。有一说一,代码量还是有点大的。class LRUCac

2022-05-09 11:38:14 599

原创 手写HashMap

今天在做一个笔试题时,尽然要求手写一个HashMap,当场就懵了......不过话说回来,自己实现的过程中,也能加深对哈希表的理解。直接上代码。class MyHashMap{ static class Node{ int key; String value; Node next; Node(int _key, String _value){ key = _key; valu

2022-05-09 11:36:13 282

转载 微服务架构下如何保证数据的一致性

随着业务的快速发展、业务复杂度越来越高,传统单体应用逐渐暴露出了一些问题,例如开发效率低、可维护性差、架构扩展性差、部署不灵活、健壮性差等等。而微服务架构是将单个服务拆分成一系列小服务,且这些小服务都拥有独立的进程,彼此独立,很好地解决了传统单体应用的上述问题,但是在微服务架构下如何保证事务的一致性呢?从本地事务到分布式事务的演变什么是事务?回答这个问题之前,我们先来看一个经典的场景:支付宝等交易平台的转账。假设小明需要用支付宝给小红转账 100000 元,此时,小明帐号会少 100000 元,.

2022-05-07 21:45:44 2958

原创 ElasticSearch 常用的优化手段总结

1.常见优化设计阶段调优(1)根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;(2)使用别名进行索引管理;(3)每天凌晨定时对索引做 force_merge 操作,以释放空间;(4)采取冷热分离机制,热数据存储到 SSD,提高检索效率;冷数据定期进行 shrink操作,以缩减存储;(5)采取 curator 进行索引的生命周期管理;(6)仅针对需要分词的字段,合理的设置分词器;(7)Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需

2022-04-30 11:05:03 718

原创 Leetcode406题:根据身高重建队列

我只想说,对于数组问题,先排个序,说不定就会有意想不到的惊喜,哈哈哈1.题目描述假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0].

2022-04-29 19:56:48 133

原创 消息队列RabbitMQ如何保证可靠传输

数据的丢失问题,可能出现在生产者、MQ、消费者中1.生产者丢失:生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启RabbitMQ 事务channel.txSelect,然后发送消息。如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息; 如果收到了消息,那么可以提交事务chan

2022-04-29 15:26:42 214

原创 分布式事务解决方案总结

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。首先要搞清楚:ACID、CAP、BASE理论。ACID指数据库事务正确执行的四个基本要素:原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability)CAPCAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容.

2022-04-29 11:23:51 363

原创 Leetcode使用单调栈解决柱状图面积问题

今天刚做了两道Leetcode上难度为Hard的难题,使用到了单调栈的思想,这里将思路总结一下,便于后续复习。这两道题分别是:Leetcode 84. 柱状图中最大的矩形Leetcode 85. 最大矩形1.题目描述1.1 Leetcode84. 柱状图中最大的矩形给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights = [2,1,5,6,2,3]输出:..

2022-04-28 16:50:00 324

原创 Java Coder为什么不建议使用Stack类来实现栈功能

最近在做Leetcode算法题的时候,发现了一个有趣的问题。当需要用到栈这种数据结构时,在java题解中,有的人使用的Stack类来实现,有的人使用LinkedList来实现,还有的人使用Queue或者Deque来实现。对于我这个菜鸡来说,小小的脑袋大大的问号,为了查清楚到底哪种写法是规范化的写法,本菜鸡在查看了很多技术文章后,终于理清了思路。下面直接贴一下我觉得总结的很全面的一篇微信公众号文章,希望能帮助到有同样问题的小伙伴。以下是原文在 Leetcode 的交流区,可以看到这样的一个讨.

2022-04-28 15:31:17 1226

原创 Leetcode301题:删除无效的括号

1.题目描述给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按任意顺序返回。示例1:输入:s = "()())()"输出:["(())()","()()()"]示例2:输入:s = ")("输出:[""]链接:https://leetcode-cn.com/problems/remove-invalid-parentheses/来源:力扣(LeetCode)2.思路分析这道题...

2022-04-28 11:10:10 499

原创 Leetcode647题:求回文子串的数目

这道题和回文子串题类似,但不同的是以往的题目都是要求计算回文子串的最长长度,而这里要求计算回文子串的数目,计算方式略微不同。1.题目描述给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"来源:

2022-04-27 11:17:11 1942

原创 Leetcode75题:颜色分类

本题是经典的「荷兰国旗问题」,由计算机科学家Edsger W. Dijkstra首先提出。1.题目描述给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。示例1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]来源:力扣(LeetCode)链接..

2022-04-23 16:24:01 1729

原创 Leetcode208题:实现 Trie (前缀树/字典树)

1.题目描述Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。 boolea.

2022-04-22 11:33:00 155

原创 ZooKeeper的Session分桶策略

分桶策略ZooKeeper的会话管理主要是由SessionTracker负责的,其采用了一种特殊的会话管理方式,称其为“分桶策略”。所谓分桶策略,是将超时时间相近的会议放到同一个桶中来进行管理,以减少管理的复杂度。在检查超时的会话时,只需要检查桶中剩下的会话即可(没有被转移走的会话全是超时的)。会话超时时间的计算方法如下:可见,超时检查的粒度就是expirationInterval,以这个粒度为单位,就可以分成多个桶,同一个桶中存放着超时时间一致的会话。会话激活有了桶之后,接下来就.

2022-04-21 22:46:13 344

原创 Leetcode拓扑排序系列问题

该问题也是面试中常考的题型,一般有两种解法:一种是正向思维,从入度考虑,类似广度优先搜索; 另一种是逆向思维,从出度考虑,类似深度优先搜索我推荐优先从入度考虑,这个方式比较符合多数人的思维逻辑一、Leetcode207题:课程表1.题目描述你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,

2022-04-21 17:25:06 865

原创 Leetcode接雨水系列问题

目前遇到的有以下相似题目,后续会持续更新......Leetcode11. 盛最多水的容器Leetcode42. 接雨水一、Leetcode11题:盛最多水的容器1.题目描述给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,

2022-04-21 11:00:14 1332

原创 分布式锁以及三种加锁方式

在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?一 为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图:上图可以看到,变量A存在三个服务器内存中(这个变量A主要体现是在一

2022-04-19 21:50:42 2748

原创 Leetcode48题:旋转图像

1.题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotate-image

2022-04-18 20:42:38 324

原创 Leetcode岛屿问题系列分析

在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:200. 岛屿数量(Medium) 463. 岛屿的周长(Easy) 695. 岛屿的最大面积(Medium) 827. 最大人工岛(Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将以...

2022-04-14 16:02:49 1874

原创 牛客网笔试系统ACM模式下的程序输入格式总结

Java提供两种方式进行键盘的输入,BufferedReader 和 Scanner一.用BufferedReader进行输入提供的方法有:readLine(); // 以enter为结束标志,读取一行数据,返回一个字符串,注意点1:导入三个包(也可以直接import java.io.*; 美滋滋)import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;.

2022-04-13 17:22:16 3735

原创 Mybatis的缓存机制

整体示意图:一. 一级缓存localCache在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的 SQL,MyBatis 提供了一级缓存的方案优化这部分场景,如果是相同的 SQL 语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。每个 SqlSession 中持有了 Executor,每个 Executor 中有一个 LocalCache。当用户发起查询时,MyBatis 根据当前执行的语句生成 MappedStatement,在 Local Cac.

2022-04-12 20:58:28 540

原创 Spring 循环依赖问题的解决方法

Spring通过三级缓存解决了循环依赖。singletonObjects:一级缓存,存储的是所有创建好了的单例Bean earlySingletonObjects:二级缓存,存储的是完成实例化,但是还未进行属性注入及初始化的对象 singletonFactories:三级缓存,存储的是提前暴露的一个单例工厂,二级缓存中存储的就是从这个工厂中获取到的对象当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂,添加到三级缓存中,如果A被AOP代理,那么通过这个工厂获取到

2022-04-11 22:44:26 2087 1

原创 剑指 Offer 19题:正则表达式匹配

1.题目描述请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。来源:力扣(LeetCode)链接:https://leetc

2022-04-07 19:24:41 448

原创 剑指 Offer 60题:n个骰子的点数

1.题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian

2022-04-07 17:24:51 140

原创 剑指 Offer 49题:丑数

1.题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例1:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/chou-shu-lcof/2.思路分析丑数的递推性质: 丑数只包含因子 2, 3, 5 ,因此有 “丑数 = 某较小

2022-04-07 16:38:59 598

原创 为什么在重写equals()方法的时候需要重写hashCode()方法

hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。1.为什么需要重写hashCode()方法和equals()方法?有时在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了.我们所知道的JavaBean的超类(父类)是Object类,JavaBean中的equals方法是继承自Object中的方法.Object类中定义的equals()方法是用来比较两个引用所指向的对

2022-04-04 21:39:41 123

原创 剑指 Offer 36题:二叉搜索树与双向链表

1.题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化完成以

2022-04-04 16:06:20 121

原创 剑指 Offer 45题:把数组排成最小的数

1.题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入:[10,2]输出:“102”示例 2:输入:[3,30,34,5,9]输出:“3033459"2.思路分析此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x和 y,则规定 排序判断规则 为:若拼接字符串 x + y > y + x ,则 x“大于” y ; 反之,若 x + y &lt...

2022-04-04 09:05:59 461

ISD1820录放模块

ISD1820录放模块是一款嵌入式开发应用中的录音播放模块,可用于录制10秒左右的声音,用过与单片机连接控制播放模式,应用广泛,操作方便

2018-09-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除