前 言
3 月 6 日成功内推进入阿里巴巴校园招聘系统,内心颇为激动,但深知自身能力仍欠缺,所以踏实耕耘提升自身实力。
3 月 9 日完成在线测评和在线编程题,在线测评主要考察:快速阅读能力、归纳总结能力、速算能力、突发事件处理能力,就是所谓的综合素质能力吧;在线编程题只有一道,难度算中等吧,常去牛客网刷题的同学应该都比较有思路去解决编程题。
当天晚上就接到阿里巴巴面试官的电话,由于第一次电话面试,虽然小心脏有点紧张,但是也没有忘记记录下面试官问到的几个问题,本文权当记录下面试经历,为自己总结经验的同时也供各位准备校园招聘的同学参考。
电话面试
(1) 自我介绍
前言
这里我就是简单介绍了下自己在校的经历,让面试官对自己有个大致的了解。
当然,面试之前,面试官都有了解我们的简历以及在阿里巴巴校园招聘系统填写的信息。自我介绍是向别人展示自己的一个重要手段,自我介绍好不好,甚至直接关系到给别人的第一印象的好坏及之后发展的顺利与否。
听过“首因效应”木有,就是第一印象效应,面试官极有可能根据面试开始的几分钟得到的印象,便已决定了面试的结果。
所以,把握住面试的自我介绍环节,绝对是面试成功的必要手段。
直接让应聘者描述自己的能力、特点和个性的问题,主观意识太强,有可能是不真实的。
因此,面试官当然不会仅从表面去判断,他经常带着要进一步考察的目的而认真听着。
下面介绍下一般准备 自我介绍 的时候面试官对应聘者的考察内容以及应聘者需要重点突出的关键点(校招、社招同样)
考察内容[1]:
- 考察应聘者的逻辑思维能力、语言表达能力及提炼概括能力。
- 考察应聘者口述内容与递交简历是否一致,表达口吻是否真诚自信。
- 考察应聘者的时间掌控能力,对介绍内容的时间分配是否得当。
- 扩展了解,通过行为问题进一步考察应聘者的工作经历及专业技能。
当了解了”自我介绍”这个环节的目的,我们就知道了如何去准备好这个环节。
自我介绍时的内容构成并没有一定固定的模式,只要能够主动、全面地表达自己则为佳。可把握重点突出的原则
重点突出[1]
- 你过去做过什么?(经历、技能、业绩)
1.突出经历: 重点描述放在近 2 年,或是与现应聘岗位同行业性质的工作经历上。
2.突出技能: 通过具体事例说明,在工作经历或项目中表现的专业知识、核心技能。
3.突出数字: 呈现个人业绩,多介绍与应聘岗位工作内容相关、类似的业绩。
- 你现在来做什么?(动机、匹配、选择)
1.职业切换: 即跳槽的原因,客观真诚,从职业规划方面出发。
2.岗位匹配: 推销自己,从对方的需求出发,以招聘要求为基础,展现你的优势与匹配度。
3.选择原因: 对应聘公司的了解,包括企业文化、规模、产品、渠道等等,表达你的关注。
- 你将来准备做什么?(目标、贡献、期望)
1.发展目标: 转换环境后想要达到的目标,要具体、合理,近期内可达成。
2.企业贡献: 你能带来什么新的东西,你能注入什么新的理念。
3.期望未来: 你期望得到的是什么,你渴望的平台是怎样的。
(2) 聊一下以往项目
当时第二个问题就是问:让我印象深刻的一个项目以及从中的收获,这也是阿里巴巴校园招聘系统里面回答过的一个开放性问题:
2.请介绍你参与的印象最深刻的一个项目,为什么? 并且介绍你在项目中的角色和发挥的作用:
印象最深刻的一个项目是大一参加的物联网比赛,这个比赛也是进入大学以来参加的第一个比赛;从报名参赛的懵懂到商讨参赛作品的困惑再到决定最终方案的坚定,这个过程考验着我们每一个成员的耐心以及创造力和想象力。
本次比赛的作品是:基于Zigbee的温室大棚监控系统
我担任这次的比赛的队长,根据每个成员的兴趣以及能力进行项目分工,我自己负责 PC 端监控系统。由于当时只学过 C++,查阅相关文献得知 PC 端一般是使用 QT、C#、MFC 等桌面程序,又由于比赛时间紧急,最终选择使用 MFC 来开发本系统的 PC 端监控软件。虽然选择了 MFC,但是我根本没接触过 MFC,尽管如此,我依然坚信我可以在短时间内学习使用 MFC 以及把学到的运用在这次的比赛中。
半个月的时间,我边学 MFC 边开发监控系统,同时还得和负责硬件的队友协商数据包格式,调试监控系统和硬件设备的通信。
第一次在短时间内快速的学习一项没接触过的技术 MFC,加上比赛时间得压迫感,然而最终实现目的,这让我印象很深刻,让我知道我有快速学习的能力。
也正是这次比赛经验,我不再为自己设限,我相信只要敢想,没什么是不可能的,这为我后来的学习提供了很大的帮助,至少在信心上。
此外,比赛过程也培养了我查阅文献的能力,明白了团队沟通的重要性。
面试时候回答的和上面差不多。
(3) 面试官提出的问题
(1) 谈一谈 final 修饰符
可以修饰 class、field、method 等,被 final 修饰的类不可继承,被 final 修饰的 field 不可修改,被 final 修饰的 method 不可重写。
(2) 集合类的特性
面试的时候只回答了如下:
List: 元素有序 可重复
set: 存储无序的,不可重复的元素 相当于高中的“集合”概念
map: map 的主要实现类是 hashmap
HashMap 是基于哈希表实现的,每一个元素都是一个 key-value 对;
扩展问题
- hashMap 底层实现原理
- hashMap 存取数据时间复杂度
(3) String 类能继承吗?
不可以,因为 String 类是被 final 修饰符修饰的,所以不能被继承。
(4) 2x8 运算提高速率
效率上看,使用移位指令有更高的效率,因为移位指令占 2 个机器周期,而乘除法指令占 4 个机器周期。
从硬件上看,移位对硬件更容易实现,所以会用移位,移一位就乘 2,这种乘法当然考虑移位了。
移位操作指令是一组经常使用的指令,属于汇编语言逻辑指令中的一部分,它包括移位指令(含算术移位指令、逻辑移位指令),循环移位指令(含带进位的循环移位指令),双精度移位指令三大类。其功能为将目的操作数的所有位按操作符规定的方式移动 1 位或按寄存器 CL 规定的次数(0~255)移动,结果送入目的地址。目的操作数是 8 位 (或 16 位)的寄存器数据或存储器数据。
(5) 单例模式,有什么类是单例
面试官问,有什么类是单例的,我真心想不起来哪些是单例类,但是我自己会使用单例模式进行实际开发,所以就简要介绍下单例模式的使用。
查了下,JDK 中的单例类有:
- java.lang.Runtime 类
- java.lang.reflect.Proxy 类
(6) 线程调度
这里就主要问多线程调度、操作系统线程相关的概念问题。
多线程有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口
同步的实现方面有两种,分别是 synchronized 实现互锁,wait 与 notify 实现线程通信。sleep() 方法执行后线程进入阻塞状态:阻塞状态是需要外界激活,可能是时间, 可能是满足某一条件,他才能激活运行,就算 CPU 有空闲,也需要满足条件才会执行。
yied() 方法执行完后线程进入就绪状态:就绪状态是只要 CPU 有空闲随时都可以执行,处于就绪状态
Thread 类的 setPriority 函数可以设置优先级。
(7) java 中有内存泄露吗
java 理论上是不存在内存泄露,因为有垃圾回收器(GC)对内存进行释放。
实际上,Java 也存在内存泄露,原因:主要是一些对象虽然不在被使用,但他们依然被引入(例如被长生命周期对象引用);
(8) 垃圾回收机制
什么情况下无法回收对象
主要是一些对象虽然不在被使用,但他们依然被引入(例如被长生命周期对象引用);
android 中 比如,静态类中有 activity 变量
静态变量的生命周期和应用程序一致。
(9) 有 NDK 开发经验不
由于只是简单的使用 NDK 开发了“Hello World”,所以直接回答面试官说自己没经验,只是简单运行过 DEMO。
(10) 静态变量、成员变量
成员变量 属于对象,所以也称为实例变量。
静态变量 属于类,所以也称为类变量。成员变量 存在于堆内存中。
静态变量 存在于方法区中。成员变量 随着对象创建而存在,随着对象被回收而消失。
静态变量 随着类的加载而存在,随着类的消失而消失。成员变量 只能被对象所调用 。
静态变量 可以被对象调用,也可以被类名调用。
所以,成员变量 可以称为对象的特有数据,静态变量 称为对象的共享数据。注意:静态方法中只能调用静态变量,不能调用非静态变量
因为类初始化的时候先加载静态方法,但是非静态变量这时候还没初始化,所以编译就会报错。
(11) Excption 与 Error 区别
Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的状况;
Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
(12) 子类能重写父类的构造函数吗
子类 不可以 重写 父类 的 构造方法,因为构造方法是父类特有的,子类根本继承不了父类的构造函数,所以子类不可以重写父类的构造方法。
但是可以使用关键字 super 调用父类的构造方法。
(13) 四个权限修饰符
(14) hashMap 存储的时间复杂度
这个问题问答的不好,因为没有了解过这个,面试后 google 了一下这个问题,似乎网上关于这个问题的介绍也很少:
HashMap 是基于哈希表的,在 O(1) 跟 O(n) 之间,HashMap 中 get(Object key) 时间复杂度是 O(1),
TreeMap 是基于平衡二叉树的,为 O(logn) ;C++ 中是 log2(N)
(15) 堆、栈、方法区
Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配;对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。
静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
栈区 :当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
堆区 : 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
总结
第一次面试,大概聊了 40 分钟,整个过程表现得略紧张。
面试官问的问题基本都是 java 基础、多线程、垃圾回收等重要且必须掌握的知识点。
总体感觉回答的不是很好,面试准备的不够充分,再接再厉吧,通过这次电话面试,明白务实基础才是最重要的。
以上列出的面试问题的回答并不完善,只是简练的作答而已,建议根据这些问题查阅更多的资料深入学习各个知识点。
参考文献:
后话
欢迎关注我的微信公众号