本人Java岗,最近面的都是一些中小型企业,大厂还在筛选和笔试阶段(估计凉了......)面完感觉得稍微做个总结,基本上问到一个点都能扩展开来,问来问去都是那些。有一些可能忘了,想到什么就写什么。
String类相关1、String和StringBuffer、StringBuilder的区别
String有final修饰,不可变;后两个可以通过append()函数追加字符串;StringBuilder加了synchronized关键字,是线程安全的;
2、final修饰的引用是引用不可变还是对象不可变
是引用不可变;
3、== 和 equals 的区别
基本数据类型的话 == 比较数据,引用的话 == 比较地址;equals是个函数,可重写,以String为例,它重写了equals方法:先通过 == 比较引用,若不一样则对比字符串是否一致。
集合类相关1、ArrayList 和 LinkedList的区别
前者是基于数组,支持随即查找,查询效率高;后者基于链表,插入和删除更快。
2、HashSet 的数据结构
底层通过HashMap实现,add() 进去的数其实是放在 key 的位置上,value 是一个常量。
3、HashMap数据结构
HashMap 1.7和1.8不同,1.7使用数组加链表,使用头插法,容易造成环形链表死循环(参考:https://www.iteye.com/blog/zl378837964-2357460);1.8使用数组加链表加红黑树,使用尾插法
4、HashMap的线程安全
线程不安全,多线程情况可以使用 ConcurrentHashMap,ConcurrentHashMap 1.7使用分段锁;1.8 使用CAS+synchronized ,效率更高
多线程相关1、Java 多线程有几种状态
new、runnable、blocked、waiting、time-waiting、terminated
2、run()和start()
run() 一般写逻辑处理的代码;start() 是使一个线程处于就绪状态
3、Java多线程实现
(1)实现Runnable接口;(2)继承Thread类;(3)实现Callable接口;(4)线程池创建
4、线程池参数
corePoolSize:核心线程数;maxPoolSize:最大线程数;keepAliveTime和unit:多余线程存活时间;workQueue:任务队列;threadFactory:线程工厂;handler:拒绝策略
它的过程:有几个任务同时过来,当不超过corePoolSize,则由核心线程处理;再来几个任务,往workQueue放,如果大于workQueue,启动其他线程;当任务数 > maxPoolSize + workQueue,则使用handler拒绝策略拒绝任务。
数据库相关1、inner join 和 where 的区别
where 会产生笛卡尔积,临时表太大
2、平时怎么用索引
将经常查询的、where中用到的、排序用到的字段建立索引;在写查询语句的时候,通过 explain 执行计划查看索引效果,进行修改优化
3、一张表最多建几个索引?
16个。索引会存在磁盘上,若太多的话占用磁盘大;插入操作受到影响。
Spring相关1、AOP
AOP基于动态代理实现了面向切面编程,一般用于事务和日志;动态代理主要有两种:JDK自带的基于接口的动态代理的Proxy、CGLib基于子类的动态代理
2、IoC
控制反转,将创建和管理对象的控制权交给Spring容易,降低耦合
3、SpringMVC的流程
(1)客户端的请求给到 DispatcherServlet ;
(2)DispatcherServlet 调用 HandlerMapper,查询 HandlerAdapter 并给 DispatcherServlet;
(3)DispatcherServlet 调用 HandlerAdapter 适配相应的 Controller;
(4)Controller 处理完业务逻辑返回 ModleAndView 给 DispatcherServlet;
(5)DispatcherServlet 将 ModleAndView 给 ViewResolver ,解析生成 View ;
(6)DispatcherServlet 进行渲染。