面试基础-语言基础篇



1.指针和引用的区别

他们都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名;

引用没有 const,指针有 const,const 的指针不可变;

引用不能为空,指针可以为空;

“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;



2.堆和栈的区别

  • 1 申请方式

栈: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间;

堆: 需要程序员自己申请,并指明大小,在c中malloc函数;

  • 2 申请大小的限制

栈:是连续空间,window应该是2M,如果申请的空间超过栈的剩余空间时,将提示stack overflow。因此,能从栈获得的空间较小。

堆:堆获得的空间比较灵活,不用是连续空间,也比较大。

  • 3 申请效率的比较:

栈由系统自动分配,速度较快。但程序员是无法控制的。

堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。



3.python多线程和多进程的区别

python中提供两个标准库thread和threading用于对线程的支持;

相比较于threading模块用于创建python多线程,python提供multiprocessing用于创建多进程。

对一个进程而言,不管有多少线程,任一时刻,只会有一个线程在执行。对于CPU密集型的线程,其效率不仅仅不高,反而有可能比较低。python多线程比较适用于IO密集型的程序。对于的确需要并行运行的程序,可以考虑多进程。

一个程序的执行实例就是一个进程。线程是操作系统能够进行运算调度的最小单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。

同一个进程中的线程共享同一内存空间,但是进程之间是独立的。

同一个进程中的所有线程的数据是共享的(进程通讯),进程之间的数据是独立的。



4.jdk和jre还有jvm的区别

JDK:java development kit (java开发工具)

JRE:java runtime environment (java运行时环境)

JVM:虚拟机;

Jvm < jre < jdk



5.抽象类和接口的区别

抽象类是对事物的抽象化,包括这个事物的面貌,行为等属性综合的抽象,抽象类为什么不能被实例化。接口是对这个事物行为的抽象化。

报警器的例子,所有的报警器都要报警,但不是所有的都要开门关门。把alarm()独立在接口中.

构造函数:抽象类可以有构造函数;接口不能有。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。



6.python中list set 的区别,底层实现

列表:被实现为长度可变的数组;连续的存储空间,以偏移量计算取得元素,不必遍历所有元素;既要要求是连续存储,又可以存储不同类型的数据,那么其用的就是元素外置的方式,存储的只是地址的引用;

字典:伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构;

set本质也是dict,只不过其键值都一样,如果索引相同,说明要么数据重复了,要么key发生了hash碰撞,这时候就去比较两个key对应的value是否相同,如果也相同,确认是数据重复。



7.Python全局解释器

每一个 Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。
当然,CPython 会做一些小把戏,轮流执行 Python 线程。这样一来,用户看到的就是“伪并行”——Python 线程在交错执行,来模拟真正并行的线程。



8.Python装饰器

实质: 是一个函数

参数:是你要装饰的函数名(并非函数调用)

装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器

类比装饰器模式



9.c语言的编译过程

预处理器->编译器->汇编器->链接器



10.Python 中的__new__和__init__的区别

相同点:

  • 二者均是Python面向对象语言中的函数;

不同点:

  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。

  • 也就是: __new__先被调用,__init__后被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

原文地址:https://www.cnblogs.com/Superorange/p/14702190.html