华为社招od面经
1.闲聊
流程:投简历,机试,性格测试,两轮技术面,HR面&部门总管面
目前状态:面完部门面,等待后续。。。希望通过。。))
2. 机试
机试就在牛客网上做,牛客网有一个华为的题库,可以提前去做做。我的建议是做一下前面的十几题熟悉一下输入输出就好了。题目的话其实我不太记得了,重点是字符串,我考了两题字符串,要熟悉字符串的基本操作。然后第三题就是一题比较普通的DFS,可以去LeetCode把各种常见的算法都稍微了解一下,做一两道例题,通过应该不难的。
3.性格测试
跟华为正式招聘的要求是一样的,可以百度一下,当时在知乎看到一个回答,大概了解一下华为喜欢哪些性格就好。最重要的还是不要前后矛盾。。
4.技术一面
1.两道编程题,树的数据结构+前序遍历,生产者和消费者的多线程模式(一开始用AtomicInteger,面试官说会自旋会导致CPU100,我说用sleep,面试官说不符合题意。最后我换成了synchronized,里面对锁使用wait跟notifyAll,解决了自旋的问题)
2.介绍自己,这几年的情况 (如实回答)
3.HashMap是如何存储数据的(我答了哈希数组之后,还把put的流程都讲了一遍。。)
4.Spring的主要特性(IOC跟AOP的概念)
5.对数据结构和算法的理解(把列表,链表,各种树,算法说一遍)
6.为什么需要多线程,如何理解的(答了充分利用CPU算力,然后问我如何利用,我说阻塞的时候可以切换到其他线程继续执行)
7.如何避免内存溢出(JVM参数是否合理,是否存在死循环创建了大量对象,是否存在内存泄漏,用完的引用要及时清理)
8.对软件开发流程的理解(答了IT项目管理跟UML的开发流程,获取需求,需求分析,概要设计,详细设计,编码,项目计划等)
总结:编程题有点难度,主要没想到会考多线程,不过还是写出来了,常见的多线程考题要熟悉。后面问的都比较浅显,所以就还好。
5.技术二面
1.平时项目是否有用到多线程(没有
2.如何实现线程同步(答了synchronized,ReentrantLock,CAS。应该再加一个ThreadLocal,还有原子类AtomicInteger)
3.线程池的重要成员变量(我答了整个框架,Executor顶级接口,ExecutorService次级接口,ThreadPoolExecutor实现类,成员变量包括工厂ThreadFactory,阻塞队列Block Queue,三个关键大小的变量corePoolSize,maximumPoolSize,poolSize)
4.有没有学过Java调优(没有
5.面向对象的设计原则(6大原则,忘了很久没有看这题了,只记得单一职责了。。)
6.SpringBoot相比Spring的优势(配置简单,去XML,代码简洁,便于集成各种框架,适合构建微服务)
7.项目构建和管理工具,常用的是maven跟gradle,用过吗(maven)
追问:maven里的核心是pom.xml,里面有什么重要标签(答了dependencies,里面有dependency,版本号可以用parent统一设置,也可以用properties去设置变量,还有plugins,导入maven的插件工具)
再追问:那dependencyManagement呢,跟dependencies有什么区别?(我说忘了,但在写微服务demo的时候用过,记不清)
再追问:那多个模块之间,他们的依赖如何管理(我说了打包成war然后import。但是没有答到具体的依赖如何处理)
再追问:有没有用过Gradle(没有
8.了解过终态吗,知道是什么吗(完全不知道
9.微服务相比传统项目的特点和优势劣势?(分成各个模块,每个模块都是一个完整的项目,有自己的数据库,高内聚。逻辑清晰,可拓展性好。但出错的时候难以定位错误,面临分布式事务,分布式部署的挑战。)
10.微服务一般有很多组件,说一说你知道的有哪些(Eureka,用于发现服务。Feign,用于统一参数还有负载均衡。Hystrix,熔断器,用于降级防雪崩。事后发现忘记说网关层gateway了,应该还有一个zuul,还有Config)
11.Vue和jQuery有什么区别
12.JDK1.8有哪些新特性(lambda简化匿名内部类,接口default方法,流操作stream函数式编程,Optional类简化了处理null值)
13.编程题,最长连续严格递减序列的长度(是连续序列,一开始看错了是子序列,然后发现更简单了,最后用一维dp数组去解决,现在细想其实一个变量就可以了,O(1)空间复杂度),要用assert断言去判断。
总结:编程题不难,但前面问得比较广,很多东西都没有准备,然后直接就问到了。所以表现不太好。。本来以为直接挂了,但HR说补了一次技术面。
6.技术三面
1.面向对象的特点?(答了继承,多态,封装)追问什么是多态(答了一种类型多种实现,动态绑定),Object和其他类的关系(Object是所有其他类的超类)
2.对多线程的理解?(答了看过多线程的源码包括如何实现多线程,继承Thread,实现Runnable,Callable,看了线程池架构的源码,对ThreadPoolExecutor有认识)追问线程池里有哪些重要的成员(corePoolSize,maximumPoolSize,poolSize,ThreadFactory,Blocking Queue,RejectionHandler等。)
3.SpringMVC里的MVC是什么意思?(答了MVC设计模式,说了model,view,controller的解耦思想)追问我有没有看过SpringMVC的源码(我说没有,但我知道它的底层原理是通过DispatcherServlet去处理页面映射,数据格式的处理等等)
4.MyBatis项目启动之后,数据库发生了修改,这时候应该怎么办?(我说修改Mapper)追问如何修改,我说不会,面试官说这部分是热部署相关,要去了解一下~
5.对算法的理解(我说常见的算法都会,各种排序算法等)追问哪些排序算法的时间复杂度是nlogn(答了归并,堆,快排,并且稍微讲了一下如何实现)追问能否自己写出来(可以)
6.堆数据结构的理解,关于数组,链表,队列,Java有哪些常见的实现类(答了ArrayList,LinkedList,PriorityQueue,还顺便讲了一点点底层实现原理,然后顺口说了一下用LinkedList去实现栈)
7.那Map呢,Java里Map的多线程实现类,是什么,讲一下它的实现原理(答ConcurrentHashMap,讲了1.7用分段锁,数据均匀分布到Segments数组上。而1.8放弃了分段锁,使用和HashMap一样的哈希数组,但因为多线程环境下,全局变量都设置成了volatile防指令重排,还有nextTable也成为了全局volatile变量等等的,现在回想忘记说sizeCtl变量了。然后说底层主要使用了synchronized跟cas操作,现在回想应该再补充一下synchronized的锁升级,所以升级到1.8直接使用了synchronized。但当时这道题已经答了很多了,我看差不多得了,就没继续说了,打算如果追问的话再说。)
8.微服务是什么(跟二面一样的问题,不过这次有准备,所以答得更从容~)
9.SpringCloud和SpringMVC的区别(这题不是很懂,我说MVC主要就是处理页面的映射,而Cloud是微服务相关,一个服务调用另一个服务等等的)
10.编程题,给定一个字符串数组,对它进行去重,而且结果集要从小到大排序,排序的时间复杂度要为O(nlogn),不能直接用JDK自带的各种sort方法。(去重直接用HashSet就解决了,排序一开始想用PriorityQueue偷懒,但感觉不太好。于是自己写了个快排,跟整数快排唯一的区别也就是判定大小用compareTo方法~)
总结:三面感觉还好,问得比一面细,但又没有二面那么难。。
7.HR&部门面
聊了各种个人情况。。希望能有后续