记录一下最近面试的总结

本人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 进行渲染。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsppy.html