
算法与数据结构面试宝典
文章平均质量分 91
白话机器学习
10年IT从业经验,人工智能高级算法工程师、优快云博客专家、阿里云专家、《2023博客之星马龄赛道11-15年》第一名、《2023博客之星,城市赛道》长春TOP1,优快云付费资源项目实践专家
展开
-
如何用好java cache让接口性能提升100倍
商城首页的商品分类功能实现,考虑分类是放在商城首页,以后流量大,而且不经常变动,为了提升首页访问速度,考虑使用缓存。对于java开发而言,首先的缓存当然是redis。优化前系统流程图:我们从图中可以看到,分类功能分为生成分类数据 和 获取分类数据两个流程,生成分类数据流程是有个JOB每隔5分钟执行一次,从mysql中获取分类数据封装成首页需要展示的分类数据结构,然后保存到redis中。获取分类数据流程是商城首页调用分类接口,接口先从redis中获取数据,如果没有获取到再从mysql中获取。原创 2024-07-04 10:57:34 · 1105 阅读 · 1 评论 -
spring常用技巧总结
说实话,个人认为springboot自带的Conditional系列已经可以满足我们绝大多数的需求了。但如果你有比较特殊的场景,也可以自定义自定义Conditional。@OverrideSystem.out.println("实现自定义逻辑");第三步,使用@MyConditionOnProperty注解。原创 2024-07-04 10:55:47 · 815 阅读 · 0 评论 -
Autowired的使用介绍
我们都知道在spring中@Autowired注解,是用来自动装配对象的。@Service@Autowired没错,这样是能够装配成功的,因为默认情况下spring是按照类型装配的,也就是我们所说的byType方式。此外,@Autowired注解的required。原创 2024-07-04 10:54:00 · 1003 阅读 · 0 评论 -
mybatis日志管理实现原理详解
else不好,7种条件判断太多了,并非优雅的编程。定义了LogException异常,该异常是日志功能的专属异常,如果你有看过mybatis其他源码的话,不难发现,其他功能也定义专属异常,比如:DataSourceException等,这是mybatis的惯用手法,主要是为了将异常细粒度的划分,以便更快定位问题。看到这里,聪明的你可能会有这样的疑问,从上图可以看出mybatis定义了8种useXXXLogging方法,但是在前面的static静态代码块中却只调用了6种,这是为什么?我们用一张图来总结一下。原创 2024-07-04 10:52:35 · 924 阅读 · 0 评论 -
Java全局唯一ID生成方案
以上基本列出了所有常用的分布式ID生成方式,其实大致分类的话可以分为两类:一种是类DB型的,根据设置不同起始值和步长来实现趋势递增,需要考虑服务的容错性和可用性。另一种是类snowflake型,这种就是将64位划分为不同的段,每段代表不同的涵义,基本就是时间戳、机器ID和序列数。这种方案就是需要考虑时钟回拨的问题以及做一些 buffer的缓冲设计提高性能。而且可通过将三者(时间戳,机器ID,序列数)划分不同的位数来改变使用寿命和并发数。原创 2024-07-03 14:02:45 · 2023 阅读 · 0 评论 -
面试之多线程机制详解
只是一个抽象的规范,避免不同硬件和操作系统下对内存访问逻辑有所差异带来同一套代码不同执行结果的问题。原创 2024-07-03 13:49:43 · 1129 阅读 · 0 评论 -
操作系统相关(进程、线程、死锁、分页等)知识点详解
操作系统简称OS,负责管理协调计算机硬件与软件资源工作的****系统软件屏蔽了硬件层的复杂性,为上层应用软件与用户提供易用的服务。原创 2024-07-03 13:48:56 · 1062 阅读 · 0 评论 -
计算机网络体系结构及面试要点详解
多IP增加随机端口;,是一种因特网包探索器,用于测试网络连接量的程序。:TCP通信双方,需维护序列号来保证可靠传输(数据去重,有序等),客户端发送初始化序列号给服务端,服务端收到也要发一个给客户端,客户端收到也要对服务端回复一个确认,两次握手只能保证一方初始化序列能被接收,不能保证两方都可,不可靠。**客户端发送ACK报文:**客户端收到服务端报文,向服务端发送确认的确认,置ACK标志位为1,确认应答号为y+1,然后发给服务端,这次可以携带数据,此后,客户端服务端都处于ESTABLISHED状态。原创 2024-07-03 13:46:45 · 830 阅读 · 0 评论 -
Java之Hashmap扩容机制及原理
如下图所示,n 为 table 的长度,图(a)表示扩容前的 key1 和 key2 两种 key 确定索引位置的示例,图(b)表示扩容后 key1 和key2 两种 key 确定索引位置的示例,其中 hash1 是 key1 对应的哈希与高位运算结果。Java 里的数组是无法自动扩容的,方法是将 Hashmap 的大小扩大为原来数组的两倍,并将原来的对象放入新的数组中。这里就是使用一个容量更大的数组来代替已有的容量小的数组,transfer()方法将原有Entry数组的元素拷贝到新的Entry数组里。原创 2024-07-03 13:45:36 · 726 阅读 · 0 评论 -
Java集合实现机制及使用场景介绍
注意:&与 两个为1才为1 ^异或 相同则为0,不相同则为1因为当容量为2的幂时,h&(length-1)运算才等价于length取模,也就是h%length,而&比%具有更高的效率,也就是计算机会计算的更快。而且这样能尽量均匀分布减少哈希冲突:2的n次方实际就是1后面n个0,2的n次方-1实际就是n个1。这样按位“与”时,每一位都能&1,真正参与了运算,分布更均匀。原创 2024-07-03 13:44:20 · 451 阅读 · 0 评论 -
Java面试常见知识点总结
什么是序列化,序列化就是把 Java 对象转为二进制流,方便存储和传输。所以反序列化就是把二进制流恢复成对象。原创 2024-07-03 13:43:18 · 1462 阅读 · 0 评论 -
大公司为什么禁止SpringBoot项目使用Tomcat?
SpingBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。Undertow在高并发业务场景中,性能优于Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下Undertow,你会发现你的系统性能会得到很大的提升。部分内容来源于网络搜集,如有侵权请联系作者删除。原创 2024-07-03 13:42:03 · 611 阅读 · 0 评论 -
MQ消息队列常见的使用场景介绍
部分内容来源于网络搜集,如有侵权请联系作者删除。原创 2024-07-03 13:41:13 · 1358 阅读 · 0 评论 -
Java Stream常见用法汇总,开发效率大幅提升
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来对 Java 集合运算和表达的高阶抽象。Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。原创 2024-07-02 14:17:45 · 595 阅读 · 0 评论 -
面试:SELECT COUNT(*) 会造成全表扫描?回去等通知吧
SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?网上有一种说法,针对无 where_clause 的COUNT(*),MySQL 是有优化的,优化器会选择成本最小的辅助索引查询计数,其实反而性能最高,这种说法对不对呢针对这个疑问,我首先去生产上找了一个千万级别的表使用 EXPLAIN 来查询了一下执行计划结果如下如图所示: 发现确实此条语句在此例中用到的并不是主键索引,而是辅助索引,实际上在此例中我试验了,不管是 COUNT(1),还是 COUNT(),MySQL 都会用成本最小。原创 2024-07-02 14:14:18 · 407 阅读 · 0 评论 -
Java 泛型(generics)特性及应用详解
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。原创 2024-07-02 14:13:16 · 807 阅读 · 0 评论 -
详解Alibaba开源的Java诊断工具Arthas的常用命令
Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作。支持JDK 6+,支持Linux/Mac/Windows。这个工具真的很好用,而且入门超简单,十分推荐。原创 2024-07-02 14:12:05 · 1595 阅读 · 0 评论 -
新一代分布式任务调度框架
E-Job和X-job都有广泛的用户基础和完整的技术文档,都能满足定时任务的基本功能需求。X-Job 侧重的业务实现的简单和管理的方便,学习成本简单,失败策略和路由策略丰富。推荐使用在“用户基数相对少,服务器数量在一定范围内”的情景下使E-Job 关注的是数据,增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。但是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用部分内容来源于网络搜集,如有侵权请联系作者删除。原创 2024-07-02 14:11:09 · 882 阅读 · 0 评论 -
详解8种常见的系统架构模式
比较简单吧,一些聪明的、爱思考的、上进的同学可能发现问题了,也包括上面介绍的场景一,就是延迟问题,如:数据还没有到从库,我就马上读,那么是读不到的,会发生问题的。这个场景是指我们的业务中的大部分辅助性的查询,如:取钱的时候先查询一下余额,根据用户的ID查询用户的记录,取得该用户最新的一条取钱记录等。问题七,所有需要我部数据的需求,都通过接口的形式发布出去,客户通过接口获取数据,从而屏蔽了底层数据库结构,甚至数据来源,我部只需保证我部的接口契约没有发生变化即可,新的需求增加新的接口,不会影响老的接口。原创 2024-07-02 14:10:24 · 819 阅读 · 0 评论 -
详解Java19新特性
为 Java 引入虚拟线程,虚拟线程是 JDK 实现的轻量级线程,它在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。Record Patterns 可对 record 的值进行解构,Record patterns 和 Type patterns 通过嵌套能够实现强大的、声明性的、可组合的数据导航和处理形式。虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。原创 2024-07-02 14:08:57 · 988 阅读 · 0 评论 -
请详细分析下为什么数据库连接非常耗费资源
在这个最简单的代码中,没有设置任何额外的连接属性,所以在设置属性上占用的时间可以认为是最少的(其实,虽然我们没有设置任何属性,但是驱动仍然设置了字符集、事务自动提交等,这取决于具体的驱动实现),所以整个连接所使用的时间可以认为是最少的。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?,而这还是还可以认为是最少的,当然「花费的时间可能受到网络状况、数据库服务器性能以及应用代码是否高效的影响」 ,但是这里只是一个最简单的例子,已经足够说明问题了!原创 2024-07-02 14:08:06 · 487 阅读 · 0 评论 -
关于限流的几种解决方案详解
部分内容来源于网络搜集,如有侵权请联系作者删除。原创 2024-07-02 14:06:01 · 1126 阅读 · 0 评论 -
JSON Web Token(缩写 JWT)跨域认证解决方案详解
JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。它不需要在服务端保存会话信息, 所以它易于应用的扩展。原创 2024-07-02 14:04:12 · 800 阅读 · 0 评论 -
关于HTTP请求和RPC调用的详细讲解
一直以来都没有深究过RPC和HTTP的区别,不都是写一个服务然后在客户端调用么?HTTP和RPC最本质的区别,就是 **RPC 主要是基于 TCP/IP 协议的**,而 **HTTP 服务主要是基于 HTTP 协议的**。我们都知道 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦!HTTP和RPC的相同点是,底层通讯都是基于socket,都可以实现远程调用,都可以实现服务调用服务原创 2024-07-02 14:02:44 · 1111 阅读 · 0 评论 -
系统架构演进,从传统单体到微服务,再到云原生
在架构的演进过程中,研发运维人员逐渐把关注点从机器上移走,希望更多地由平台系统管理机器,而不是由人去管理,这就是一个对 Serverless 的朴素理解。原创 2024-07-02 14:00:24 · 808 阅读 · 0 评论 -
详细介绍一下order by是怎么工作的?
在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么执行的,以及有什么参数会影响执行的行为。原创 2024-07-02 13:55:59 · 544 阅读 · 0 评论 -
经常听到MySQL最大建议行数 不超过2000w,合理么?
在 mysql 中索引的数据结构和刚刚描述的页几乎是一模一样的,而且大小也是 16K, 但是在索引页中记录的是页 (数据页,索引页) 的最小主键 id 和页号,以及在索引页中增加了层级的信息,从 0 开始往上算,所以页与页之间就有了上下层级的概念。所以,在保持相同的层级(相似查询性能)的情况下,在行数据大小不同的情况下,其实这个最大建议值也是不同的,而且影响查询性能的还有很多其他因素,比如,数据库版本,服务器配置,sql 的编写等等,MySQL 为了提高性能,会将表的索引装载到内存中。原创 2024-07-02 13:54:33 · 603 阅读 · 0 评论 -
大文件上传时如何做到秒传?
通俗的说,你把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给你个新地址,其实你下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,你多加几个字,MD5就变了,就不会秒传了.分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。原创 2024-06-24 05:44:23 · 1074 阅读 · 0 评论 -
美团面试:熟悉哪些JVM调优参数?
今天来熟悉一下,关于JVM调优常用的一些参数。X或者XX开头的都是非标准化参数意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变化,但是就目前来看X开头的非标准化的参数改变的也是非常少。查看当前JVM。原创 2024-06-24 05:43:26 · 886 阅读 · 0 评论 -
面试官:如何保证接口幂等性?一口气说了12种方法!
首先看看幂等性的概念:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果:支付接口,重复支付会导致多次扣钱;订单接口,同一个订单可能会多次创建。原创 2024-06-24 05:42:28 · 1669 阅读 · 0 评论 -
分享几个SQL语法的坑,增加面试竞争力
数据库编译器产生执行计划,决定着SQL的实际执行方式。但是编译器只是尽力服务,所有数据库的编译器都不是尽善尽美的。上述提到的多数场景,在其它数据库中也存在性能问题。了解数据库编译器的特性,才能避规其短处,写出高性能的SQL语句。程序员在设计数据模型以及编写SQL语句时,要把算法的思想或意识带进来。编写复杂SQL语句要养成使用 WITH 语句的习惯。简洁且思路清晰的SQL语句也能减小数据库的负担。原创 2024-06-24 05:41:09 · 715 阅读 · 0 评论 -
Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?
假设这里只有一级和三级缓存的话,我每次从三级缓存中拿到singleFactory对象,执行getObject()方法又会产生新的代理对象,这是不行的,因为AService是单例的,所有这里我们要借助二级缓存来解决这个问题,将执行了singleFactory.getObject()产生的对象放到二级缓存中去,后面去二级缓存中拿,没必要再执行一遍singletonFactory.getObject()方法再产生一个新的代理对象,保证始终只有一个代理对象。再来看看循环依赖中是怎么拿其它半成品的实例对象的。原创 2024-06-24 05:39:43 · 774 阅读 · 0 评论 -
分享一次简单的 JVM 调优,面试可参考
最近对负责的项目进行了一次性能优化,其中包括对 JVM 参数的调整,算是进行了一次简单的 JVM 调优,JVM 参数调整之后,服务的整体性能有 5% 左右的提升,还算不错。先介绍一下项目的基本情况:项目是一个高 QPS 压力的 web 服务,单机 QPS 一直维持在 1.5K 以上,由于旧机器的”拖累”,配置的堆大小是 8G,其中 young 区是 4G,垃圾回收器用的是 parNew + CMS。首先是查看当前 GC 的情况,主要是使用jstat。原创 2024-06-24 05:38:35 · 1129 阅读 · 0 评论 -
减少 “重复代码” 的技巧有哪些?
第一种代码重复是,有多个并行的类实现相似的代码逻辑。我们可以考虑提取相同逻辑在父类中实现,差异逻辑通过抽象方法留给子类实现。使用类似的模板方法把相同的流程和逻辑固定成模板,保留差异的同时尽可能避免代码重复。同时,可以使用 Spring 的 IoC 特性注入相应的子类,来避免实例化子类时的大量 if…else 代码。第二种代码重复是,使用硬编码的方式重复实现相同的数据处理算法。原创 2024-06-23 21:07:50 · 136 阅读 · 0 评论 -
Redis 如何实现库存扣减操作和防止被超卖?
电商当项目经验已经非常普遍了,不管你是包装的还是真实的,起码要能讲清楚电商中常见的问题,比如库存的操作怎么防止商品被超卖基于redis实现扣减库存的具体实现在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。在上面的第一种和第二种方式都是基于数据来扣减库存。原创 2024-06-23 21:04:49 · 192 阅读 · 0 评论 -
彻底弄懂SQL的执行顺序
分组结束之后,我们再执行select语句,因为聚合函数是依赖于分组的,聚合函数会单独新增一个查询出来的字段,这里用紫色表示,这里我们两个id重复了,我们就保留一个id,重复字段名需要指向来自哪张表,否则会出现唯一性问题。当我们编写一个SQL查询时,尽管查询语句的书写顺序与实际的执行顺序不同,但了解其执行顺序有助于更好地理解查询是如何工作的,以及如何优化查询。然后把再根据我们要的数据进行select,可以是普通字段查询也可以是获取聚合函数的查询结果,如果是集合函数,select的查询结果会新增一条字段。原创 2024-01-01 20:15:22 · 1031 阅读 · 0 评论 -
算法与数据结构面试宝典——二叉树遍历
从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。原创 2023-09-24 10:30:59 · 171 阅读 · 1 评论 -
算法与数据结构面试宝典——二叉搜索树
如下图所示,「二叉搜索树 binary search tree」满足以下条件。1.原创 2023-09-24 09:52:14 · 77 阅读 · 0 评论 -
算法与数据结构面试宝典——二叉树
二叉树 binary tree」是一种非线性数据结构,代表着祖先与后代之间的派生关系,体现着“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含:值、左子节点引用、右子节点引用。原创 2023-09-24 09:46:30 · 85 阅读 · 0 评论 -
算法与数据结构面试宝典——栈详解
栈 stack」是一种遵循先入后出的逻辑的线性数据结构。我们可以将栈类比为桌面上的一摞盘子,如果需要拿出底部的盘子,则需要先将上面的盘子依次取出。我们将盘子替换为各种类型的元素(如整数、字符、对象等),就得到了栈数据结构。如下图所示,我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫做“入栈”,删除栈顶元素的操作叫做“出栈”。原创 2023-09-24 09:41:06 · 79 阅读 · 0 评论