首页 > 美国留学生PPd面经
头像
血虐哥
编辑于 2019-05-26 20:02
+ 关注

美国留学生PPd面经

第一轮(一个很nice的QA小姐姐)

1. 介绍自己及相关项目

2. 一道简单算法热身,2个排好序的数组,如何取出它们中相同的元素

答:O(N),就是两个数组同时从index = 0开始比较,小的往前进一步,如果相同就加入到res中,这样n步肯定可以走完。所以是O(N)

3. 类是怎么加载的

答:五大步骤:加载、验证、准备、解析、初始化,其中解析根据是静态绑定还是动态绑定, 略... 详见类加载机制,当时在这里看到的,就记了一下

在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。

这里简要说明下Java中的绑定:绑定指的是把一个方法的调用与方法所在的类(方法主体)关联起来,对java来说,绑定分为静态绑定和动态绑定:

  • 静态绑定:即前期绑定。在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。针对java,简单的可以理解为程序编译期的绑定。java当中的方法只有final,static,private和构造方法是前期绑定的。
  • 动态绑定:即晚期绑定,也叫运行时绑定。在运行时根据具体对象的类型进行绑定。在java中,几乎所有的方法都是后期绑定的。
类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类的加载阶段。对于任意一个类,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,也就是说,即使两个类来源于同一个Class文件,只要加载它们的类加载器不同,那这两个类就必定不相等。这里的“相等”包括了代表类的Class对象的equals()、isAssignableFrom()、isInstance()等方法的返回结果,也包括了使用instanceof关键字对对象所属关系的判定结果。

4. GC 的原理

答:没引用的对象就是可以回收的了,不定时选择回收与否, 略...

5. 栈和堆内存的区别

答:

1栈区stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
2
堆区heap)— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3
、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放
4
、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。



6. 永生代是什么,为啥要有这个

答:永久代用于存放静态文件,如Java类、方法等,引用关系比较稳定,一般不进行垃圾管理。但是,有些应用可能会动态生成Class,在有些JVM的实现中会给永生代添加一些必要的回收算法。

7. Spring如何实现AOP和IOC

答:
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的好处

答:根据方法不同判断api的功能,非常方便,略...
  • 透明性,暴露资源存在。
  • 充分利用 HTTP 协议本身语义。
  • 无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度
  • HTTP 本身提供了丰富的内容协商手段,无论是缓存,还是资源修改的乐观并发控制,都可以以业务无关的中间件来实现
  • 答案来自知乎,我觉得不错

    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操作)。

    答:略...小学生题目不会估计就GG了

    哈希表也称为散列表,是根据关键字值(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. 谈谈你的强项和弱项,基于对自己的认识,你打算如何规划你的职业道路?

    答:

    我的优势:

    1. 我本人是一个比较踏实的人,喜欢在做工作的同时通过做笔记和写文章的方式做总结。拿当时学java的时候来说,学的时候做了30万字的笔记。
    2. 我性格外向,擅于和人沟通,我觉得这点在软件开发这种非常依靠团队合作的领域是很重要的。我也非常有责任心,交到我手上的任务我都会非常认真地完成,并且及时汇报给领导。
    3. 我和公司的匹配度很高。我本科电子商务,参加过不少创业大赛和商业大赛,对互联网公司的运营以及战略等都有着自己的理解;硕士计算机科学,有着不少的相关经验,也做了一些项目,对这一领域有一定的总结。公司是互联网金融方向,我觉得真的很match

    未来职业发展规划:

    3年,先踏踏实实地做好自己的工作并产出结果,承担起自己的责任,站稳脚跟。公司也是一个比较大的平台,里面优秀的同事也不少,希望通过不断地追赶他们来提升自己;

    3-5年内,我希望自己可以全面熟悉了解并实践软件开发全流程,对软件架构深入剖析,独立负责软件架构的搭建事务,解决工作中可能会出现的问题。


    10. 你有什么问题要问我的

    答:

    1. 您觉得我进入公司后,需要注意哪些问题呢

    2. 您觉得我如果在我感兴趣的那两个岗位上工作,最重要的工作内容是什么?

    3. 以您扎实全面的技术能力和丰富的职场经验,您觉得我自己还有什么可以提升的地方(双方面)?


    总结:

    1. 两点最重要:1)开放学习成长的心态,2)积极主动
    2. 后端开发的话,一开始协助做好单元和性能测试,做样例sample,先学习,证明有足够能力后,开始自己独立设计和开发小型模块。最重要的内容是打好基本功,写好像模像样的单元测试,养成良好的工程习惯。

    更多模拟面试

    全部评论

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

    近期热帖

    热门推荐