TCL实业控股股份有限公司社招Java工程师(一)
面试前了解到的公司技术栈要求:
- 参与各微服务的架构设计及研发任务分解、实施
- 负责产品线中间件服务的拆分及优化实施
- 重点参与SpringCloud开源框架的重构及源码性能优化
- JAVA基础扎实,熟悉io/nio、多线程、集合等基础框架,熟悉JVM原理内存控制机制
- 精通Redis/RabbitMQ/ActiveMQ/Kafka等技术的原理,并根据需求进行合理运用
- Netty、Spring Boot、MQTT、Spring Cloud或Dubbo等相关项目经验,主导优化架构设计
- 熟悉Linux基础运维以及Mysql、MongoDB、HBase等数据库
面试相关问题以及个人见解的一些答题思路:
省略一些千篇一律的介绍和寒暄……,……主要技术栈问题如下:
- ArrayList和LinkedList的了解?-------------ArrayList底层使用的是Object数组,所以执行数据的插入和删除元素的时间可能会移动相应的元素。LinkedList底层使用的是双向链表数据结构,所以插入和删除不受元素位置的影响。但对于访问集合中的元素,ArrayList可以根据下标索引序号快速响应,而LinkedList不支持快速随机访问元素。
- HashMap和Hashtable的了解?---------对于不同的JDK版本有着不同的底层结构。HashMap在JDK1.8之前底层是数组和链表结合而成的链表散列。HashMap通过key的hashCode处理得到hash值,然后通过(数组长度-1)&hash判断当前元素存放的位置,如果当前位置存在元素的话,就判断该元素与要存入的元素的hash值以及key是否相同,如果相同的话就覆盖,否则就通过拉链法解决冲突。JDK1.8之后当链表长度大于阀值就转化为红黑树减少搜索时间。至于和Hashtable的对比,从线程安全来说,Hashtable内部的方法经过synchronized修饰……
- 对于上面两个容器的初始值和每次扩充容量大小,以及为什么HashMap的长度是那个规律?--------如果不指定容器的初始值,Hashtable默认为11,每次扩充为原来的2n+1,HashMap默认初始为16,每次扩充为2的幂次方大小。至于为什么是2的n次方规律,和数据均匀分布减少碰撞有关……具体我也说不清。
- HashMap多线程操作会导致什么问题?------没研究过……听面试官的交流会有链表的死循环???没明白。。。
- 谈谈synchronized关键字的理解?-------解决了多线程访问共享资源造成的数据紊乱,所以采用该关键字修饰的方法或者代码块在任何时刻只能由一个线程执行。
- 原子性的理解?锁的理解?--------多线程操作的一系列复合操作,要么全部成功,要么全部失败回到操作前的初始值。锁的加入就是为了防止多线程同时对共享资源的操作造成数据的紊乱……。
- JVM的理解?Java1.8版本有什么了解?------运行于操作系统之上的虚拟机,其体系结构有类装载子系统,运行时数据区(Java栈,本地方法栈,程序计数器,方法区,堆),执行引擎,本地方法接口……等主要组件构成的。在Java7之前,方法区和永久区关联在一起,Java8用元空间代替了永久代,具体可以将堆画个草图出来。
- JVM中ClassLoader类加载器的认识-------负责加载class文件,最好画个草图来阐述……加载流程。以及虚拟机类加载器的几种类别,启动类加载器、扩展类加载器、应用程序类加载器、用户自定义类加载器等
- 什么是OOM?StackOverflowError和OutOfMemoryError?----其实就把堆中对象的生命周期阐述出来即可,比如从伊甸园区创造新对象,伊甸园快满的时候执行一次MinorGC,把剩余的对象移到S1,然后继续创建对象,S1快满的时候执行MinorGC将剩余的对象移到S2,继续,直到移动到老年代中,导致老年代执行FullGC后依然无法进行对象的保存,就激发OOM异常。
- JVM的常用参数调优?--------初始分配大小-Xms -Xmx,最大分配内存-XX:+printGCDetails,……具体的内存占比……
- 内存快照抓取和MAT分析hprof文件?------eclipse memory anayzer插件 设置在oom时导出对到hprof文件……
总结:一面主要是多线程、集合等基础框架,JVM原理内存的一些聊……基础理解和应用为主。
项目的穿插交流这里省略……,……
#TCL##社招##面经##Java工程师#