面试精选
文章平均质量分 89
Young丶
这个作者很懒,什么都没留下…
展开
-
5道面试题,拿捏String底层原理
第1题,奇怪的 nullnull下面这段代码最终会打印什么?public class Test1 { private static String s1; private static String s2; public static void main(String[] args) { String s= s1+s2; System.out.println(s); }}JAVA 复制 全屏揭晓答案,看一下运行结果,打印了nulln原创 2022-03-18 17:31:02 · 1764 阅读 · 0 评论 -
那些年背过的面试题——Spring篇
IoC(Inverse of Control: 控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由 Spring 框架来管理。IoC 在其他语⾔中也有应用,并非Spring 特有。IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注⼊。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。原创 2024-09-02 23:14:59 · 1036 阅读 · 0 评论 -
那些年背过的面试题——Netty篇
Core 核心层Core 核心层是 Netty 最精华的内容,它提供了底层网络通信的通用抽象和实现,包括事件模型、通用API、支持零拷贝的 ByteBuf 等。Protocol Support 协议支持层协议支持层基本上覆盖了主流协议的编解码实现,如 HTTP、Protobuf、WebSocket、二进制等主流协议,此外 Netty 还支持自定义应用层协议。Netty 丰富的协议支持降低了用户的开发成本,基于 Netty 我们可以快速开发 HTTP、WebSocket 等服务。Transport Ser原创 2024-07-08 22:41:58 · 782 阅读 · 0 评论 -
那些年背过的面试题——JVM篇
本文是技术人面试系列 JVM 篇,面试中关于 JVM 都需要了解哪些基础?原创 2024-07-08 22:41:25 · 1132 阅读 · 0 评论 -
那些年背过的面试题——MySQL篇
性能上,使用 cql 查询,对长程关系的查询速度快擅于发现隐藏的关系,例如通过判断图上两点之间有没有走的通的路径,就可以发现事物间的关联。原创 2024-07-07 22:13:38 · 1091 阅读 · 0 评论 -
那些年背过的面试题——Redis篇
速度快,完全基于内存,使用 C 语言实现,网络层使用 epoll 解决高并发问题,单线程模型避免了不必要的上下文切换及竞争条件;与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。原创 2024-07-07 22:13:25 · 874 阅读 · 0 评论 -
面试官:Java 内部类持有外部类为什么会导致内存泄露?
若内部类持有外部类的引用,对内部类的使用很多时,会导致外部类数目很多。此时,就算是外部类的数据没有被用到,外部类的数据所占空间也不会被释放。本处在外部类存放大量的数据来模拟。内部类改为静态的之后,它所引用的对象或属性也必须是静态的,所以静态内部类无法获得外部对象的引用,只能从 JVM 的 Method Area(方法区)获取到 static 类型的引用。原创 2024-05-22 19:55:48 · 808 阅读 · 0 评论 -
servlet生命周期
Servlet 容器加载 Servlet,加载完成后,Servlet 容器会创建一个 Servlet 实例并调用 init() 方法,init() 方法只会调用一次。客户发送一个请求,Servlet 调用 service() 方法对请求进行响应,service() 方法会对请求的方法进行匹配,进入相应的逻辑层,完成请求的响应。3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。Servlet 类文件被更新后,重新装载。原创 2024-04-25 09:02:12 · 397 阅读 · 0 评论 -
得物面试:Redis 内存碎片是什么?如何清理?
你可以将内存碎片简单地理解为那些不可用的空闲内存。举个例子:操作系统为你分配了 32 字节的连续内存空间,而你存储数据实际只需要使用 24 字节内存空间,那这多余出来的 8 字节内存空间如果后续没办法再被分配存储其他数据的话,就可以被称为内存碎片。Redis 内存碎片虽然不会影响 Redis 性能,但是会增加内存消耗。原创 2024-04-25 09:01:52 · 1195 阅读 · 0 评论 -
工作中常用的5种加密算法
综上,实际使用中,常常根据自身系统特征选择。比如:执行效率、数据量、安全合规要求等,这里给出上述简易版整理。加密算法名称有效长度特性是否加密解密优点缺点MD5MD5 散列算法128 位散列函数不可逆速度快,简单安全性低,易受碰撞攻击AESAES 加密算法128/192/256 位对称加密是安全性高,效率高无严重弱点DESDES 加密算法56 位对称加密是速度快,曾广泛使用密钥短,安全性低国密 SM4SM4 加密算法128 位对称加密是。原创 2024-04-24 16:35:55 · 1037 阅读 · 0 评论 -
Mybatis 调优从50s优化到0.3s
稍微总结下我粗略的对比(虽然粗略,但实验结果符合原理层面的理解),如果你想更准确地实验,可以使用 JMH,并且测试更多组数(如 5000,10000 等)的情况。批量保存方式数据量(条)耗时(ms)单条循环插入1000121011100059927mybatis-plus saveBatch(添加 rewtire 参数)10002589手动拼接 sql10002275100055663jdbc executeBatch(添加 rewtire 参数)1000324。原创 2024-04-22 09:02:35 · 1282 阅读 · 0 评论 -
支付宝面试太太太刁钻了!!如果把线程池 corePoolSize 设置为 0,会出现什么情况?
而 JDK 6+ 是直接创建一个非核心线程,再放在队列中来执行,很显示,JDK 6 这个优化动作减小了内存溢出的可能性。光说 JDK 6 和 JDK 8 这两个版本,对线程池的重构就很大,现在主流的版本都是 JDK 8+,这个了解一下就好。从源码可以看到,如果往线程池提交任务的时候,当 corePoolSize = 0 时,代码正常情况下会执行到。此时,如果线程池处于运行状态,并且任务能够成功加入队列,说明线程池不为空,线程正常执行任务。,如果添加失败,说明线程池已关闭或达到饱和状态,因此拒绝任务。原创 2024-04-19 09:31:37 · 246 阅读 · 0 评论 -
Java线程池中线程异常后:是销毁还是复用?
还记得,我们在 3.1 的时候,发现 submit 也是调用了 execute 方法,但是在调用之前, 包装了一层 RunnableFuture,那一定是在 RunnableFuture 的实现 FutureTask 中有特殊处理了,我们查看源码可以发现。但是,我们通过 java.util.concurrent.FutureTask#get(),就可以获取对应的异常信息。当执行方式是 execute 时, 可以看到堆栈异常的输出,线程池会把这个线程移除掉,并创建一个新的线程放到线程池中。原创 2024-04-18 08:55:47 · 305 阅读 · 0 评论 -
保证接口安全的11个小技巧
如何保证接口的安全性?根据我多年的工作经验,这篇文章从 11 个方面给大家介绍一下保证接口安全的一些小技巧,希望对你会有所帮助。原创 2024-04-17 08:52:33 · 1240 阅读 · 0 评论 -
面试官:你负责项目的时候遇到了哪些比较棘手的问题?怎么解决的
为了解决接口幂等性的问题,我们采取了以下步骤:首先,我们重新梳理了现有的接口调用流程,明确了哪些接口需要保证幂等性。为了解决 CPU 使用率过高的问题,我们采取了一系列调优措施:首先,我们对存在性能瓶颈的模块进行了代码审查,寻找可能的优化点。在我负责的一个电商项目中,随着业务的发展和用户量的增长,数据库查询性能逐渐下降,特别是在高峰期,部分关键业务功能的响应时间明显延长,严重影响了用户体验。同时,我们也建立了一套完善的性能监控和预警机制,能够及时发现并解决潜在的性能问题,确保系统的稳定运行。原创 2024-04-16 08:57:21 · 4484 阅读 · 1 评论 -
RocketMQ为什么这么快?
在传统 IO 中,如果想将用户缓存区的数据放到内核缓冲区,需要经过 CPU 拷贝而基于零拷贝技术可以减少 CPU 拷贝次数,常见的有两种:mmap()sendfile()mmap() 是将用户缓冲区和内核缓冲区共享,操作用户缓冲区就好像直接操作内核缓冲区,读写数据时不需要 CPU 拷贝Java 中可以使用 MappedByteBuffer 这个 API 来达到操作内核缓冲区的效果。原创 2024-04-16 08:56:26 · 1051 阅读 · 0 评论 -
Java算法之时间复杂度和空间复杂度的概念和计算
在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。因为现在的内存不像以前那么贵,所以经常听到过牺牲空间来换取时间的说法。原创 2024-04-15 14:12:45 · 963 阅读 · 0 评论 -
excel百万数据如何导入导出
附上GitHub地址:https://github.com/alibaba/easyexcelGitHub地址上教程和说明很详细,并且附带有读和写的demo代码,这里对它的介绍我就不再详细说了。至于EasyExcel底层怎么实现的这个还有待研究。这次工作中遇到的问题也给我留下了深刻印象,同时也是我职业生涯添彩的一笔。最起码简历上可以写上你处理过上百万条数据的导入导出。最后说一下公司之前怎么做的,公司之前做法是。原创 2022-10-09 10:28:38 · 29488 阅读 · 0 评论 -
进程间通信的7种方式
最简单的方式就是,管道分为「匿名管道」和「命名管道」。原创 2024-03-29 13:36:06 · 405 阅读 · 0 评论 -
线程间有哪些通信方式?
关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。可以通过Java内置的等待/通知机制(wait()/notify())实现一个线程修改一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。原创 2024-03-29 13:35:38 · 267 阅读 · 0 评论 -
手写LRU
方法当链表大小超过容量时返回 true,使得每次访问一个元素时,该元素会被移动到链表的末尾。(boolean 类型,默认为 false),访问顺序则为 true,插入顺序则为 false。sed,最近最少使用) 缓存,确保当存放的元素超过容器容量时,将最近最少访问的元素移除。就会将链表首元素移除,由此我们就能实现一个 LRU 缓存。返回 true 时,视为缓存已满,我们可以封装一个简易版的 LRU(设置为 true 并重写。原创 2024-03-28 14:07:22 · 300 阅读 · 0 评论 -
零拷贝知识点,性能优化必争之地!
在进行数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与,可以去干别的事情。早期 I/O 操作,内存与磁盘的数据传输的工作都是由 CPU 完成的,而此时 CPU 不能执行其他任务,会特别浪费 CPU 资源。于是,为了解决这一问题,DMA 技术就出现了,实际数据传输工作由 DMA 控制器来完成,CPU 不需要参与数据传输的工作。零拷贝。原创 2024-02-20 09:26:51 · 12444 阅读 · 0 评论 -
Nacos底层原理一次给你讲个够
1.x 版本是通过 Http 协议来进行服务注册的2.x 由于客户端与服务端的通信改成了 gRPC 长连接,所以改成通过 gRPC 长连接来注册2.x 比 1.x 多个 Redo 操作,当注册的服务实例是临时实例是,出现网络异常,连接重新建立之后,客户端需要将服务注册、服务订阅之类的操作进行重做这里你可能会有个疑问既然 2.x 有 Redo 机制保证客户端与服务端通信正常之后重新注册,那么 1.x 有类似的这种 Redo 机制么?当然也会有,接下往下看。心跳机制仅仅针对临时实例而言。原创 2024-02-19 15:49:23 · 13692 阅读 · 1 评论 -
程序员跳槽,HR 就喜欢听这样的离职原因。让老实人别再吃亏!四个万金油回答
面试干货,HR 就喜欢听这样的离职原因。让老实人别再吃亏!分享如何回答: 你为什么离开上一家公司?原创 2024-01-24 11:00:08 · 780 阅读 · 1 评论 -
深分页问题,mysql查询 limit 1000,10 和limit 10 一样快吗?
比limit size要慢,且offset的值越大,sql的执行速度越慢。当offset过大,会引发深度分页问题,目前不管是mysql还是es都没有很好的方法去解决这个问题。只能通过限制查询数量或分批获取的方式进行规避。遇到深度分页的问题,多思考其原始需求,大部分时候是不应该出现深度分页的场景的,必要时多去影响产品经理。如果数据量很少,比如1k的量级,且长期不太可能有巨大的增长,还是用的方案吧,整挺好,能用就行。...原创 2022-08-15 13:58:53 · 32527 阅读 · 1 评论 -
时代变迁,你背的“八股文”可能已经过时了
Java 中的接口的目的是定义公开的 API,而不是实现方法细节,所以在 JDK8 以前都不支持默认和静态方法。但是出于便捷性的考虑,JDK8 中支持方法的默认实现,这样当一个接口有大量实现类的情况下,可以在不破坏原有实现的前提下迭代 API。JDK8 中接口类的默认实现解决了模型抽象中的很多问题,随之而来的是在接口中的默认方法如果需要共享一些代码段,只能将这些代码段抽象出一个新的函数。如果这个函数是静态的(JDK8 支持接口中定义静态函数),那么在函数里无法访问其他非静态 API;原创 2023-11-13 09:40:17 · 2271 阅读 · 0 评论 -
一个进程最多可以创建多少个线程?
最后简单总结下:32 位系统,用户态的虚拟空间只有 3G,默认创建线程时分配的栈空间是 8M,那么一个进程最多只能创建 380 个左右的线程。64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。原创 2023-11-13 09:40:45 · 145 阅读 · 0 评论 -
阿里终面:10亿数据如何快速插入MySQL?
要首先确认约束条件,才能设计方案。确定面试官主要想问的方向,例如 1T 文件如何切割为小文件,虽是难点,然而可能不是面试官想考察的问题。从数据规模看,需要分库分表,大致确定分表的规模。从单库的写入瓶颈分析,判断需要进行分库。考虑到磁盘对并发写的支持力度不同,同一个库多个表写入的并发需要限制。并且支持动态调整,方便在线上环境调试出最优值。存储引擎对写入性能支持不同,也要在线上对比验证数据库批量插入的最佳阈值需要反复测试得出。由于存在并发度限制,所以基于 Kafka 分离读取任务和写入任务比较困难。原创 2023-12-29 15:10:58 · 13255 阅读 · 0 评论 -
美团面试:为什么MySQL不建议使用NULL作为列默认值?
NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束。有些开发人员在创建数据表时,由于懒惰直接使用 Mysql 的默认推荐设置。(即允许字段使用NULL值)。而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。NULL并不意味着什么都没有,我们要注意NULL跟''(空值)是两个完全不一样的值。MySQL 中可以操作NULL值操作符主要有三个。IS NULL原创 2023-08-16 06:00:00 · 21992 阅读 · 0 评论 -
Spring源码面试最难问题——循环依赖
问:Spring 如何解决循环依赖?答:Spring 通过提前曝光机制,利用三级缓存解决循环依赖(这原理还是挺简单的,参考:三级缓存、图解循环依赖原理)再问:Spring 通过提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?再细问:如果循环依赖的时候,所有类又都需要 Spring AOP 自动代理,那 Spring 如何提前曝光?曝光的是原始 bean 还是代理后的 bean?原创 2023-03-27 08:00:00 · 66810 阅读 · 1 评论 -
万字总结什么是JMM、内存屏障及其原理
1 线程之间的共享变量存储在主内存中(从硬件角度来说就是内存条)2 每个线程都有一个私有的本地工作内存,本地工作内存中存储了该线程用来读/写共享变量的副本(从硬件角度来说就是CPU的缓存,比如寄存器、L1、L2、L3缓存等)3 线程对变量的所有操作都必须在本地内存中进行,而不能直接读写主内存。4 不同的线程之间无法直接访问对方本地内存中的变量。我们定义的所有共享变量都储存在物理主内存中每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)原创 2023-02-08 08:40:40 · 57858 阅读 · 0 评论 -
MySQL语句中过滤条件放在哪?on、where还是having,他们区别和联系
SQL语句中,过滤条件放在不同筛选器on、where和having的区别和联系。蚂蚁金服的一道如下:**SQL语句中,过滤条件放在on和where子句中的区别是什么?**当时满脑子是left join和inner join等,觉得没区别啊!当天晚上细思极恐,故梳理一下。在多表连接查询语法中,最令人迷惑的非on和where这两个筛选器的区别莫属了。在编写查询SQL脚本的时候,筛选条件无论是放在on子句还是where子句,查询到的结果集总是一模一样的,既然如此,为什么还要让sql查询支持两种筛选器呢?原创 2023-01-11 16:00:14 · 61864 阅读 · 4 评论 -
难倒90%英雄的阿里对象继承面试题 ,看看你答的对吗?
难道90%的 阿里 对象继承面试题,看看你打的对吗?思考下面的输出结果思考片刻解析所以先会调用父类无参构造方法应为 重新了 方法,所以 使用的是 的 。根据类的加载机制 在 初始化阶段 ,而 还没到, 的 x的值还是默认 0所以答应的从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的get方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制原创 2022-12-08 09:00:00 · 38617 阅读 · 2 评论 -
为什么 Java 不把基本类型放在堆中?我居然答不上来。。
我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个 4 btye 的引用(堆栈分离的好处)。原创 2022-11-17 02:30:00 · 24639 阅读 · 0 评论 -
京东二面:ElasticSearch如何解决深分页问题?
分页方式性能优点缺点场景低灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题scroll中解决了深度分页问题无法反应数据的实时性(快照版本)维护成本高,需要维护一个 scroll_id海量数据的导出需要查询海量结果集的数据高性能最好不存在深度分页问题能够反映数据的实时变更实现复杂,需要有一个全局唯一的字段连续分页的实现会比较复杂,因为每一次查询都需要上次查询的结果,它不适用于大幅度跳页查询海量数据的分页。原创 2022-11-06 01:45:00 · 16286 阅读 · 0 评论 -
手撸架构,Nginx 面试40问
只需将请求删除的服务器就可以定义为:服务器名被保留一个空字符串,他在没有主机头字段的情况下匹配请求,而一个特殊的 nginx 的非标准代码被返回,从而终止连接。怎么限制浏览器访问?## 不允许谷歌浏览器访问 如果是谷歌浏览器返回500}Rewrite 全局变量是什么?$remote_addr //获取客户端ip$binary_remote_addr //客户端ip(二进制)$remote_port //客户端port,如:50472。转载 2022-11-05 06:00:00 · 16388 阅读 · 0 评论 -
面试官:问你期望的工资是多少,怎么回答最好?
在面试过程中,我们做的准备与实际遇到的问题总会有一些出入。记得大致的原则,巧妙的随机应变。懂得自己在市场中的定位,将对薪资的确定更为有利。好了 说到这里,也希望大家都找到合适的工作,满意的薪资哦!原创 2022-10-31 10:20:02 · 31039 阅读 · 1 评论 -
阿里云二面:引用和指针有什么区别?
引用只是c++语法糖,可以看作编译器自动完成取地址、解引用的常量指针引用区别于指针的特性都是编译器约束完成的,一旦编译成汇编就和指针一样delete a;b = 12;// 对已经释放的内存解引用引用由编译器保证初始化,使用起来较为方便(如不用检查空指针等)尽量用引用代替指针引用没有顶层 const (引用本身不可变) 即,因为引用本身就不可变,所以在加顶层 const 也没有意义;但是可以有底层 const ()即const int&,这表示引用所引用的对象本身是常量。原创 2022-10-30 20:17:39 · 22995 阅读 · 0 评论 -
烂大街的TCP/IP网络模型,你真的懂了?
你能聊聊TCP/IP 的四层网络模型和 OSI 七层网络模型吗?为啥要问这个?坦白讲,一些大的公司,计算机基础必面,尤其是针对薪资30k以内的工程师,因为薪资30k以内,你还是要干活儿的吧,还没上升到就设计架构就可以的程度吧,你还没到那个高度吧。所以只要你干活儿,你就不可避免要跟机器、网络、cpu、磁盘、内存,成天打交道。而线上系统,计算基础的一些东西,网络、cpu、磁盘、内存,都是关联很大的,比如说你线上系统会不会因为网络故障导致一些问题?cpu负载达到100%了咋办?磁盘读写很慢快满了咋办?原创 2022-10-27 08:52:24 · 22892 阅读 · 0 评论 -
面试官让我设计一个基于分布式锁的库存超卖方案,并发量很高的那种
你想,假如你现在iphone有1000个库存,那么你完全可以给拆成20个库存段,要是你愿意,可以在数据库的表里建20个库存字段,比如stock_01,stock_02,类似这样的,也可以在redis之类的地方放20个库存key。比如悲观锁,分布式锁,乐观锁,队列串行化,异步队列分散,Redis原子操作,等等,很多方案,我们对库存超卖有自己的一整套优化机制。释放锁之后,另外一个订单系统实例才能加锁,接着查库存,一下发现库存只有2台了,库存不足,无法购买,下单失败。接着,每秒1000个请求过来了,好!原创 2022-10-24 13:38:30 · 21303 阅读 · 0 评论