首页 > 转转java岗一二面面经-HR挂
头像
Wannay
编辑于 2021-09-26 16:44
+ 关注

转转java岗一二面面经-HR挂

一面9.15下午5点45(25分钟左右)
1.自我介绍
2.问我挑战杯的硬件项目、问简历上的一个简单后台项目
3.常用的List接口的实现类有哪些?(ArrayList/LinkedList)常用的Set接口实现类有哪些?(HashSet/TreeSet)那前面4个组件中哪些可以放入null?(TreeSet我当时不知道,是不可以放入null的,因为源码中需要使用比较器,遇到null直接抛空指针异常了,其余三个都是可以为null的)
4.假如线程池的corePoolSize为5,maximumPoolSize为10,阻塞队列的长度为5,当有6个线程同时丢进去,会有几个线程在执行?(5个,其中一个任务会在阻塞队列中阻塞)那么要让线程数为10应该多少个任务呢?(应该是15个任务吧)当线程池中的线程数量满了,并且阻塞队列也满了,会发生什么?拒绝。拒绝策略包括哪些?RejectPolicy(抛异常)、CallerRunsPolicy(调用方自己执行run方法)、DiscardPolicy(啥也不做,任务丢进去就给你扔了)、DiscardOldestPolicy(从阻塞队列poll一个,扔了)。
5.HashMap,依次put数字1/2/3/4/5/6作为Key,会发生Hash冲突吗?那么你说一下HashMap的一个put流程?
6.既然使用到Hash,那么你知道HashCode是什么数据类型的吗?肯定是int类型。
7.那么Integer的Hash值是怎么生成的?(我当时确实不知道这个是怎么生成的,后面看了源码,Integer的hash值就是它包装的value)
8.Integer的缓存池默认范围是多少?([-128,127]),它可以修改吗?我记得是不行的,后面看了源码部分发现下限是写死的,上限可以通过JVM参数去进行修改,这个确实不清楚。
9.SpringIOC是怎么做的?Inversion Of Control,依赖反转,将使用对象由自己new一个变成创建让IOC容器帮我们做,我们需要对象直接从容器中注入就行。可以使用Autowired、Resource、Inject等注解。
10.Autowired和Resource注解有什么区别?我回答的是没什么区别,其实都是注入对象,Resource/Inject只是为了实现JSR,Autowired是Spring自家的注解,可能Autowired使用场景会多一些,但是整体没太大差别。
11.你项目中后端给前端返回的数据是json,那么你知道是怎么返回的json吗?回答,使用HandlerAdapter去进行返回值的处理,会用到返回值处理器,如果解析到ResponseBody注解,那么直接就将返回值封装成为JSON到HttpServletResponse。
12.那么你知道Spring中处理JSON是用的哪个组件或者说是jar包吗?这块我知道,SpringMVC中用的是Jackson2,如果导入了Jackson2就会使用这个依赖。
13.那么你知道别的相似的工具吗或者说你还用过哪些?我自己使用用的是FastJson,其它的我暂时没接触过。
14.反问如果我进去之后,主要会接触哪一块?他说你是投的深圳的话,应该是主要接触的质检方面的项目,具体得到时候才知道。

二面9.16中午约的,下午3点半(35分钟左右)
1.自我介绍
2.上来就是一个简单算法:解析一个字符串成为Integer可以使用Integer.parseInt和Integer.valueOf,那么你可以描述怎么解析一个字符串成为整数吗?口述的,使用一个sign去描述正负号,最后结果得*sign,如果字符的ACSII码不是属于0到9之间,那么抛出NumberFormatException,他问我还有吗?我说还得考虑越界的情况,就是数字太长了,有可能比Integer表示的最大范围还大,因此有可能溢出的情况。
3.HashMap不是线程安全的,ConcurrentHashMap是线程安全的,那么ConcurrentHashMap是如何做到线程安全的?synchronized锁头结点,保证get/put每个操作都是原子性的。说一下ConcurrentHashMap的put流程?大概流程其实和HashMap基本一致的,只不过如果桶位为空,得使用CAS设置进去。还有synchronized锁头结点,以及Hash值的计算是高16bit^低16bit&0x7fffffff,因为Hash值为负在ConcurrentHashMap中有特殊意义。
4.你谈一下synchronized和ReentrantLock的区别在哪?我回答的是整体没什么区别,都是遵循管程模型,不过synchronized使用的是偏向锁+轻量级锁+重量级锁的设计,ReentrantLock使用的是轻量级锁+重量级锁,并且在JDK8时会CAS两遍,后面的版本中只会CAS一遍,CAS失败直接就进队列里挂起来了。
5.然后他问我,CAS两次是哪两次?我只记得是一次CAS设置state从0到1,还有一次就是tryAcquire,因为我个人现在使用的是JDK11,我记得CAS只有一次,但是具体是缺了哪一次,当时没想起来,后面发现是第一次CAS设置state被取消了,直接就tryAcquire了。
6.要让某个线程在另外三个线程都执行完之后才继续执行,那么应该怎么做?我说使用CountDownLatch,每个线程执行完时countDown一下。
7.CountDownLatch源码是怎么实现的?我只记得是使用的共享锁去做的,当时有点忘了就说这块确实记不住了,后面完事之后看了一下是创建对象时直接分配了一定数量的共享锁(state),countDown就是去释放一个共享锁。
8.你可以给我说一下你了解的设计模式吗?单例模式、享元模式、策略模式、责任链模式、观察者模式。并举例子,享元模式就是池技术的实现,策略模式可以避免一堆if else,直接一个for循环去使用XXX.support,SpringMVC中就很多很多类似的,责任链模式的话主要是Servlet原生的Filter/SpringMVC中的拦截器以及SpringAOP,观察者模式的话就是监听器之类的。
9.回答到这里被打断了,那么你可以说一下责任链模式是如何控制各个链条之间的执行顺序的?SpringAOP和Filter类似,都是会调用类似一个doFilter方法去继续执行下一条链,在doFilter前后(后面说成before/after)都有方法,相当于像递归一样层层调用,直到最后一个链执行完之后,执行最后就会一层层的return,去执行doFilter之后的after方法,一层层执行回去,也就是实现before方法正向执行,after方法逆向执行的效果。SpringMVC的话是记录了一个索引interceptorIndex,如果某个拦截器执行preHandle方法被return false,那么就会根据interceptorIndex去逆向执行对应的方法,相当于就被拦截下来了,目标方法就不会得以执行。
10.那么你讲一下Spring容器启动的流程吧。我主要说了使用XmlBeanDefinitionReader/ClassPathBeanDefinitionReader去扫描Bean的定义信息,Xml配置文件是在准备Bean工厂时扫描的,注解版的Configuration/Bean/Component注解是在BeanFactoryPostProcesser时去进行扫描的,BeanFactoryPostProcessor有个子接口叫BeanRegistryPostProcessor,它的实现类ConfigurationClassPostProcessor就负责去扫描这些注解版的Bean。然后就是接着去执行普通的BeanFactoryPostProcessor。然后主要就是实例化单实例Bean,经过getBean/doGetBean/createBean/doCreateBean这一套流程去进行实例化单实例的Bean,并执行生命周期的回调方法以及BeanPostProcessor。
11.那么你知道三级缓存吗?三级缓存是解决什么问题的?三级缓存是解决循环依赖问题的,一级缓存存放的是完整的Bean,二级缓存存放的是半成品的Bean,三级缓存存放的是ObjectFactory。在创建Bean时会把半成品的Bean包装成为ObjectFactory放入到三级缓存中,在进行该Bean的注入时就需要从缓存中拿到半成品的对象,如果没有三级缓存的存在,那么因为注入的Bean有可能需要完成动态代理,但是你注入的Bean并没有完成动态代理,就导致了最终注入的Bean是个半成品。二级缓存实际上是可以不需要存在的,每次都直接从三级缓存中拿其实也是可以的,只不过三级缓存中有一堆for循环,每次就导致了性能的降低,因此在完成动态代理之后会将对象从三级缓存中移除,并且加入到二级缓存中,下次就只需要从二级缓存中拿就能拿到完整的对象了。
12.你项目中用到了SpringSecurity,那么你知道SpringSecurity是如何做到的权限检验?如果用户登录成功,就得从数据库查询相关的数据,可以将用户的相关信息以及权限信息都放入Redis中,如果用户下次请求就可以直接从Redis中拿到了,而不用去MySQL中访问。在拿到权限信息之后,就把它放到SpringSecurity的上下文(ThreadLocal)中,接着SpringSecurity在执行后续的操作时就可以完成相关的权限检验,如果不合法就会抛出类似403之类的。
13.SpringSecurity是怎么做到这些功能的?它是实现了一个过滤器链,FilterChain实现Filter接口,把它放入Servlet的过滤器链中,在执行时就执行过滤器链,对这些信息进行检验。
14.你用到了ThreadLocal?是怎么进行使用的?我说并没有使用到ThreadLocal,只是SpringSecurity的上下文是通过ThreadLocal去做的。
15.反问技术栈是什么?说Redis客户端啊、MQ啊、微服务框架啊这些都是内部参照开源框架进行封装的,微服务框架是参照Dubbo进行封装的。


啊啊啊啊!一二面两天完成,我还希望有三面啊!希望别挂我!祈祷祈祷

更新:9.24中午收到9.26的HR面!转转效率真挺高!

9.26---HR面

上午10点HR面下午4点感谢信,再见再见,有缘再见有缘再见!


更多模拟面试

全部评论

(9) 回帖
加载中...
话题 回帖