阿里暑期实习生电话面试心得
前不久申请了阿里实习生内推,七号晚上接到电话面试,将过程和心得记录下来供自己和同学参考。(为书写方便,面试官以Q代替,我的回答以A代替,粗体字表示搜索到的参考答案)
Q:同学你好,我是阿里事业部的XXX,方便对你进行电话面试吗?
A:可以的。
【语言相关问题】
Q:好的,首先问一下你主要使用什么语言进行开发?
A:我主要使用java语言进行开发。
Q:ok,那么首先问你一下,java中的静态区,堆和栈分别有什么特点?
A:好的,静态区主要存储了java代码中的静态变量及代码块,只保存一份拷贝。新建对象时,栈中存储了相应引用的标记,指向堆中的具体对象实例;当对象实例化,在堆中产生相应对象的实例,并与栈中引用相对应。能想到的就这些了。
参考答案
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
静态区:
1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
Q:嗯,那么你能举出java中Object类常用的方法吗?
A:我想一下。好的,Object对象常用方法有hashCode()(前几天刚好看了相关代码),equals()方法,getClass()方法等。(equals方法是在得到提示的情况下说出来的,当时有些着急)
参考答案
public boolean equals(Object obj)
比较当前对象与obj是否为同一对象,返回值:ture/false
public String toString()
返回当前对象的字符串表达形式
public native int hashCode();
返回对象的Hash码。Hash码是标志对象的唯一值,Hash码相同的对象是同一对象
protected void finalize()throws Throwable
对象销毁时被调用
以下三个函数用于控制线程
public final native void notify();public final native void notifyAll();public final native void wait();
native型方法指由C++语言编写的方法,Java解释器对其进行转义后才执行。
“==”与equals()
"==" 一般用于基本数据类型比较。若用作两个引用对象比较,仅当引用变量引用同一个对象时,才返回true,否则false。
Q:hashCode()有什么特点以及它的主要原理和equals如何配合使用能大概描述一下吗?
A:我对hash了解不多,从我的理解中,hashCode方法给每一个对象生成了唯一的hash标记;在比较对象是会否相等时,实际上equals方法是比较两个对象的hash码,如果相等则为同一个实例,否则不同。这里应该涉及到深拷贝和浅拷贝的知识了。
参考答案
hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,
例如,java.util.Hashtable 提供的哈希表。
hashCode 的常规协定是:
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,
必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。
从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,
那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。
但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
当equals方法被重写时,通常有必要重写 hashCode 方法,
以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
Q:嗯,没事的,那你能举出几种常用的hash算法吗?
参考答案
1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)
2. 数字分析法
3. 平方取中法
4. 折叠法
5. 随机数法
6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。
即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
A:(还是太紧张了)嗯,我只想到MD5算法,不好意思哈。
Q:好的,请举出避免哈希冲突的几种方法?
A:避免哈希冲突的方法有取余法,增大除数能够增加余数的间隔从而使对象之间的内存距离增大;还可以使用“加盐”算法,增加字符串使得计算的结果更加离散。
参考答案
同上
Q:能阐述一下java序列化的基本原理吗?
A:java的序列化我只是看过基本概念。据我的理解,java序列化是使用stream将对象转化成二进制数据,然后通过传输被接收端接收到再重新组装成对应的对象。
参考答案
Serialization(序列化)是一种将对象以一连串的字节描述的过程;
反序列化deserialization是一种将这些字节重建成一个对象的过程。
【数据结构相关问题】
Q:请举出几种排序算法及时间复杂度
A:我能想到的有选择排序、冒泡排序、快速排序、堆排序,还有,猴子排序(原谅我当时笑场了,对面也笑了);他们的复杂度分别是O(n^2)、O(n^2)、O(nlogn)、堆排序是O(nlogn)。
参考答案
最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n2) O(n2) 稳定 O(1)
快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
选择排序 O(n2) O(n2) 稳定 O(1)
二叉树排序 O(n2) O(n*log2n) 不一顶 O(n)
插入排序
O(n2) O(n2) 稳定 O(1)
堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
希尔排序 O O 不稳定 O(1)
Q:数组和链表的增删改查复杂度有什么区别?
A:数组在内存空间中是连续的,链表是离散分布的,数组增删改查是O(2^n),链表是O(n)
参考答案
数组是连续的内存,对于访问数据,可以通过下标直接读取,时间复杂度为O(1),而添加删除数据就比较麻烦,需要移动操作数所在位置后的所有数据,时间复杂度为O(N)。
链表是物理上非连续的内存空间,对于访问数据,需要从头便利整个链表直到找到要访问的数据,没有数组有效,但是在添加和删除数据方面,只需要知道操作位置的指针,很方便可以实现增删,教数组比较灵活有效率。
【计算机网络相关】
Q:请举例说明TCP传输过程 A:三次握手对吧,嗯,假设有AB两个端点,A作为发送端,B作为接收端。
A向B发送请求,B收到请求之后向A发送响应,A接受到B的响应再次向B发送请求,B收到该请求之后双方建立连接。
发送的请求分别为SYN,SYN/ACK,ACK。
参考答案
http://blog.csdn.net/whuslei/article/details/6667471/
【前端相关】
Q:Http协议版本号现在是多少?
A:是2.0
Q:好的,请列举Http2.0和之前版本的区别?
A:我只知道2.0版本是全面支持了HTML5,其他的不了解了。
参考答案
百度百科 http://baike.baidu.com/link?url=-VQJw1u32tsuSkTsP5qp54hn7iLRVz7H1UgB6BLMljE8cUU7C-WaI11rg4JBvdTnrbboPJcPOAvXntkVJvSP
Q:没事的,你了解前端开发吗?
A:了解一点儿。
Q:嗯,问你几个关于javascript的问题。首先,javascript如何实现面向对象?
A:javascript本身并不具备面向对象,它通过prototype原型链实现继承,可以通过new的方式建立函数对象,实现面向对象。
参考答案
http://blog.csdn.net/yueguanghaidao/article/details/9747033
Q:javascript本身不具有模块化编程方法,请列举几个实现模块化js的框架或者方法。
A:我所了解到的javascript MVC 框架有react.js,angular.js,backbone等。
【操作系统相关】
Q:请说明线程和进程的区别
A:进程是运行中的程序,每一个进程之间拥有各自的资源,是程序运行的最小单元;线程是进程的子集,多个线程共享资源,是资源分配的最小单元。(这里被对面提示协程是进程间的关系,属于我的回答漏洞)
参考答案
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。
进程与线程的区别
线程与进程的区别归纳:
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.调度和切换:线程上下文切换比进程上下文切换要快得多。
d.在多线程OS中,进程不是一个可执行的实体。
【回答不全或不了解的问题】
Q:java8在内存上和6,7有何区别?(我只说出GC方面有变化,因为之前只关注了语言本身的变化)
参考答案:
只搜索到这个答案,如果有别的详细的答案请留言告知,不胜感激 https://www.zhihu.com/question/40543936
Q:说出常见的进程调度算法(我只说出了银行家算法)
参考答案:
先来先服务(FCFS, First Come First Serve)
时间片轮转法
多级反馈队列算法(Round Robin with Multiple Feedback)
最短进程优先
最短剩余时间优先
最高响应比优先
Q:说出MySQL常用引擎及其实现方式?(我给出了InnoDB和B+树的答案)
【补充】
面试结束之后我问对面的面试官有什么给我的建议,我说我有些东西不了解,应该怎么做。
面试官说,电话面试本身不要求面试者回答出全部问题,因为在校生主要是接触书本的东西,有些东西不了解可以理解,后续还有面试,让我做好准备。
心得总结
1.首先一定要诚实,能想到多少说多少,不会的话直接说不会,面试官会理解的;
2.如果暂时想不出答案,可以让面试官给出适当的提示,面试官一般是不会为难你的;
3.平静心态,组织好语言,我就吃了这个的亏。接到电话时候是在教室自习,比较突然,刚开始有些东西没有说明完整,后来就好些了。
4.大公司的面试更加注重基础知识的考察,因此对数据结构,算法相关,操作系统,计算机网络等投入较大精力是没错的。这次面试也暴露了我对相关知识掌握不扎实,需要加强学习和理解。