1.面向对象和面向过程的区别,面向对象的三个特性,并解释
2.C++和python的区别
编译型 解释型
C++是一种静态的语言,需要在编译时确定变量类型,代码段用大括号分割,语句结尾用分号,相比较,python是一种动态语言,可以在运行时确定变量类型,采用缩进标志代码块,语句结尾不需要有分号。内存管理:python有垃圾自动回收机制,使用垃圾自动收集器管理内存,c++需要程序员自己管理内存;
c++是编译型语言,python是解释型语言,二者分别为:
编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较高;解释型语言每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。参考
python是解释执行的,和物理机CPU之间多了解释器这层,而C++是编译执行的,直接就是机器码,编译的时候编译器又可以进行一些优化。因此在运行效率上,C++要远好于python
(解释器就是高级语言的转换器)解释器是一种翻译程序,是一种能够执行用其他计算机语言编写的程序的软件,例如python解释器,
编译和解释的区别:编译会将所有程序代码一次性转换为机器可以执行的指令,而解释是转换一行运行一行,边转换边执行。
3.http和https的区别
http中文名叫超文本传输协议,https中文名叫超文本传输安全协议,工作在应用层,规定了浏览器和服务器之间的通信规范,常采用TCP连接。
(1)前者以明文的方式传输消息,后者https就是http+ssl加密,与http相比能够提供对网站服务器的身份认证,保证数据传输的隐私和完整性。
(2)http协议默认端口号为80,https默认端口号为443。
(3)在具体传输方式与效率方面,http只需要进行三次握手与服务端进行连接即可发送数据,客户端和服务端之间总共交换3个包,而https除了TCP连接的三次握手还有ssl的9个包。
(4)https就是建立在ssl/tsl加密协议上的http,因此比http更消耗服务器资源
下图是https加密的工作原理
4.http请求的结构体是怎样的,method包括哪些
http请求包括:请求行 首部行(请求报头) 空行和请求正文(消息主体) 四个部分
请求行的内容:请求行包含请求方法,URL和协议版本,中间以空格隔开,URL的作用就是把请求定位到服务端要处理请求的地址,协议版本是HTTP的版本号,请求方法包括get post等。
首部行内容及格式:首部行为请求行增加了一些附加信息,由“名: 值”对组成,名和值之间使用冒号+空格连接。
首部行有以下几种报头:普通报头、请求报头、响应报头、实体报头。
空行是位于首部行和请求正文中间的,标志着首部行的结束。
请求正文:一般用于http的post方法,通过实体报头规定消息主体的格式和内容。
以下为http请求报文结构:
以下为http响应报文结构:状态行、响应头、空行、响应正文
状态行包括协议版本、状态码和原因短语
响应头包括搭建服务器的软件、发送响应的时间、响应数据的格式等信息
响应正文就是响应的数据
5.说一下知道的排序算法以及他们的复杂度和稳定性
6.某个项目中登录功能是怎么实现的
7.递归和for循环哪个效率更高
for循环效率高。递归涉及到在栈中分配空间来保存参数、返回的地址和临时变量,向栈中压入数据和弹出数据都会花费时间,并且如果递归的层数太深还可能出现栈溢出。此外,递归会涉及到大量重复计算,影响性能。
8.链表与数组的区别
存储结构:数组在内存中连续,使用数组前要事先规定数组大小,数组元素实际被存储在堆中,但其引用变量存储在栈中;链表在堆上分配内存,采用动态内存分配的方式,支持动态增加和删除元素,需要注意内存泄漏。
访问效率方面:数组在内存中顺序存储,可以通过下标访问,访问效率高;链表在内存中不连续,只能通过遍历来访问,访问效率低。
插入和删除:数组插入和删除需要移动相应节点后的所有元素,链表的插入删除非常简单,不需要移动节点,只需要改变相关节点中的后继节点指针即可,和节点实际存储位置无关。
9.sleep wait join yield 哪个方法会释放锁?-->wait join, join底层调用了wait. wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
线程有五种状态:新建new,就绪runnable,运行runing,阻塞blocked,死亡dead
阻塞状态是指 线程因为某种原因需要放弃CPU使用权,暂停或运行,阻塞时,线程不能进入排序队列,只有当阻塞的原因消除后,线程才转化为就绪状态并转入就绪队列中等待,当再次获得时间片后从上次中止的地方继续运行。从阻塞状态只能进入到就绪状态。
线程阻塞的原因有三大类:1.A线程需要锁,但该锁被其他线程占用,A线程进入到等待锁的阻塞队列,这种情况只有当某个线程释放该锁的时候才能唤醒A线程,notify不会唤醒该线程;
2.正在占用锁的线程调用了wait()方法,就会进入wait阻塞队列,只有obj.notify()通知该线程后,才会唤醒这个队列中的线程,普通的释放锁操作不能唤醒该线程;
3.正在执行中的线程调用了join() sleep()或IO就会进入另一个线程阻塞队列,睡眠时间到或者IO结束,线程才会继续进入到就绪状态。join()作用是阻塞主线程。当线程调用另外一个线程的join方法时,当前线程就会进入阻塞状态。直到另外一个线程执行完毕,当前线程才会由阻塞状态转为就绪状态。sleep方法不释放锁。
yield方法,会使当前线程放弃使用CPU时间片,把机会让给相同或者具有更高优先级的线程。但是当前线程不会阻塞,而是直接进入就绪状态,随时获得CPU时间片后再次执行。可以看出yield方法是不释放锁资源的。
标签:http,请求,记录,python,面试,线程,https,报头 From: https://www.cnblogs.com/yz-lucky77/p/17467950.html