面试总结
文章平均质量分 78
何以解忧,唯有..
这个作者很懒,什么都没留下…
展开
-
总结 拦截器(Interceptor) 和 过滤器(Filter)的区别
拦截器(Interceptor) 和 过滤器(Filter)的区别是面试中常问的问题,也是开发中容易被大家混淆的问题,在此总结下,希望对大家有所帮助。2.1、概念Servlet规范中三个技术 Servlet、Listener、Filter(顺序为L F S)。Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器。2.2、作用通过Filter可以拦截访问web资源的请求与响应操作.。原创 2022-10-26 17:55:26 · 1284 阅读 · 0 评论 -
Http和 Https 的关联与区别
6、如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。3、客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的 “发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。.原创 2022-08-18 23:09:18 · 412 阅读 · 0 评论 -
Ngram全文检索,模糊查询解决方案
在我们日常开发中,很多时候会遇到对数据库中某个字段模糊查询的需求,也就是like某个字段,但是很多公司像阿里,京东都禁止使用like来对数据库进行模糊查询,原因是啥呢?下面三条语句,其中title添加了索引。...原创 2022-08-13 05:11:29 · 415 阅读 · 0 评论 -
简单了解单例模式
单例模式是指在内存中有且只会创建一次对象的设计模式,在程序中多次使用同一个对象且作用相同的时候,为了防止频繁的创建对象,单例模式可以让程序在内存中创建一个对象,让所有的调用者都共享这一单例对象。单例模式的类型有两种懒汉式和饿汉式。...原创 2022-07-28 22:45:05 · 559 阅读 · 0 评论 -
了解 AQS 底层原理
AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7)等等皆是基于AQS的。..................原创 2022-07-28 22:29:51 · 801 阅读 · 0 评论 -
Java基础面试高频问题总结(二)
java面试题原创 2022-07-27 22:21:39 · 574 阅读 · 0 评论 -
分布式相关面试题总结
一致性(C一致性是指数据在多个副本之间能否保持一致的特性。例如一个数据在某个分区节点更新之后,在其他分区节点读出来的数据也是更新之后的数据;可用性(A可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。这里的重点是"有限时间内"和"返回结果";分区容错性(P分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务。分布式环境下(数据分布)要任何时刻保证数据一致性是不可能的,只能采取妥协的方案来保证数据最终一致性。......原创 2022-07-25 22:45:58 · 1185 阅读 · 0 评论 -
Java JVM 相关面试题目总结
并行垃圾收集,是指使用多个GCworker线程并行的执行垃圾收集,能充分利用多核CPU的能力,缩短垃圾收集的暂停时间。除了单线程的GC,其他的垃圾收集器,比如PS、CMS、G1等新的垃圾收集器都使用了多线程来并行执行GC工作。因为GC过程中,所有应用线程需要暂停之后才能执行GC,这个时候称为STW,或者叫做GC暂停。安全点安全区域通过带有优先级的层次关系可以避免类的重复加载。保证Java程序安全稳定运行,Java核心API定义类型不会被随意替换。https。......原创 2022-07-23 15:43:03 · 283 阅读 · 0 评论 -
如何保证Kafka顺序消费
在Kafka中Partition(分区)是真正保存消息的地方,发送的消息都存放在这里。Partition(分区)又存在于Topic(主题)中,并且一个Topic(主题)可以指定多个Partition(分区)。在Kafka中,只保证Partition(分区)内有序,不保证Topic所有分区都是有序的。所以Kafka要保证消息的消费顺序,可以有2种方法。...原创 2022-07-17 21:00:01 · 3611 阅读 · 0 评论 -
kafka 的 ack机制
acks=0,生产者在成功写入消息之前不会等待任何来自服务器的响应.acks=1,只要集群的leader分区副本接收到了消息,就会向生产者发送一个成功响应的ack.acks=all,表示只有所有参与复制的节点(ISR列表的副本)全部收到消息时,生产者才会接收到来自服务器的响应,此时如果ISR同步副本的个数小于min.insync.replicas的值,消息不会被写入.httpshttpshttpshttpshttpshttps。...原创 2022-07-17 16:42:05 · 3552 阅读 · 0 评论 -
Redis 与 Mysql 的数据一致性
先删除缓存,再更新数据库,然后休眠1s(根据具体的业务合理设置,比如几百毫秒),再删除缓存,有可能第二次删除失败,还是会导致数据不一致缺点:存在延时操作,所以会造成服务器的阻塞, 所以不适合高并发的场景如果需要再极端情况下人仍然保证Redis和MySQL的数据一致性,就只能采用最终一致性的方案,比如基于RabbitMQ的可靠性消息通信来实现数据的最终一致性,还可以通过Canal组件监控MySQL里面的Binary log日志,把更新后的数据同步到Redis里面。2.1、利用MQ异步重试机制,保证最终一致性,原创 2022-07-17 15:56:02 · 4178 阅读 · 0 评论 -
深入理解事务隔离级别
事务隔离级别原创 2022-07-16 11:53:50 · 221 阅读 · 0 评论 -
MVCC多版本并发控制
什么是ReadView,说白了ReadView就是事务进行快照读操作的时候生产的读视图(ReadView),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID,这个ID是递增的,所以最新的事务,ID值越大)DB_ROW_ID是数据库默认为该行记录生成的唯一隐式主键,DB_TRX_ID是当前操作该记录的事务ID,而DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本。...原创 2022-07-16 10:55:12 · 178 阅读 · 0 评论 -
Redis 是单线程,为什么那么快
1、完全基于内存。绝大部分请求是纯粹的内存操作,非常快速。类似于Hash Map,Hash Map 的优势就是查找和操作的时间复杂度都是 O(1)。2、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用考虑各种锁的问题,不存在加锁、释放锁的操作,没有因为可能出现死锁而导致的性能消耗。3、采用多路 I/O 复用(epoll)模型,非阻塞IO同步阻塞模型:同步非阻塞模型:IO多路复用模型:4、数据结构设计思路就是空间换时间,比如跳表例如在链表中查找数原创 2022-07-10 10:16:54 · 710 阅读 · 0 评论 -
总结 Kafka 高吞吐量的原理
Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。但是很多使用过Kafka的人,经常会被问到这样一个问题,Kafka为什么速度快,吞吐量大;大部分被问的人都是一下子就懵了,或者是只知道一些简单的点,本文就简单的介绍一下Kafka为什么吞吐量大,速度快。kafka 和 RockMQ使用的场景是完全不同的,kafka 适合使用在高吞吐原创 2022-07-09 11:27:31 · 1125 阅读 · 0 评论 -
普通hash和一致性hash
hash查找:相对于顺序查找和二分查找,查找速度快。对数据求模,根据余数确定存储下标,可能导致hash冲突,有两种方式解决:每个下标存放一个数组或者一个链表,hash查找的效率直接决定于hash算法普通hash算法(线性结构)存在的问题在服务器扩容、缩容时,导致服务器原来的客户端请求需要重新hash计算普通hash算法的问题可以由一致性hash算法解决一致性hash算法(环形结构):服务器扩容/缩容后,只影响一部分请求,重新计算服务器节点hash值(客户端和服务器ip经过hash计算后都会落在一个hash环原创 2022-07-09 09:59:18 · 350 阅读 · 0 评论 -
FullGC问题分析及解决办法总结
1.1、频繁的大对象,大对象直接被分配到老年代。1.2、系统高负载运行,请求量很大,jvm来不及将对象转移到老年代,直接到老年代分配对象。1.3、系统内存泄漏,导致对象长时间在老年代,得不到释放。2.1、System.gc()方法的调用在代码中调用System.gc()方法会建议JVM进行Full GC,但是注意这只是建议,JVM执行不执行是另外一回事儿,不过在大多数情况下会增加Full GC的次数,导致系统性能下降,一般建议不要手动进行此方法的调用,可以通过-XX:+ DisableExplicitGC来原创 2022-06-19 22:55:06 · 5884 阅读 · 0 评论 -
OOM(内存溢出)造成原因及解决方案
内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。2.1、内存泄漏由于长期保持某些资源的引用,垃圾回收器无法回收它,从而使该资源不能够及时释放,也称为内存泄露。因而尽量不要将所有引用都使用为强引用,可以在合适的地方使用弱引用和软引用。2.2、超大对象保存多个耗用内存过大或当加载单个超大的对象时,该对象的大小超过了当前剩余的可用内存空间。比如查询数据库中的数据,一次查询过多,直接导致内存溢出了。因此查询数据库如原创 2022-06-19 09:10:32 · 33784 阅读 · 0 评论 -
ThreadLocal简单介绍(面试常温知识点)
一、实现原理首先 ThreadLocal 是一个泛型类,保证可以接受任何类型的对象。因为一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。而我们使用的 get()、set() 方法其实都是调用了这个 ThreadLocalMap 类对应的 get()、set() 方法。例如下面的 set 方法:pub原创 2022-04-17 22:29:11 · 945 阅读 · 0 评论 -
Spring面试Ioc和Aop问题总结
一、什么是Ioc?Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。1.1、...原创 2022-04-17 09:54:13 · 1853 阅读 · 0 评论 -
Redis五种数据类型和使用场景归纳
前言Redis在我们日常工作中使用的非常频繁,但是也有人只会使用string类型,那么今天笔者梳理下redis中常用的5种数据类型,分别适用于哪些业务场景和基本操作,让大家以后能够在合适的缓存场景使用合适的数据类型。一、String字符串类型Redis支持的字符串类型不是定长分配的字符串,是动态变长字符串,修改字符串在没有增加特别多内容的情况下不需要重新分配内存空间,内部结构实现上有点类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。常用使用场景1、缓存结构体信息原创 2021-11-10 21:48:26 · 4462 阅读 · 0 评论 -
深入理解CAS原理(即自旋锁),面试常问问题之一
一、什么是CASCAS,compare and swap的缩写,中文翻译成比较并交换。我们都知道,在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语,从而在硬件层面提升效率。在intel的CPU中,使用cmpxchg指令。在Java发展初期,java语言是不能够利用硬件提供的这些便利来提升系统的性能的。而随着java不断的发展,Java本地方法(JNI)的出现,使得java程序越过JVM直接调用本地方法提供了一种便捷的方式,因而原创 2021-11-07 17:23:02 · 406 阅读 · 0 评论 -
Mysql分库分表,面试常问问题之一
前言在互联网项目中比较常用到的关系型数据库是MySQL,随着用户和业务的增长,传统的单库单表模式难以满足大量的业务数据存储以及查询,单库单表中大量的数据会使写入、查询效率非常之慢,此时应该采取分库分表策略来解决。分库分表方案分库分表方案中有常用的方案,hash取模和range范围方案;分库分表方案最主要就是路由算法,把路由的key按照指定的算法进行路由存放。下边来介绍一下两个方案的特点。一、hash取模方案在我们设计系统之前,可以先预估一下大概这几年的订单量,如:4000万。每张表我们可以容纳1原创 2021-10-30 22:41:02 · 438 阅读 · 0 评论 -
Synchronized实现原理,以及锁升级的过程
一、Synchronized实现原理1.1、对象在内存中的存储布局对象是存放在堆内存中的,对象大致可以分成3个部分,分别是对象头、实例变量和填充字节。对象头:主要由MarkWord 和 Class Pointer(类型指针) 组成,其中Class Pointer是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例,Mark Word用于存储对象自身的运行时数据。实例变量:存储的是对象的属性信息,包括父类的属性信息,按照4字节对齐。填充字符:因为虚拟机要求对象字节必须是8字原创 2021-10-23 14:45:26 · 455 阅读 · 0 评论 -
ConcurrentHashMap源码和面试题
前言话不多说,直接总结,乐于分享,懂得都懂!问题列表1、CurrentHashMap的实现原理?ConcurrentHashMap的出现主要为了解决hashmap在并发环境下不安全,JDK1.8ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,CAS等乐观锁技术来减少锁竞争对于性能的影响,ConcurrentHashMap保证线程安全的方案是:JDK1.8:synchronized+CAS+HashEntry+红黑树;JDK1.7:ReentrantLock原创 2021-10-10 23:27:04 · 344 阅读 · 0 评论 -
SpringCloud面试高频问题总结
前言话不多说,直接总结,乐于分享,懂得都懂!问题列表1、Spring Cloud和Dubbo的区别?Dubbo关注的领域是Spring Cloud的一个子集。Dubbo专注于服务治理,其在服务治理、灰度发布、流量分发方面比Spring Cloud更全面。Spring Cloud覆盖整个微服务架构领域。Dubbo使用RPC调用效率高一些,Spring Cloud使用HTTP调用效率低,使用更简单。2、SpringCloud如何实现服务的注册和发现?1、服务在发布时 指定对应的服务名(服务名包原创 2021-10-07 22:51:24 · 515 阅读 · 0 评论 -
SpringBoot面试高频问题总结
前言话不多说,直接总结,乐于分享,懂得都懂!问题列表1、SpringBoot自动装配的原理?springboot启动时,是依靠启动类的main方法来进行启动的,而main方法中执行的是SpringApplication.run()方法,而SpringApplication.run()方法中会创建spring的容器,并且刷新容器。而在刷新容器的时候就会去解析启动类,然后就会去解析启动类上的@SpringBootApplication注解,而这个注解是个复合注解,这个注解中有一个@EnableAuto原创 2021-10-07 22:42:49 · 271 阅读 · 0 评论 -
Redis面试常问问题总结
1、Redis 线程模型,单线程为什么快?单线程快的原因:1、纯内存操作2、核心是基于非阻塞的IO多路复用机制3、单线程反而避免了多线程的频繁上下文切换带来的性能问题2、Redis 集群方案?哨兵模式Redis Cluster 模式Redis Sharding 模式.........原创 2021-10-07 15:22:11 · 203 阅读 · 0 评论 -
Java 垃圾回收机制(面试高频问题之一)
一、如何判断某个对象是否是垃圾1.1、引用计数法在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。缺点: 这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题,因此在Java中并没有采用这种方式(Python采用的是引用计数法)。public class原创 2021-10-05 10:44:06 · 862 阅读 · 0 评论 -
Java基础面试高频问题总结(持续更新)
前言话不多说,直接总结,乐于分享,懂得都懂!问题列表1、String、StringBuilder、StringBuffer 的区别?从运行速度考虑:StringBuilder > StringBuffer > String解析:String是字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后对象是不可变的,但后两者的对象是变量,是可变的。另外,Java中对String对象进行的操作,实际上是一个不断创建新对象和回收旧对象的原创 2021-10-05 09:02:57 · 373 阅读 · 0 评论 -
实现分布式锁的方式及优缺点
一、分布式锁的三种实现方式目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可原创 2021-10-03 17:10:52 · 2192 阅读 · 0 评论 -
Redisson实现Redis分布式锁的底层原理
一、原理图二、加锁机制咱们来看上面那张图,现在某个线程要加锁。如果该线程面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器。紧接着,就会发送一段lua脚本到redis上,那段lua脚本如下所示:为啥要用lua脚本呢?因为一大坨复杂的业务逻辑,可以通过封装在lua脚本中发送给redis,保证这段复杂业务逻辑执行的原子性。这段lua脚本是什么意思呢?KEYS[1]: 代表的是你加锁的那个key。RLock lock = redisson.getLock(“myL原创 2021-10-03 16:01:49 · 2700 阅读 · 1 评论 -
Redis面试常见问题之数据过期策略
一、设置过期时间Redis对存储值的过期处理实际上是针对该值的键(key)处理的,即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间,Expires也被称为过期字段。expire key time(以秒为单位)–这是最常用的方式setex(String key, int seconds, String value)–字符串独有的方式注意:1、除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间2、如果没有设置时间,那缓存就是永不过期3原创 2021-10-03 14:50:16 · 324 阅读 · 0 评论 -
Mysql面试常见问题总结?
1、ACID靠什么保证的?2、Redis和Mysql如何保证数据一致?3、Mysql聚族和非聚族索引的区别?4、Mysql索引的数据结构,各自优劣?5、Mysql中锁的类型有哪些?6、事务的基本特性和隔离级别?7、针对sql慢查询的优化?8、简述MyISAM和InnoDB的区别?8.1、InnoDB支持事务,MyISAM不支持事务8.2、InnoDB支持表、行级锁,而MyISAM支持表级锁。8.3、select count(*) from table时,MyISA原创 2021-09-27 23:52:49 · 145 阅读 · 0 评论 -
消息队列面试常问问题总结
1、如何保证消息不被重复消费?消费者保证幂等性:一个数据或者一个请求,确保对应的数据是不会改变的,不能出错。生产者发送消息的时候带一个全局唯一的id,消费者拿到消息后,先根据这个id去redis查一下,之前是否被消费过,没有消费过就处理,并且将这个id写入到redis,如果消费过则不处理。2、生产者发送的消息,消费者一定要消费到?生产者发送消息时,要确认broker确实收到并持久化这条消息,比如Rabbitmq的confirm机制。broker要等待消费者真正消费到了消息时才删除消息,这里通常就是原创 2021-09-25 23:04:36 · 328 阅读 · 0 评论 -
Synchronized 和 Lock
一、原始构成方面synchronized 是关键字,属于JVM层面的,monitorenter 和 monitorexit,底层是通过monitor对象来完成的,其实 wait/notify 等方法是依赖monitor对象,只有在同步块或方法种才能调用 wait/notify 等方法。同步代码块: monitorenter指令是在编译后插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,JVM需要保证每一个monitorenter都有一个monitorexit与之相对应。任原创 2021-02-24 11:47:36 · 159 阅读 · 3 评论 -
彻底搞明白 String、StringBuilder、StringBuffer 的区别
前言String、StringBuilder、StringBuffer 之间的关联与区别是java面试中经常被问到的问题,虽然很基础,但是仍然要引起面试者的注意,避免踩坑。一、了解String类看下String类的源代码:从上面可以看出以下几点:1、String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的,并且该类中的成员方法都默认为final方法。在早期的JVM实现版本中,被final修饰的方法原创 2021-05-07 22:30:41 · 1414 阅读 · 2 评论 -
try、catch、finally 代码块的执行顺序
前言在java面试中,经常会给你一段代码,其中有try、catch、finally代码块,让你分析最终的返回结果,本文就是来讲清楚其执行顺序。概述异常处理中,try、catch、finally的执行顺序,大家都知道是按顺序执行的。即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→finally。但是当try、catch、finally中加入return之后,就会有几种不同的情况出现,下面分别来说明一下。也可以跳到最后直接看总结。1、try 中带原创 2021-04-12 16:47:51 · 581 阅读 · 0 评论 -
hashCode()与equals()方法之间千丝万缕的关系
前言hashCode()与equals() 是java面试中经常被问道的问题,可能会被问道 “你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ,因此我们需要彻底弄清楚这2个方法的关联关系。hashCode()方法介绍hashCode()的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数,这个hash码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都原创 2021-04-12 11:30:58 · 207 阅读 · 0 评论 -
搞清楚Java线程池
前言线程池是java面试被问的高频问题之一,线程池的工作原理、自定义线程池的参数含义、JUC包常用线程池等等,在此整理总结,供大家参考学习。一、为什么要使用线程池线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控。使用线程池的优点:1、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗2、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行3、方便线程并发数的管控。原创 2021-01-09 21:22:28 · 93 阅读 · 0 评论