2020阿里测开暑期实习3.30一面

感觉太久没面试了,面试的时候有点慌,全程20分钟左右,感觉要凉了 :relieved:

视频面试:

  1. 自我介绍
    简单个人信息+比赛经历+训练营经历+实习经历
    2.平时用什么语言多
    说主要用C++(其实很菜。。。),Java也了解
    3.Java和C++区别
    Java和C++的区别:
    (1). Java是解释型语言,所谓的解释型语言,就是源码会先经过一次编译,成为中间码,中间码再被解释器解释成机器码。对于Java而言,中间码就是字节码(.class),而解释器在JVM中内置了。
    (2). C++是编译型语言,所谓编译型语言,就是源码一次编译,直接在编译的过程中链接了,形成了机器码。
    (3). C++比Java执行速度快,但是Java可以利用JVM跨平台。
    (4). Java是纯面向对象的语言,所有代码(包括函数、变量)都必须在类中定义。而C++中还有面向过程的东西,比如是全局变量和全局函数。
    (5). C++中有指针,Java中没有,但是有引用。
    (6). C++支持多继承,Java中类都是单继承的。但是继承都有传递性,同时Java中的接口是多继承,类对接口的实现也是多实现。
    (7). C++中,开发需要自己去管理内存,但是Java中JVM有自己的GC机制,虽然有自己的GC机制,但是也会出现OOM和内存泄漏的问题。C++中有析构函数,Java中Object的finalize方法。
    (8). C++运算符可以重载,但是Java中不可以。同时C++中支持强制自动转型,Java中不行,会出现ClassCastException(类型不匹配)。

4.C++内存管理

(1)、栈区:函数中定义的局部变量放在栈中,函数执行结束时存储单元自动释放。栈内存分配一般采用寄存器来存取,存取效率高但是内存容量有限。
(2)、堆区:通常在堆中进行动态分配。程序运行的时候用new或malloc申请一定大小的内存,用delete或free释放之前申请的内存。不管内存空间在何时申请,只要没有用delete或free释放该内存空间就一直被占用着。也就是说,动态内存分配的变量的生存周期由程序员自己决定。程序利用new或malloc申请了一块内存,用完之后没有释放掉,这样这块内存就失去了控制,这就造成了内存泄露。
(3)、全局代码区:这块内存区域存放的是全局变量、static变量。内存在程序编译的时候就已经分配好,在程序的整个运行期间都存在。在C语言中,全局变量区又分为初始化的和未初始化的。在C++中没有这种区别,它们共同占用这块内存区域。
(4)、常量区:存放的是常量,不允许修改。
(5)、程序代码区:存放整个程序的代码。注意,数据和代码是分开存储的。

Java内存区域划分:
(1).栈:
在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配。栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
(2).堆:
通过new生成的对象都存放在堆中,对于堆中的对象生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理。优点是可以动态分配内存大小,缺点是由于动态分配内存导致存取速度慢。
(3).方法区:
是各个线程共享的内存区域,它用于存储class二进制文件,包含了虚拟机加载的类信息、常量(常量池)、静态变量(静态域)、即时编译后的代码等数据。
1).常量池:
常量池在编译期间就将一部分数据存放于该区域,包含以final修饰的基本数据类型的常量值、String字符串。
2).静态域:
存放类中以static声明的静态成员变量。
3).程序计数器
当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。

5.学校成绩
6.数据结构
7.叫我提问问题

转发自:https://www.nowcoder.com/discuss/395901?source_id=discuss_experience_nctrack&channel=-1