
面经
文章平均质量分 68
忧郁的叮当猫
路虽远,行则将至;书虽难,学则必成。
展开
-
2021秋招高频面经汇总(Java开发岗)
如果让你设计一个缓存,你怎么设计?1.数据结构首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构;2.对象上限因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据;3.清除策略上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO原创 2021-08-25 17:47:28 · 3731 阅读 · 11 评论 -
Synchronized和ReentrantLock的区别
Synchronized和ReentrantLock的区别ReentrantLock可以响应中断,如果当前持有锁则释放锁,Synchronized不可以 ReentrantLock需要手动释放锁,Synchronized自动释放 Synchronized属于独占式悲观锁,是通过JVM隐式实现,Java中每个对象都隐式包含一个Monitor(监视器对象),加锁实际就是竞争Monitor的过程。 ReentrantLock是基于AQS队列同步器实现的,默认通过非公平锁实现的,它内部有一个state的状原创 2021-11-04 17:42:28 · 275 阅读 · 0 评论 -
HashMap加载因子为什么是0.75?大了和小了会怎么样?
HashMap加载因子为什么是0.75?大了和小了会怎么样?0.75是趋于内存和访问效率上折中取的,负载因子的大小决定了HashMap的数据密度负载因子越大数据密度越大,发生碰撞的几率越高,数组中的链表也容易越长, 这样的话造成查询和插入时的比较次数增多,性能会下降。负载因子越小,越容易触发扩容,虽然数据密度也越小,发生碰撞几率小,数组中链表越短对于查询和插入时比较次数也会少一些,性能也会提高。但是扩容会影响性能,所以建议初始化预设给它大一点空间。如何解决Hash碰撞?1.开放定原创 2021-11-04 17:06:37 · 1085 阅读 · 0 评论 -
Mybatis的Mapper中的方法为什么不能重载?
前言 在初入门 Mybatis 的时候可能都犯过一个错误,那就是在写 Mapper 接口的时候都重载过其中的方法,但是运行起来总是报错,那时候真的挺郁闷的,但是自己也查不出来原因,只能默默的改了方法名,哈哈,多么卑微的操作。 今天就从 源码 角度为大家解惑为什么 Mybatis 中的方法不能重载? 环境配置 本篇文章讲的一切内容都是基于 Mybatis 3.5 和 SpringBoot-2.3.3.RELEASE。 错误示范 举个栗子:假设现在有两个需求,一个是根据用户的转载 2021-10-26 17:52:34 · 392 阅读 · 1 评论 -
给你一个只包含数字的字符串,输出这个字符串的整数值
例如String s="123456";输出 123456解法:可以把s转换为array数组,倒序遍历,int a=c-'0';sum+=sum+a*10;最后返回sum问题升级:不让使用字符加减转换int,也不让强转,也不让使用工具类,这道题该怎么解?大题思路还是一样,不过int a=c&15;这样写效率更高,&(有1才是1);整数字符也就是0~9,一个整数字符&15可以得到他本身的整型;...原创 2021-10-19 17:07:24 · 744 阅读 · 0 评论 -
给定学生姓名,学科,成绩三个字段组成的一张表,查询各科成绩最高的学生
面试的时候我只是想到了先查出学科和最高成绩(Max(score))根据学科分组,然后还需要用连接查询,但是由于当时面试比较紧张,一时间没想出来,回来好好想想,其实并不难。学生成绩表具体思路:第一步,我们能想到的肯定是先查到各科最高的成绩和科目select course,Max(score)from stuscoregroup by course查询结果为我们要思考如何把这个查询记录和姓名关联起来,那当然是根据course和Max(score)了,既然想到这了,..原创 2021-10-12 15:38:20 · 4509 阅读 · 5 评论 -
HTTP状态码
1xx (临时响应) 表示临时响应并需要请求者继续执行操作的状态代码。 2xx (成功) 表示成功处理了请求的状态代码。 3xx (重定向) 表示要完成请求,需要进一步操作,通常,这些状态代码用来重定向。 4xx (请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。 500 (服务器内部错误) 服务器遇到错误,无法完成请求。...原创 2021-09-23 11:03:16 · 182 阅读 · 0 评论 -
分布式、高并发、高性能场景(抢购,秒杀,抢票,限时抢答)数据一致性解决方案
技术指标:PV(Page View, 页面浏览量)在千万级别QPS(Query Per Second, 每秒处理请求数)在百万级别数据量在千亿级别接口响应速度不能超过150毫秒用户提交请求到页面呈现不能超过3秒架构设计:1. 从LAMP架构转为面向服务架构(服务可以用多种开发语言实现,不受一种开发语言限制)2. 对海量数据做Sharding分片,分库分表3. 从有状态服务改为无状态接口服务(便于分布式部署)4. 精心设计的数据层(存储、压缩、索引)5. 分布式系统最终瓶颈(CPU、转载 2021-09-18 16:33:48 · 919 阅读 · 0 评论 -
解释一下AOP里边的几个名词
切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。 连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。 应用可能有数以千计的时机应用通知。这些时机被称为连接点。连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的...转载 2021-08-25 15:40:03 · 582 阅读 · 1 评论 -
RPC和CAP
RPCRPC(Remote Procedure Call Protocol)—— 远程过程调用协议,它是一种通过 网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些 传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI 网络通信模型中,RPC跨越了 传输层和 应用层。RPC使得开发包括网络 分布式多程序在内的应用程序更加容易。RPC简单的来说就是像调用本地服务一样调用远程服务。那么,netty是什么东西呢,跟RPC有什么关系?Netty提供翻译 2021-08-24 17:00:13 · 500 阅读 · 1 评论 -
什么是装箱?什么是拆箱?
深入剖析Java中的装箱和拆箱爱开发2018-01-18点击上方“爱开发”,置顶公众号技术文章第一时间送达!bug没地儿问? 公众号内回复“加群”,邀你加入微信技术学习群,共同学习!自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。以下是本文的目录大纲: 什么是装箱?什么是拆箱? 装箱和拆箱是如何实现的 面试中相关.转载 2021-08-18 09:53:06 · 7151 阅读 · 0 评论 -
为什么我们不用Executors默认创建线程池的方法,而直接自己手动去调用ThreadPoolExecutor去创建线程池?
引用阿里巴巴Java开发手册上的一句话【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors 返回的线程池对象的弊端如下:1)FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。2)CachedThreadPool和 Schedu翻译 2021-08-17 15:27:50 · 2131 阅读 · 0 评论 -
重温线程池拒绝策略
ThreadPoolExecutor的构造方法的最后一个参数指定了拒绝策略,当提交给线程池的任务量超过实际承载能力时,如何处理?即线程池中的线程已经用完,等待队列也满了,无法为新提交的任务服务,可以通过拒绝策略来处理这个问题。四种拒绝策略: 1.AbortPolicy策略:会抛出异常 2.CallerRunPolicy策略:只要线程池没关闭,会在调用者线程中运行当前被丢弃的任务 3.DiscardOldestP...原创 2021-08-13 18:10:13 · 1118 阅读 · 0 评论 -
分页查询原理
一、分页查询概述分页查询则是在页面上将本来很多的数据分段显示,每页显示用户自定义的行数。可提高用户体验度,同时减少一次性加载,内存溢出风险。1.1、分页查询分类1.1.1、真分页每次翻页从数据库中查询数据。 优点:不容易造成内存溢出。 缺点:实现复杂,性能相对低。 1.1.2、假分页一次性查询所有数据存入内存,翻页从内存中获取数据。 优点:实现简单,性能高。 缺点:容易造成内存溢出。 1.2、分页效果发送请求访问一个带有分页页面的数据,会发现其转载 2021-08-12 10:21:26 · 18510 阅读 · 0 评论 -
关闭浏览器Session就消失了吗?
Cookiecookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。由于cookie是存在客户端上的,所以浏览器加入了一些限制确保cookie不会被恶意使用,同时不会占据太多磁盘空间,所以每个域的cookie数量是有限的。Sessionsession 从字面上讲,就是会话。这个就类似于你转载 2021-08-11 16:15:52 · 3017 阅读 · 0 评论 -
TCP三次握手四次挥手详解及面试题
TCP报文首部源端口和目的端口,各占2个字节,分别写入源端口和目的端口; 序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有100字段,显然下一个报文段(如果还有的话)的数据序号应该从401开始; 确认号,占4个字节,是期望收到对方下一个报文的第一个数据字节的序号。例如,B收到了A发送过来的报文,其序列号字段是501,而数据长度是200字节,这表明B正确的收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个转载 2021-08-10 10:23:41 · 1977 阅读 · 0 评论 -
Java虚拟机(JVM)面试题合集
Java内存模型我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统,他只认识 01010101 比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的 HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不认识 Java文件编译的过程程序员编写的.java文件 由javac编译成字节码文件.class:(为什么编译成class文件,因为JVM只认识.class文件) 在由JVM编译成电脑认识的文件 (对转载 2021-08-04 15:16:43 · 1315 阅读 · 0 评论 -
JVM空间分配担保机制
在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间。如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlerPromotionFailure设置是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。如果大于,将尝试着进行一次Monitor GC,尽管这次GC是有风险的。如果小于,或者HandlerPromotionFailure设置不允许冒险,进行一次Fu...原创 2021-08-02 17:59:17 · 2275 阅读 · 0 评论 -
MYSQL数据库优化
为什么要优化系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比优化原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。数据库结构优化 一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。 需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。 将字段很多的表分解成多个表 对于字段较多的表,如果有些字段的使用频率很低,可以将这些字转载 2021-08-02 16:17:01 · 1649 阅读 · 0 评论 -
简单说几个JDK1.7和JDK1.8的区别?
1.Switch支持String类型2.Catch多个异常catch(IOException | SQLException | Exception ex){ logger.error(ex); throw new MyException(ex.getMessage());}3.泛型实例创建可以通过类型推断简化,new对象后边的泛型可以不用写,直接< >4.HashMap性能优化:jdk1.8 当每个链表长度 >8 ,并且数组元素个数 ≥64时,会原创 2021-07-30 17:29:43 · 8910 阅读 · 0 评论 -
JAVA栅栏和闭锁的区别
闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。即,一组线程等待某一事件发生,事件没有发生前,所有线程将阻塞等待;而事件发生后,所有线程将开始执行;闭锁最初处于封闭状态,当事件发生后闭锁将被打开,一旦打开,闭锁将永远处于打开状态。 闭锁CountDownLatch唯一的构造方法CountDownLatch(intcount),当在闭锁上调用countDown()方法时,闭锁的计数器将减1,当闭锁计数器为0时,闭锁将打开,所有线程将通过闭锁开始执行。...转载 2021-07-30 16:58:17 · 1087 阅读 · 0 评论 -
MySQL的MVCC是什么?
首先看一下什么是数据库事务事务就是为了保证一组数据库操作,要么全部成功,要么全部失败。事务的四大特性 原子性(Atomicity) 一个事务中的多组操作,要么全部成功,要么全部失败。在事务提交(commit)成功之后,所有的操作都生效,提交失败,所有的操作都会回滚。 持久性(Durable) 事务一旦提交,对数据库的变更就会持久化到磁盘,即使数据库发生异常重启,数据也不会丢失。 隔离性(isolation) 事务在执行过程中,是与外界完全隔离的,即使数据库发生了变更,事转载 2021-07-28 16:48:37 · 1134 阅读 · 0 评论 -
Mybatis源码分析
工作原理: 1. 读取核心配置文件mybatis-config.xml并返回InputStream流对象。 2. 根据InputStream流对象解析出Configuration对象,然后创建SqlSessionFactory工厂对象 3. 根据一系列属性从SqlSessionFactory工厂中创建SqlSession 4. 从SqlSession中调用Executor执行数据库操作&&通过解析生成具体SQL指令 5. 通过TypeHandler(数据库与j转载 2021-07-27 18:10:35 · 905 阅读 · 0 评论 -
java中静态变量,静态代码块,静态方法,实例变量,普通代码块的初始化顺序
单个类的初始化顺序加载顺序: 加载类 --> 静态变量、静态代码块(先后顺序加载) --> 成员变量、普通代码块 --> 构造方法父子类初始化顺序父类静态变量、静态代码块 --> 子类静态变量、静态代码块 --> 父类成员变量、普通代码块--> 父类构造方法 --> 子类成员变量、普通代码块--> 子类构造方法总结:如果类还没有被加载:1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。2转载 2021-07-27 17:38:51 · 1319 阅读 · 0 评论 -
谈谈你对最左前缀原则的理解(重点)
首先我们要知道最左匹配原则是什么?最左匹配原则:MySQL会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配。个人对最左前缀的理解MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。如下:select * from user where name=xx and city.原创 2021-07-09 10:04:15 · 3338 阅读 · 1 评论 -
MySQL锁详解
不同的存储引擎支持不同的锁机制 MyISAM 和 MEMORY 存储引擎采用的是表级锁 BDB 存储引擎采用的是页面锁,但也支持表级锁 InnoDB 存储引擎既支持行级锁,也支持表级锁,但默认情况下是采用行级锁。 不同粒度锁的比较:表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与...原创 2021-07-09 09:57:12 · 852 阅读 · 2 评论 -
MySql添加索引的五种方法
1.添加primary key(主键索引)alter table 表名称 add primary key(列名);2.添加unique(唯一索引)alter table 表名称 add unique(列名);3.添加index(普通索引)alter table 表名称 add index 索引名(index_name) (列名);4.添加fulltext(全文索引)alter table 表名称 add fulltext (列...转载 2021-07-09 09:28:09 · 18166 阅读 · 0 评论 -
有效的括号(Java笔试)
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true示例 2:输入: "()[]{}"输出: true示例 3:输入: "(]"输出: false示例 4:输入: "([)]"输出: false示例 5:输入: "{[]}"...转载 2021-06-07 13:24:34 · 1004 阅读 · 0 评论 -
浅析Spring
Spring是一个框架,在我们整个开发流程中,所有的框架生产几乎都依赖于Spring,Spring帮我们起到了一个IOC容器的作用,用来承载我们整体的Bean对象,它帮我们进行了整个对象从创建到销毁的整个生命周期的管理,我们在使用Spring的时候可以使用配置文件,也可以使用注解的方式来进行相关实现但是,当我们程序开始启动之后,要把注解或者配置文件定义好的那些Bean对象转换成一个BeanDefintion,然后完成整个BeanDefintion的解析和加载过程,当我们获取到这些完整原创 2021-06-03 16:01:12 · 867 阅读 · 1 评论 -
ConcurrentHashMap 的工作原理及代码实现
ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组。Segment继承了ReentrantLock,所以它就是一种可重入锁(ReentrantLock)。在ConcurrentHashMap,一个Segment就是一个子哈希表,Segment里维护了一个HashEntry数组,并发环境下,对于不同Segment的数据进行操作是不用考虑锁竞争的。...转载 2021-06-02 18:20:44 · 1650 阅读 · 0 评论 -
Spring中bean的生命周期
Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化 Bean实例化后对将Bean的引入和值注入到Bean的属性中 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入 如果Bean实现了ApplicationContextAware接口的话,Sprin原创 2021-06-02 17:27:29 · 875 阅读 · 0 评论