第一轮(一个很nice的QA小姐姐)
1. 介绍自己及相关项目
2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素
答:O(N),就是两个数组同时从index = 0开始比较,小的往前进一步,如果相同就加入到res中,这样n步肯定可以走完。所以是O(N)
3. 类是怎么加载的
在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。
这里简要说明下Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起来,对java来说,绑定分为静态绑定和动态绑定:
- 静态绑定:即前期绑定。在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。针对java,简单的可以理解为程序编译期的绑定。java当中的方法只有final,static,private和构造方法是前期绑定的。
- 动态绑定:即晚期绑定,也叫运行时绑定。在运行时根据具体对象的类型进行绑定。在java中,几乎所有的方法都是后期绑定的。
4. GC 的原理
答:没引用的对象就是可以回收的了,不定时选择回收与否, 略...
5. 栈和堆内存的区别
1、栈区(stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
2、堆区(heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
6. 永生代是什么,为啥要有这个
答:永久代用于存放静态文件,如Java类、方法等,引用关系比较稳定,一般不进行垃圾管理。但是,有些应用可能会动态生成Class,在有些JVM的实现中会给永生代添加一些必要的回收算法。
7. Spring如何实现AOP和IOC
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection, 依赖注入)来实现的。
AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程。要理解AOP首先得弄明白***的概念。对于***看下点击打开链接这篇文章。
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。 AOP 实现的关键就在于 AOP 框架自动创建的 AOP ***,AOP ***则可分为静态***和动态***两大类,其中静态***是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP ***类,因此也称为编译时增强;而动态***则在运行时借助于 JDK 动态***、CGLIB 等在内存中"临时"生成 AOP 动态***类,因此也被称为运行时增强。
8. 平常开发管理代码用什么方法,Git clone 还是 Git branch,解释一下它们的区别
答:平常用Git branch,就是按照功能,bug修复开分支,不断merge, 略...
9. 解释RESTful的好处
10. 遇到的困难和如何解决的
答:略...
11. 你有什么问题要问我的
答:内心。。没啥要问的哈哈哈😂,略...
第二轮(一个很严谨的后端开发小哥哥)
1. 45分钟做了一套java试题(20单选,2编程,2问答)
反馈:说我做得还可以
1. 介绍自己及相关项目
2. 简单解释下面向对象的基本概念:继承、封装和多态
答:
- 继承就是说现在有一个类A,我们如果想要有更多的有着相同功能的类,那么只要继承最开始的这个类A,我们就可以拥有跟类A一样的功能,根据自己条件的不同还可以对A的方法进行重写或者重载
- 封装使得内部功能和外部隔离开来,一来安全,二来可以更加具有模块化
- 多态就是说,类似于Father f = new Son();这种,这种可以用于任何时候我们想应用更加specific功能的时候,此时多态就产生效果了。嗯,多态其实就是基于同一个接口,使用不同的实例就可以使用不同的功能
3. Java应用程序有没有可能内存泄露?具体场景。如果有一个Java应用程序在生产上发现有内存泄漏问题,作为开发人员你打算如何对其进行问题定位?现在就有这么一个程序,代码也给到你,你怎么弄?流程思路?
答:第一印象是使用测试工具,先进行模块化检测,我一般手动,注释掉一部分然后检查,采用二分法,一般可以定位到,然后仔细检查下代码逻辑,看看会不会有长期不用的对象仍然被引用着。我觉得工业上肯定会有很多高级工具可以检查内存,但是目前我还没有使用过
4. 简单讲讲哈希表的数据结构和算法(get/put操作)。
哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构。也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度。这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表。比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize。
哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我们该如何去处理冲突呢?一种方法是开放地址法,即通过系统的方法找到数组的另一个空位,把数据填入,而不再用哈希函数得到的数组下标,因为该位置已经有数据了;另一种方法是创建一个存放链表的数组,数组内不直接存储数据,这样当发生冲突时,新的数据项直接接到这个数组下标所指的链表中,这种方法叫做链地址法。
5. 如果有一个100G的大文件(假定文件里头都是一行行的字符串记录、每个记录约100个字符),要求对这个文件进行排序,请给出你的排序算法。
答:过程讨论持续15分钟,先后给出3种方法不断优化。
- 我们可以先遍历所有行,根据每行的前3个字符作为键放到一个hash结构中,这样问题已经可以用O(N^2*lgn)解决了。被否决,有可能前三个字符都是一样的,需要对整个字符串进行排序
- 或者我们可以先搞一个Trie树,然后遍历一遍全部存好,每一最后字符再多存一个数字表示这一字符串出现次数,然后对这个Trie树进行层次遍历,依次append,返回。回复说文件有100G大小,假设你手头电脑只有8g内存。嗯嗯,我可能会采用先把所有的文件分开很多份分别处理,关键在于最后怎么合并起来还是有序的
- 其实就是外部排序,先将这个大文件分成很多份,把这些子文件依次读入内存,并利用自定义的有效的内部排序方法(也就是我的方法吧)对它们进行排序,再将排序后得到的有序子文件重新写入外存;可以使用多路归并排序。
6. 谈谈你对软件研发生命周期过程的理解,如何确保软件的质量。
答:生命周期主要有问题定义,可行性分析,系统架构设计,编码实现,测试,验收,最后维护。至于确保软件的质量,就是要选用好的,合适的软件生命周期模型。 大概模型有瀑布模型,螺旋模型,快速原型模型。
- 需求明确,使用瀑布模型;
- 需求很不明确,快速原型模型;
- 项目不确定性太多使用螺旋模型
7. 你是如何管理自己的时间的?举一个你设定并达成目标的例子。
答:略...
8. 你如何理解领导力?举一个由你主动牵头推进的事情。
答:略...
9. 谈谈你的强项和弱项,基于对自己的认识,你打算如何规划你的职业道路?
我的优势:
- 我本人是一个比较踏实的人,喜欢在做工作的同时通过做笔记和写文章的方式做总结。拿当时学java的时候来说,学的时候做了30万字的笔记。
- 我性格外向,擅于和人沟通,我觉得这点在软件开发这种非常依靠团队合作的领域是很重要的。我也非常有责任心,交到我手上的任务我都会非常认真地完成,并且及时汇报给领导。
- 我和公司的匹配度很高。我本科电子商务,参加过不少创业大赛和商业大赛,对互联网公司的运营以及战略等都有着自己的理解;硕士计算机科学,有着不少的相关经验,也做了一些项目,对这一领域有一定的总结。公司是互联网金融方向,我觉得真的很match。
未来职业发展规划:
前3年,先踏踏实实地做好自己的工作并产出结果,承担起自己的责任,站稳脚跟。公司也是一个比较大的平台,里面优秀的同事也不少,希望通过不断地追赶他们来提升自己;
3-5年内,我希望自己可以全面熟悉了解并实践软件开发全流程,对软件架构深入剖析,独立负责软件架构的搭建事务,解决工作中可能会出现的问题。
10. 你有什么问题要问我的
1. 您觉得我进入公司后,需要注意哪些问题呢
2. 您觉得我如果在我感兴趣的那两个岗位上工作,最重要的工作内容是什么?
3. 以您扎实全面的技术能力和丰富的职场经验,您觉得我自己还有什么可以提升的地方(双方面)?
总结:
- 两点最重要:1)开放学习成长的心态,2)积极主动
- 后端开发的话,一开始协助做好单元和性能测试,做样例sample,先学习,证明有足够能力后,开始自己独立设计和开发小型模块。最重要的内容是打好基本功,写好像模像样的单元测试,养成良好的工程习惯。
全部评论
(2) 回帖