2018年3月28日 阿里巴巴电话一面
当天下午4点左右,阿里巴巴从浙江杭州打来的电话:0571-28223456 ,一开始我没接到,5分钟后我才发现这个电话(提醒:手机一定不要静音,随时保证能接到电话),当我发现后就立即打回去,幸运的是,能够接通,阿里的接线系统还是很智能的,主动提示5分钟前有打我电话,并且自动转接到那个电话。接通之后我解释了一下,面试官语气很和蔼,主动提出给我打过来,我表示要花2分钟拿纸和笔,实际上我还拿了电脑,机智吧!
alibaba后台开发工程师面试题
接下来就是面试内容:
面试主要分为三个部分:基础知识、项目内容和实习经历、应聘岗位相关知识和其他
一:基础知识
面试官会问你主要熟悉的语言,我是学C++的,然后他就开始问C++相关的知识,我主要问到了:
A: C++的指针和引用的区别:
指针是一个对象,这个对象里存储的是它所指向的另一个对象的地址。引用其实是一个对象的别名,引用是必须在初始化时与对象绑定,而且一经声明,就不能再更改绑定到其他对象。
问题引申:
指针定义:值为地址的变量。
指针的运算:两个基本的运算符:&(取址运算符)和*(间接访问运算符/解引用指针),除此之外,还有加减算数运算,关系运算(== 和 !=),以及指针的类型转换:强制类型转换和C++类型转换操作符 static_cast<类型>(表达式) ,注意:void类型指针 void * pVoid 可以从任意类型的指针赋值(强制转换)而来。
指针分类:根据所指对象类型区分:int、char、double、class等,还有 nullptr 指针 和 void *指针; 常量指针(指向常量的指针) 和 指针常量(该指针是常量);
常量指针: const int * p ; 特点就是 const 是对 int 的修饰,说明所指对象是一个int 型常量。
指针常量: int * const p ; 特点就是 const 是对 * 的修饰,说明该指针是个常量。
升级问题:迭代器(iterator)和指针(pointer)区别:STL 容器类的 iterator 迭代器是类模板,它可以遍历容器内的全部或者部分元素,本质是封装了原生指针,提供了
比指针更高级的行为,可以成为智能指针,有++,-- ,->,*等操作,一共分为输入迭代器(input iterator)、输出迭代器(output iterator)、前向迭代器(forward iterator)、双向迭代器(bidirectional iterator)、随机存取迭代器(random access iterator)。
在范围上,pointer 属于 iterator 的一种(random access iterator)
在功能上,iterator 有着比 pointer 更细的划分并对应能力不同的功能(重载不同的运算符)
在行为上,iterator 比 pointer 更统一和良好的用法(更轻易使用 begin()、end()且不用担心越界)
B:面向对象的三个基本特征:封装、继承、多态
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。
实现多态,有二种方式,覆盖,重载。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。
多态的作用是什么呢? 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。
C:C++内存管理:存储内容:
静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在,有编译器在编译的时候分配(数据段(存储全局数据和静态数据)和代码段(可执行的代码/只读常量))。
栈:保存局部变量。栈上的内容只在函数范围内存在,当函数运行结束的时候,这些内容也会自动销毁。其特点是效率高但是空间大小有限。
堆:由malloc系列函数或者new操作符分配的内存。其生命周期由free和delete决定。在没有释放之前一直存在,直到函数结束。其特点是使用灵活,空间比较大,但容易出错。
值得注意的一点是:代码段中存储的是可执行的代码和只读常量,很多人看到代码段就认为里面只有代码,数据段里面才是存储数据的,其实不是这样的。
内存申请和释放:
malloc和free函数是一一对应的,如果malloc两次但是只free一次就会存在内存泄漏,如果malloc一次但是free了两次,就会出错
我们知道c++是兼容c的,那我们明明已经有了malloc和free来进行动态内容的管理,为什么c++还要定义new和delete运算符来动态管理内存。
实际operator new/operator delete 只是malloc和free的一层封装。
来看一下它们之间的区别和联系:
1.它们都是动态管理内存的入口。
2.malloc/free是c/c++标准库的函数,new/delete是c++操作符。
3.malloc/free只是动态分配/释放内存空间。而new/delete出来分配空间还会调用构造函数和析构函数进行初始化与清理。
4.malloc/free需要手动计算类型大小且会返回void*, new/delete可以自己计算类型的大小,返回对应类型的指针。
我们在c++中是允许进行重载的,那我们也可以重载一下new和delete,我在这就不做了(其实new和delete是不能重载的,即使你进行了重载,也只是重载了operator new和operator delete)。
new和delete在内存中所做的事
new做的事: 1.调用operator new分配空间 2.调用构造函数初始化空间
delete做的事: 1.调用析构函数清理对象 2.调用operator delete释放空间
new[N]做的事: 1.调用operator new分配空间 2.调用N次构造函数分别初始化每个对象
delete做的事: 1.调用N次析构函数清理对象 2.调用operator delete释放空间
用一张图来解释:
D:sleep()和wait()这两个方法的区别
1、sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.
2、而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞
3、区别:
sleep()和wait()函数的区别:
(1)两者比较的共同之处是:两个方法都是使程序等待多少毫秒。
(2)最主要区别是:sleep()方法没有释放锁。而wait()方法释放了锁,使得其他线程可以使用同步控制块或者方法。
(3)sleep()指线程被调用时,占着CPU不工作,形象的说明为“占着CPU”睡觉。
sleep(2000)表示:占用CPU,程序休眠2秒。
wait(2000)表示:不占用CPU,程序等待2秒。
引申:挂起和阻塞区别:
(1)挂起是一种主动行为,因此恢复也应该要主动完成。而阻塞是一种被动行为,是在等待事件或者资源任务的表现,你不知道它什么时候被阻塞,也不清楚它什么时候会恢复阻塞。
(2)阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或者信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高,就永远轮不到其他任务运行。一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。
程序状态变化图:
E:进程和线程的区别
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。进程是资源的分配单位,线程是CPU在进程内切换的单位,线程属于进程。
接下来是场景问题:
I-面试--超大文件取交集:问题:现有两个各有20亿行的文件,每一行都只有一个数字,求这两个文件的交集。
我的回答:1.先将文件进行排序(外存排序),然后对两个文件中的数选一个hash函数,能将数据集范围的整数分到若干个桶中,每个桶中落入的数的个数能够内存处理即可 2. 每个桶内进行常规求交集即可
此题牵涉到外存排序:外排序分两个步骤:预处理和合并排序。先将文件分段;然后利用内部排序方法(快排,归并,堆排序等),将每一段排序成为顺串,生成后写入外存。这样外存上就得到了m个顺串。最后,对这些顺串进行归并,使得其长度逐渐增大,直到所有带排序的数字成为一个顺串为止。
外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。
第二部分:问的项目相关内容和实习内容
问:1、项目具体内容和分工;2、你负责的部分简单描述,分析其中的难点和收获;3、实习的具体工作职责和成效;4、实习收获到的知识。
第三部分:问测试相关的知识,这块问得比较浅,比如说平时用什么工具测试
你是通过何种渠道获得这次面试机会的?
答:校园招聘
整个面试花费了多长时间?(从接到面试消息到得到结果)
答:7天
面试形式包括哪些?
答:电话面试
你觉得这次面试的难度如何?
答:难度一般
你对这次面试的整体感觉怎么样?
答:很好
这次面试的结果如何?
答:面试未得到工作
alibaba工资待遇 共15 条
alibaba面试经验 共 20 条