Java笔试面试目录(一个大佬的总结)https://blog.csdn.net/weixin_41835916/article/details/81413498
1.自我介绍。
2.画出项目的架构图,对每层进行解释,为何用MVC分层。
3.exception异常处理结构,常见异常,多catch处理顺序。
4.对多个表的操作,用事务操作如何实现,写代码
5.maven了解吗
6.死锁
OPPO面筋集合14题:https://blog.csdn.net/weixin_39345957/article/details/89000440
7.tomcat如何部署,war包结构,发布工具.
8.jvm相关原理,垃圾回收算法。
常用的垃圾回收算法有:
1. 引用计数法(经典算法)
对于对象设置一个引用计数器,每增加一个对该对象的引用,计数器+1,引用失效则-1.当计数器为0时,对象死亡,被回收。
存在问题:
- 对象内部频繁的加减操作,会一定程度上增加系统消耗
- 无法解决对象循环引用的问题(A中引用B,B中引用A,此时两个对象的计数器均不为0,A=NULL,B=NULL本该无效了,但是却无法回收,导致内存泄漏)
2. 标记清除法
该方法分为两个阶段:标记和清除
标记阶段:通过可达性算法,跟踪对象,标记所有和GCRoots节点相关联的对象,剩余没有被标记的对象则为需要回收的对象。
清除阶段:清除未被标记的对象。
可达性算法分析时,需要两次标记(finalize)
存在问题:
垃圾回收后可能会产生大量的内存碎片,使得如果有一个大内存对象到来,可能会提前触发一次GC。
3. 标记整理法(老年代)
分为三个阶段:标记,整理,清除
标记
整理:将标记后的对象统一往内存的一端移动
清除: 清除端以外的内存
存在问题:
整理对象阶段占用了系统的消耗,并且如果标记对象很多,会导致损耗很大。标记对象相对较少的时候,效率较高
4. 复制算法(新生代)
核心思想是将内存空间分成两块,同一时刻只使用其中的一块,在垃圾回收时将正在使用的内存中的存活的对象复制到未使用的内存中,然后清除正在使用的内存块中所有的对象,
然后把未使用的内存块变成正在使用的内存块,把原来使用的内存块变成未使用的内存块。很明显如果存活对象较多的话,算法效率会比较差,并且这样会使内存的空间折半,但是这种方法也不会产生内存碎片。
5. 分代法(常用于java堆)
根据对象的生命周期长短特点,进行分块。根据每块内存区间的特点,是哟个不同的回收算法,从而提高垃圾回收的效率。
比如Java虚拟机中的堆就采用了这种方法分成了新生代和老年代。然后对于不同的代采用不同的垃圾回收算法。
新生代使用了复制算法,老年代使用了标记压缩清除算法。
6. 分区算法
将整个空间划分为连续的不同小区间,每个区间都独立使用,独立回收,好处是可以控制一次回收多少个小区间(G1)
9.写sql语句,主要考察group by/having/count等
10.消息队列了解吗。
11.贝叶斯算法。
12.java数据结构。
13.hashmap结构,
14.arraylist和linkedlist区别。(×2)
15.线程同步如何实现,
JAVA多线程——实现同步:https://blog.csdn.net/weixin_38719347/article/details/81219514
16.reentrantlock跟synchronized区别。
https://www.cnblogs.com/baizhanshi/p/7211802.html
17.线程池,原理和实现。
18.负载均衡算法。
https://www.cnblogs.com/will-shun/archive/2017/09/22/7574644.html
19.数据库,查询优化,
20.事务隔离级别,你项目中用的什么隔离级别,用读提交可以吗。
21.SpringMVC的工作原理/MVC是做什么的,有什么好处 (×2)
SpringMVC工作原理:https://www.cnblogs.com/xiaoxi/p/6164383.html
22.有哪些注解
springmvc 注解总结:https://www.cnblogs.com/xiaoxi/p/5718894.html
JAVA 注解的基本原理:https://www.cnblogs.com/yangming1996/p/9295168.html
注解工作原理详解:https://www.cnblogs.com/lyxcode/p/9377897.html
-
@RequestMapping:一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中)
- 在其中可以设置具体的访问变量和访问的方法post还是get@RequestMapping(value="/get/{bookid}",method={RequestMethod.GET,RequestMethod.POST})
-
@RequestParam绑定单个请求参数值,用于将请求参数区数据映射到功能处理方法的参数上。
-
@PathVariable绑定URI模板变量值,用于将请求URL中的模板变量映射到功能处理方法的参数上
- @RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value=“userId”) int userId,
@PathVariable(value=“topicId”) int topicId)
- @RequestMapping(value="/users/{userId}/topics/{topicId}")
-
@ModelAttribute
23.如何实现一个线程
24.线程由什么构成
25.线程和进程的区别
26.java的基础类型
27.equals和==
28.tcp与udp
29.list和set的区别
30.有有序的set吗
31.String StringBuilder StringBuffer的区别(常量池)
32.jvm垃圾回收算法 垃圾回收器
33.hashmap的几个方法
34.快排的最好和最坏复杂度
35.java多线程有哪几种实现方法
36.CountDownLatch
37.关于数据库事务说出你知道的所有
38.登陆验证问题
39.concurrent包的技术全部说出来(volatile、锁重入,LinkedTransferQueue字节追加提高并发度技术,ConcurrentHaspMap结合volatile的happen-before读取优化)
Concurrent包详解及使用场景:http://www.cnblogs.com/chuijingjing/p/10072912.html
Concurrent包中类的详解:https://blog.csdn.net/masterlinsp/article/details/78756617
40.websocket长连接问题
41.秒杀业务场景设计(事务,逻辑调整,行级锁,数据库并发度、mybatis调用存储过程)
42.mysql讲一下索引。为什么组合索引是最左前缀匹配的
mysql索引最左匹配原则的理解?https://blog.csdn.net/gettogetto/article/details/70499157
- java的基本类型
44.final都是怎么用?
45.throws throw 怎么用?
46.hashmap原理?为什么每次扩容都是扩大一倍为什么不是三倍四倍?
47.二叉树的遍历
48.快排
49.堆排,如果从若干数中找最大N个数用最大堆还是最小堆?
50.数据库了解吗?
51用过什么框架?
520.HTTP TCP UDP 的区别,具体用在哪些场景。
53说一下 java中的队列 set map 区别,java里的数据结构。讲讲它们的实现。
54.static关键字的作用
55 final 修饰 属性 类 方法都有什么作用
56. abstract 等关键字的作用,什么时候用
57. 子类中如何调用父类的构造器,如果不用super关键字呢?有其他的方式吗?
58. .如果两个线程都使用一个ByteBuf 怎么保证它的安全,具体说一下代码实现
59. 好来说一下数据结构,有一个很长的链表,找出倒数第k个元素。 不用两个指针呢?他们之前有什么区别?面试官更想听你说的第二种实现。
60. .二叉树的前序遍历,说下怎么实现,不用递归实现呢? 还有其他的方式吗?它们的区别
61. hashCode和equals方法的区别与联系
62. HashMap的底层实现
63. AOP的思想,
64. Spring注入的方式
65. linux权限控制
66. Mysql数据库优化方式
67. 介绍快速排序
68. 版本控制工具,
69. jvm堆栈静态区分别存储的内容
70. 创建线程的4中方式
71 . sleep和wait的区别
- sleep:是Thread的静态方法,wait是Object的成员方法
- sleep可以在任何地方使用,wait只能在同步方法或者同步方法快中使用
- sleep和wait使用后都会暂停当前线程并出让cpu资源。区别在于:sleep不会释放锁,时间到后会继续执行;wait会释放锁并且需要notify/notifyAll方法唤醒后,重新竞争锁之后才可以进行
- sleep需要捕获/抛出异常;wait/notify/notifyAll不需要
- sleep方法是单线程的,没有释放锁指的是线程锁;wait指的是对象锁
- 数据结构 list set 具体到arraylist linkedlist vector的区别
- hashset的实现,
- hashmap的实现
- StringBuilder Stringbuffer
- 重写和重载
- 三个线程的实现方式
- 线程中的同步
- 前台中有两个输入框a和b 在a输入框输入数据并且点击一按钮后b输入框响应显示a的数据,然后点击一个按钮后,将数据提交到后台,后台处理后返回前台,具体的逻辑过程
80. 线程的生命周期
81. 递归
1.设计一个高可用性数据库架构
数据库高并发高可用架构设计:https://blog.csdn.net/weixin_42684977/article/details/84147354
2.Linux命令 top
Linux top命令的用法详细详解:https://www.cnblogs.com/zhoug2020/p/6336453.html
3.常见排序算法
数据结构常见的八大排序算法(详细整理):https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends
4.常见的八大数据结构
5.10w个数字,你如何找出一个最大的那个数字呢?
5.1最大堆和最小堆的定义
5.2为什么选用最小堆
5.3 堆的复杂度(建堆,插入,调整)
5.4 如果找到前20个,时间复杂度是多少
5.5如果前20个正好是最大的20,复杂度 是多少
6.浏览一个网址,背后都处理了什么
解析:
(1)输入地址
(2)浏览器查找域名的 IP 地址
这一步包括 DNS
具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存…
(3)浏览器向 web 服务器发送一个 HTTP 请求
(4)服务器的永久重定向响应(从 http://example.com 到 http://www.example.com)
(5)浏览器跟踪重定向地址
(6)服务器处理请求
(7)服务器返回一个 HTTP 响应
(8)浏览器显示 HTML
(9)浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
(10)浏览器发送异步请求
7. 什么是DNS,一定会执行DNS?
详解DNS域名解析全过程:https://blog.csdn.net/m0_37812513/article/details/78775629
8. 长连接和短链接
HTTP的长连接和短连接:https://www.cnblogs.com/cswuyg/p/3653263.html
- HTTP和TCP和UDP,特点和应用场景
10. set如何保证不重复
Set中的元素为什么不允许重复:https://blog.csdn.net/chenjian98306/article/details/50331645
HashSet类是如何实现添加元素保证不重复的—哈希码的原理https://blog.csdn.net/u010698072/article/details/52802179
11. hashmap如何保证key不重复
从源码分析HashSet / HashMap是如何保证不重复的?:https://www.jianshu.com/p/fb1727bbf555
12. java中都有什么锁
java中的锁https://www.cnblogs.com/5207/p/5917353.html
java中的锁有哪几种:https://blog.csdn.net/u012045045/article/details/84395912
13. spring的事务传播
Spring事务传播机制:https://www.cnblogs.com/softidea/p/5962612.html
【Spring学习34】Spring事务(4):事务属性之7种传播行为:https://blog.csdn.net/soonfly/article/details/70305683
-
说说cas算法以及应用 ABA
-
concurrenthashmap原理
-
.synchronized实现原理、范围、如何用?
-
说说spring
-
抽象类和接口的区别?若抽象类支持多继承,接口还有存在的意义么?
-
栈实现四则运算
-
面向对象的思想是什么
-
你对Java 语言的看法
-
单CPU情况下,单线程与多线程的效率对比?
-
Spring 默认的 bean 是单例还是多例?如何改成多例?为什么是单例
24. Spring bean的生命周期
Spring Bean的生命周期(非常详细)https://www.cnblogs.com/zrtqsk/p/3735273.html
Java面试–Spring中的Bean的作用域和生命周期:https://blog.csdn.net/weixin_41835916/article/details/81906366
25. 线程的调度算法有哪些?
1)先来先服务调度算法(FCFS) 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
2)短作业(进程)优先调度算法(SPF) 短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。缺点:长作业的运行得不到保证
3)优先权调度算法(HPF) 当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。
可以分为**:1.非抢占式优先权算法 2.抢占式优先权调度算法**
5)时间片轮转法(RR) 在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。
6)多级反馈队列调度算法
(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
-
快排
-
一致性哈希
-
结合项目谈谈设计模式
-
观察者模式
-
红黑树和avl树的区别,为什么用红黑树实现map
为什么Java8中HashMap链表使用红黑树而不是AVL树:https://blog.csdn.net/21aspnet/article/details/88939297
31. Jsp与Servlet的关系。
(1)jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
(2)jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
(3)Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
32. 数据库中有like,%like和like%什么区别,索引的区别、
- 实现一个aop如何实现
34. 遍历arrayList三种方法
ArrayList三种遍历方式比较:https://blog.csdn.net/Jason_M_Ho/article/details/78725687
for
foreach
iterator如果只进行遍历不做其他操作,那么效率上:for>iterator>foreach
猜测:for>iterator的原因在于,使用迭代器每次获取next的时候需要调用hasNext方法进行判断。
为什么foreach最慢不知道
-
Hashmap对null如何处理get(c) c并没有加入到map中
-
Java的优点(面向对象,三大特性:封装、继承、多态)分别体现
37. 访问修饰符的作用范围,为什么要有protected修饰符
JAVA编程语言中受保护的访问修饰符protected分析:http://baijiahao.baidu.com/s?id=1600712630258756747&wfr=spider&for=pc
Java中访问修饰符作用范围:https://blog.csdn.net/dzb641973142/article/details/76178995
38. 接口和抽象类的区别
- Hashmap 底层原理以及get()和put()方法的底层实现,二者区别
40. 参数传递(值传递、引用传递)
Java的参数传递是「值传递」还是「引用传递」?:https://www.cnblogs.com/jiangxin007/p/9076696.html
41. 几百万条长短不一的数组,如何找出他们的公共部分(不会,说的方法很笨,后来问了同学,说
是用set或者Hashmap)
42. SpringMVC的九大组件
【SpringMVC】9大组件概览:https://blog.csdn.net/hu_zhiting/article/details/73648939
43. ORM框架
ORM 框架简介:https://www.cnblogs.com/wisdo/p/4279091.html
ORM框架简介及优缺点:https://blog.csdn.net/orecle_littleboy/article/details/82458956
- IOC的设计原理和高级特性
45. AOP的设计原理
aop的实现原理就是java的动态代理,默认是jdk的动态代理
《Spring设计思想》AOP设计基本原理:https://blog.csdn.net/luanlouis/article/details/51095702
SpringIOC和AOP原理 设计模式 :https://www.jianshu.com/p/40d0a6ad21d2
面试问烂的SpringAOP原理,SpringMVC过程:https://blog.csdn.net/qq_42950313/article/details/83308152
46. FactoryBean和BeanFactory
BeanFactory 简介以及它
和FactoryBean的区别(阿里面试):https://www.cnblogs.com/aspirant/p/9082858.html
47. 理解Spring循环引用(循环依赖)
这篇文章讲的很透彻!!!,我总结了一下
理解Spring循环引用(循环依赖):https://blog.csdn.net/chen2526264/article/details/80673598
循环依赖:
也叫循环引用,即在Spring容器中,将A注入到B中,同时也将B注入到A中。
考虑循环依赖带来的问题,首先分析多种情况排列组合:
- 依赖注入的两种方式:构造器和属性
- bean的作用域:singleton和prototype
- bean的加载方式:立即加载和延迟加载(此处讨论只考虑延迟加载的情况,因为使用延迟加载有时候单例bean的加载顺序会影响创建成功与否)
bean采用立即加载的方式,一定可以加载成功吗
情况罗列:
- 当循环依赖的bean都是使用构造器注入的时候,无论两个bean是singleton和prototype中哪种组合,获取bean都失败(BeanCreationException)
- 当采用属性注入的时候,不同组合不同表现
- 双方都是singleton,那么无论先获取哪个bean都会成功
- 如果都是prototype,无论哪个先都会失败
- 如果一个s一个prototype,必须先获得s才可以成功
- 当同时属性和构造器的时候,只有 两种成功情况
- 两者都是singleton,并且容器启动后,先去获得由属性注入的bean
- 一个s,一个p,其中s是属性注入,p是构造器,容器启动后先获取s
总结:
如果多个bean存在循环依赖,在Spring容器启动后,只有当获取的第一个bean是通过属性注入依赖的singleton时,才会成功,别的情况都会失败
原因
循环依赖会出现:Spring在创建A的时候,发现其引用了B,那么就去创建B。在创建B的时候发现引用了A,再去创建A,两者相互等待,谁都不能成功创建。
1.为什么一定要用属性注入呢?
如果需要打破这个环,就必须保证至少得有一个bean可以在自身依赖没有满足之前就被创建(至少要被实例化,可以先不注入其依赖) ,这种bean只能通过属性注入实现:因为他可以先使用默认构造器创建实例,然后再通过setter注入。如果使用构造器注入方法的话,依赖没有满足之前,没办法实例化。
2.为什么必须得有一个是singleton?
根本原因是:Spring容器只会对singleton的bean保存引用,而不会对prototype保存引用。
具体来说:
Spring容器启动后,先获取SingletonA,那么容器会执行下面几个步骤:
①尝试创建SA,发现是S的生存域并且通过属性注入,那么先使用默认构造器创建一个实例,并保存对其引用,并标记为“SA正在创建中”,发现A依赖B,去创建B
②尝试创建B,发现是S的生存域并且通过属性注入,那么先使用默认构造器创建一个实例,并保存对其引用,发现依赖了A,创建A
③尝试创建A,由于A是S生存域的,spring容器发现有一个SA被标记为正在创建中,那么就不会再去创建,而是直接给B返回①中保存的A的引用
④SA通过属性注入B,B创建完成
⑤SB通过属性注入A,A完成
如果第一个获取的是prototype域的话,不会保存对第一个类对象的引用,那么无法打破循环
3.为什么第一个获取的必须是Singleton
这个和Spring的具体实现有关,当Spring容器遍历那些循环依赖的bean时,只要遍历到那种已经遍历过一次的bean,并且它们不是通过属性注入依赖的singleton时,就会直接抛出BeanCurrentlyInCreationException异常
Spring中Bean的作用域
Spring中Bean的作用域、生命周期:
https://www.cnblogs.com/zhanglei93/p/6231882.html
有五种
Singleton(单例)
48. 快速失败
Java的快速失败和安全失败http://www.cnblogs.com/ygj0930/p/6543350.html
49. 线程池流程,原理
JAVA线程池原理详解一https://www.cnblogs.com/dongguacai/p/6030187.html
- volatile锁
51. callable和哪个类一起用可以知道结果
JAVA并发编程-返回执行结果(Callable和Future)(九):https://blog.csdn.net/hejingyuan6/article/details/47065629
Java笔试面试目录(一个大佬的总结)https://blog.csdn.net/weixin_41835916/article/details/81413498
1.自我介绍。
2.画出项目的架构图,对每层进行解释,为何用MVC分层。
3.exception异常处理结构,常见异常,多catch处理顺序。
4.对多个表的操作,用事务操作如何实现,写代码
5.maven了解吗
6.死锁
OPPO面筋集合14题:https://blog.csdn.net/weixin_39345957/article/details/89000440
7.tomcat如何部署,war包结构,发布工具.
8.jvm相关原理,垃圾回收算法。
常用的垃圾回收算法有:
1. 引用计数法(经典算法)
对于对象设置一个引用计数器,每增加一个对该对象的引用,计数器+1,引用失效则-1.当计数器为0时,对象死亡,被回收。
存在问题:
- 对象内部频繁的加减操作,会一定程度上增加系统消耗
- 无法解决对象循环引用的问题(A中引用B,B中引用A,此时两个对象的计数器均不为0,A=NULL,B=NULL本该无效了,但是却无法回收,导致内存泄漏)
2. 标记清除法
该方法分为两个阶段:标记和清除
标记阶段:通过可达性算法,跟踪对象,标记所有和GCRoots节点相关联的对象,剩余没有被标记的对象则为需要回收的对象。
清除阶段:清除未被标记的对象。
可达性算法分析时,需要两次标记(finalize)
存在问题:
垃圾回收后可能会产生大量的内存碎片,使得如果有一个大内存对象到来,可能会提前触发一次GC。
3. 标记整理法(老年代)
分为三个阶段:标记,整理,清除
标记
整理:将标记后的对象统一往内存的一端移动
清除: 清除端以外的内存
存在问题:
整理对象阶段占用了系统的消耗,并且如果标记对象很多,会导致损耗很大。标记对象相对较少的时候,效率较高
4. 复制算法(新生代)
核心思想是将内存空间分成两块,同一时刻只使用其中的一块,在垃圾回收时将正在使用的内存中的存活的对象复制到未使用的内存中,然后清除正在使用的内存块中所有的对象,
然后把未使用的内存块变成正在使用的内存块,把原来使用的内存块变成未使用的内存块。很明显如果存活对象较多的话,算法效率会比较差,并且这样会使内存的空间折半,但是这种方法也不会产生内存碎片。
5. 分代法(常用于java堆)
根据对象的生命周期长短特点,进行分块。根据每块内存区间的特点,是哟个不同的回收算法,从而提高垃圾回收的效率。
比如Java虚拟机中的堆就采用了这种方法分成了新生代和老年代。然后对于不同的代采用不同的垃圾回收算法。
新生代使用了复制算法,老年代使用了标记压缩清除算法。
6. 分区算法
将整个空间划分为连续的不同小区间,每个区间都独立使用,独立回收,好处是可以控制一次回收多少个小区间(G1)
9.写sql语句,主要考察group by/having/count等
10.消息队列了解吗。
11.贝叶斯算法。
12.java数据结构。
13.hashmap结构,
14.arraylist和linkedlist区别。(×2)
15.线程同步如何实现,
JAVA多线程——实现同步:https://blog.csdn.net/weixin_38719347/article/details/81219514
16.reentrantlock跟synchronized区别。
https://www.cnblogs.com/baizhanshi/p/7211802.html
17.线程池,原理和实现。
18.负载均衡算法。
https://www.cnblogs.com/will-shun/archive/2017/09/22/7574644.html
19.数据库,查询优化,
20.事务隔离级别,你项目中用的什么隔离级别,用读提交可以吗。
21.SpringMVC的工作原理/MVC是做什么的,有什么好处 (×2)
SpringMVC工作原理:https://www.cnblogs.com/xiaoxi/p/6164383.html
22.有哪些注解
springmvc 注解总结:https://www.cnblogs.com/xiaoxi/p/5718894.html
JAVA 注解的基本原理:https://www.cnblogs.com/yangming1996/p/9295168.html
注解工作原理详解:https://www.cnblogs.com/lyxcode/p/9377897.html
-
@RequestMapping:一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中)
- 在其中可以设置具体的访问变量和访问的方法post还是get@RequestMapping(value="/get/{bookid}",method={RequestMethod.GET,RequestMethod.POST})
-
@RequestParam绑定单个请求参数值,用于将请求参数区数据映射到功能处理方法的参数上。
-
@PathVariable绑定URI模板变量值,用于将请求URL中的模板变量映射到功能处理方法的参数上
- @RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value=“userId”) int userId,
@PathVariable(value=“topicId”) int topicId)
- @RequestMapping(value="/users/{userId}/topics/{topicId}")
-
@ModelAttribute
23.如何实现一个线程
24.线程由什么构成
25.线程和进程的区别
26.java的基础类型
27.equals和==
28.tcp与udp
29.list和set的区别
30.有有序的set吗
31.String StringBuilder StringBuffer的区别(常量池)
32.jvm垃圾回收算法 垃圾回收器
33.hashmap的几个方法
34.快排的最好和最坏复杂度
35.java多线程有哪几种实现方法
36.CountDownLatch
37.关于数据库事务说出你知道的所有
38.登陆验证问题
39.concurrent包的技术全部说出来(volatile、锁重入,LinkedTransferQueue字节追加提高并发度技术,ConcurrentHaspMap结合volatile的happen-before读取优化)
Concurrent包详解及使用场景:http://www.cnblogs.com/chuijingjing/p/10072912.html
Concurrent包中类的详解:https://blog.csdn.net/masterlinsp/article/details/78756617
40.websocket长连接问题
41.秒杀业务场景设计(事务,逻辑调整,行级锁,数据库并发度、mybatis调用存储过程)
42.mysql讲一下索引。为什么组合索引是最左前缀匹配的
mysql索引最左匹配原则的理解?https://blog.csdn.net/gettogetto/article/details/70499157
- java的基本类型
44.final都是怎么用?
45.throws throw 怎么用?
46.hashmap原理?为什么每次扩容都是扩大一倍为什么不是三倍四倍?
47.二叉树的遍历
48.快排
49.堆排,如果从若干数中找最大N个数用最大堆还是最小堆?
50.数据库了解吗?
51用过什么框架?
520.HTTP TCP UDP 的区别,具体用在哪些场景。
53说一下 java中的队列 set map 区别,java里的数据结构。讲讲它们的实现。
54.static关键字的作用
55 final 修饰 属性 类 方法都有什么作用
56. abstract 等关键字的作用,什么时候用
57. 子类中如何调用父类的构造器,如果不用super关键字呢?有其他的方式吗?
58. .如果两个线程都使用一个ByteBuf 怎么保证它的安全,具体说一下代码实现
59. 好来说一下数据结构,有一个很长的链表,找出倒数第k个元素。 不用两个指针呢?他们之前有什么区别?面试官更想听你说的第二种实现。
60. .二叉树的前序遍历,说下怎么实现,不用递归实现呢? 还有其他的方式吗?它们的区别
61. hashCode和equals方法的区别与联系
62. HashMap的底层实现
63. AOP的思想,
64. Spring注入的方式
65. linux权限控制
66. Mysql数据库优化方式
67. 介绍快速排序
68. 版本控制工具,
69. jvm堆栈静态区分别存储的内容
70. 创建线程的4中方式
71 . sleep和wait的区别
- sleep:是Thread的静态方法,wait是Object的成员方法
- sleep可以在任何地方使用,wait只能在同步方法或者同步方法快中使用
- sleep和wait使用后都会暂停当前线程并出让cpu资源。区别在于:sleep不会释放锁,时间到后会继续执行;wait会释放锁并且需要notify/notifyAll方法唤醒后,重新竞争锁之后才可以进行
- sleep需要捕获/抛出异常;wait/notify/notifyAll不需要
- sleep方法是单线程的,没有释放锁指的是线程锁;wait指的是对象锁
- 数据结构 list set 具体到arraylist linkedlist vector的区别
- hashset的实现,
- hashmap的实现
- StringBuilder Stringbuffer
- 重写和重载
- 三个线程的实现方式
- 线程中的同步
- 前台中有两个输入框a和b 在a输入框输入数据并且点击一按钮后b输入框响应显示a的数据,然后点击一个按钮后,将数据提交到后台,后台处理后返回前台,具体的逻辑过程
80. 线程的生命周期
81. 递归
1.设计一个高可用性数据库架构
数据库高并发高可用架构设计:https://blog.csdn.net/weixin_42684977/article/details/84147354
2.Linux命令 top
Linux top命令的用法详细详解:https://www.cnblogs.com/zhoug2020/p/6336453.html
3.常见排序算法
数据结构常见的八大排序算法(详细整理):https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends
4.常见的八大数据结构
5.10w个数字,你如何找出一个最大的那个数字呢?
5.1最大堆和最小堆的定义
5.2为什么选用最小堆
5.3 堆的复杂度(建堆,插入,调整)
5.4 如果找到前20个,时间复杂度是多少
5.5如果前20个正好是最大的20,复杂度 是多少
6.浏览一个网址,背后都处理了什么
解析:
(1)输入地址
(2)浏览器查找域名的 IP 地址
这一步包括 DNS
具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存…
(3)浏览器向 web 服务器发送一个 HTTP 请求
(4)服务器的永久重定向响应(从 http://example.com 到 http://www.example.com)
(5)浏览器跟踪重定向地址
(6)服务器处理请求
(7)服务器返回一个 HTTP 响应
(8)浏览器显示 HTML
(9)浏览器发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
(10)浏览器发送异步请求
7. 什么是DNS,一定会执行DNS?
详解DNS域名解析全过程:https://blog.csdn.net/m0_37812513/article/details/78775629
8. 长连接和短链接
HTTP的长连接和短连接:https://www.cnblogs.com/cswuyg/p/3653263.html
- HTTP和TCP和UDP,特点和应用场景
10. set如何保证不重复
Set中的元素为什么不允许重复:https://blog.csdn.net/chenjian98306/article/details/50331645
HashSet类是如何实现添加元素保证不重复的—哈希码的原理https://blog.csdn.net/u010698072/article/details/52802179
11. hashmap如何保证key不重复
从源码分析HashSet / HashMap是如何保证不重复的?:https://www.jianshu.com/p/fb1727bbf555
12. java中都有什么锁
java中的锁https://www.cnblogs.com/5207/p/5917353.html
java中的锁有哪几种:https://blog.csdn.net/u012045045/article/details/84395912
13. spring的事务传播
Spring事务传播机制:https://www.cnblogs.com/softidea/p/5962612.html
【Spring学习34】Spring事务(4):事务属性之7种传播行为:https://blog.csdn.net/soonfly/article/details/70305683
-
说说cas算法以及应用 ABA
-
concurrenthashmap原理
-
.synchronized实现原理、范围、如何用?
-
说说spring
-
抽象类和接口的区别?若抽象类支持多继承,接口还有存在的意义么?
-
栈实现四则运算
-
面向对象的思想是什么
-
你对Java 语言的看法
-
单CPU情况下,单线程与多线程的效率对比?
-
Spring 默认的 bean 是单例还是多例?如何改成多例?为什么是单例
24. Spring bean的生命周期
Spring Bean的生命周期(非常详细)https://www.cnblogs.com/zrtqsk/p/3735273.html
Java面试–Spring中的Bean的作用域和生命周期:https://blog.csdn.net/weixin_41835916/article/details/81906366
25. 线程的调度算法有哪些?
1)先来先服务调度算法(FCFS) 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
2)短作业(进程)优先调度算法(SPF) 短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。缺点:长作业的运行得不到保证
3)优先权调度算法(HPF) 当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程,这时,又可进一步把该算法分成如下两种。
可以分为**:1.非抢占式优先权算法 2.抢占式优先权调度算法**
5)时间片轮转法(RR) 在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。
6)多级反馈队列调度算法
(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。
-
快排
-
一致性哈希
-
结合项目谈谈设计模式
-
观察者模式
-
红黑树和avl树的区别,为什么用红黑树实现map
为什么Java8中HashMap链表使用红黑树而不是AVL树:https://blog.csdn.net/21aspnet/article/details/88939297
31. Jsp与Servlet的关系。
(1)jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
(2)jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
(3)Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
32. 数据库中有like,%like和like%什么区别,索引的区别、
- 实现一个aop如何实现
34. 遍历arrayList三种方法
ArrayList三种遍历方式比较:https://blog.csdn.net/Jason_M_Ho/article/details/78725687
for
foreach
iterator如果只进行遍历不做其他操作,那么效率上:for>iterator>foreach
猜测:for>iterator的原因在于,使用迭代器每次获取next的时候需要调用hasNext方法进行判断。
为什么foreach最慢不知道
-
Hashmap对null如何处理get(c) c并没有加入到map中
-
Java的优点(面向对象,三大特性:封装、继承、多态)分别体现
37. 访问修饰符的作用范围,为什么要有protected修饰符
JAVA编程语言中受保护的访问修饰符protected分析:http://baijiahao.baidu.com/s?id=1600712630258756747&wfr=spider&for=pc
Java中访问修饰符作用范围:https://blog.csdn.net/dzb641973142/article/details/76178995
38. 接口和抽象类的区别
- Hashmap 底层原理以及get()和put()方法的底层实现,二者区别
40. 参数传递(值传递、引用传递)
Java的参数传递是「值传递」还是「引用传递」?:https://www.cnblogs.com/jiangxin007/p/9076696.html
41. 几百万条长短不一的数组,如何找出他们的公共部分(不会,说的方法很笨,后来问了同学,说
是用set或者Hashmap)
42. SpringMVC的九大组件
【SpringMVC】9大组件概览:https://blog.csdn.net/hu_zhiting/article/details/73648939
43. ORM框架
ORM 框架简介:https://www.cnblogs.com/wisdo/p/4279091.html
ORM框架简介及优缺点:https://blog.csdn.net/orecle_littleboy/article/details/82458956
- IOC的设计原理和高级特性
45. AOP的设计原理
aop的实现原理就是java的动态代理,默认是jdk的动态代理
《Spring设计思想》AOP设计基本原理:https://blog.csdn.net/luanlouis/article/details/51095702
SpringIOC和AOP原理 设计模式 :https://www.jianshu.com/p/40d0a6ad21d2
面试问烂的SpringAOP原理,SpringMVC过程:https://blog.csdn.net/qq_42950313/article/details/83308152
46. FactoryBean和BeanFactory
BeanFactory 简介以及它
和FactoryBean的区别(阿里面试):https://www.cnblogs.com/aspirant/p/9082858.html
47. 理解Spring循环引用(循环依赖)
这篇文章讲的很透彻!!!,我总结了一下
理解Spring循环引用(循环依赖):https://blog.csdn.net/chen2526264/article/details/80673598
循环依赖:
也叫循环引用,即在Spring容器中,将A注入到B中,同时也将B注入到A中。
考虑循环依赖带来的问题,首先分析多种情况排列组合:
- 依赖注入的两种方式:构造器和属性
- bean的作用域:singleton和prototype
- bean的加载方式:立即加载和延迟加载(此处讨论只考虑延迟加载的情况,因为使用延迟加载有时候单例bean的加载顺序会影响创建成功与否)
bean采用立即加载的方式,一定可以加载成功吗
情况罗列:
- 当循环依赖的bean都是使用构造器注入的时候,无论两个bean是singleton和prototype中哪种组合,获取bean都失败(BeanCreationException)
- 当采用属性注入的时候,不同组合不同表现
- 双方都是singleton,那么无论先获取哪个bean都会成功
- 如果都是prototype,无论哪个先都会失败
- 如果一个s一个prototype,必须先获得s才可以成功
- 当同时属性和构造器的时候,只有 两种成功情况
- 两者都是singleton,并且容器启动后,先去获得由属性注入的bean
- 一个s,一个p,其中s是属性注入,p是构造器,容器启动后先获取s
总结:
如果多个bean存在循环依赖,在Spring容器启动后,只有当获取的第一个bean是通过属性注入依赖的singleton时,才会成功,别的情况都会失败
原因
循环依赖会出现:Spring在创建A的时候,发现其引用了B,那么就去创建B。在创建B的时候发现引用了A,再去创建A,两者相互等待,谁都不能成功创建。
1.为什么一定要用属性注入呢?
如果需要打破这个环,就必须保证至少得有一个bean可以在自身依赖没有满足之前就被创建(至少要被实例化,可以先不注入其依赖) ,这种bean只能通过属性注入实现:因为他可以先使用默认构造器创建实例,然后再通过setter注入。如果使用构造器注入方法的话,依赖没有满足之前,没办法实例化。
2.为什么必须得有一个是singleton?
根本原因是:Spring容器只会对singleton的bean保存引用,而不会对prototype保存引用。
具体来说:
Spring容器启动后,先获取SingletonA,那么容器会执行下面几个步骤:
①尝试创建SA,发现是S的生存域并且通过属性注入,那么先使用默认构造器创建一个实例,并保存对其引用,并标记为“SA正在创建中”,发现A依赖B,去创建B
②尝试创建B,发现是S的生存域并且通过属性注入,那么先使用默认构造器创建一个实例,并保存对其引用,发现依赖了A,创建A
③尝试创建A,由于A是S生存域的,spring容器发现有一个SA被标记为正在创建中,那么就不会再去创建,而是直接给B返回①中保存的A的引用
④SA通过属性注入B,B创建完成
⑤SB通过属性注入A,A完成
如果第一个获取的是prototype域的话,不会保存对第一个类对象的引用,那么无法打破循环
3.为什么第一个获取的必须是Singleton
这个和Spring的具体实现有关,当Spring容器遍历那些循环依赖的bean时,只要遍历到那种已经遍历过一次的bean,并且它们不是通过属性注入依赖的singleton时,就会直接抛出BeanCurrentlyInCreationException异常
Spring中Bean的作用域
Spring中Bean的作用域、生命周期:
https://www.cnblogs.com/zhanglei93/p/6231882.html
有五种
Singleton(单例)
48. 快速失败
Java的快速失败和安全失败http://www.cnblogs.com/ygj0930/p/6543350.html
49. 线程池流程,原理
JAVA线程池原理详解一https://www.cnblogs.com/dongguacai/p/6030187.html
- volatile锁
51. callable和哪个类一起用可以知道结果
JAVA并发编程-返回执行结果(Callable和Future)(九):https://blog.csdn.net/hejingyuan6/article/details/47065629
来源:CSDN
作者:HD243608836
链接:https://blog.csdn.net/HD243608836/article/details/103546099