实习面试过程中总结的一些面经。
面筋1
1. 说一下二分查找
二分查找,时间复杂度是lg(n),每次取二分的中间值,然后将查找区间缩小一半,直到最后找到查找值,从二叉树来表示的话,需要查找的次数就是一棵树的树深。n个节点的树,树深为lg(n)
2. 二分查找的条件是什么
条件是查找序列必须是有序的。
3. 说一下平衡二叉树的概念
平衡二叉树,又称为avltree,是搜索二叉树的一种改进,为了避免二叉树的倾斜退化称为链表,影响查找效率,平衡二叉树要求任意两个子树的高度差不能超过1,要么为0,要么为1, 这就可以保证树不会倾斜,退化称为链表。
平衡二叉树插入删除查找的时间复杂度都是lg(n),每次插入删除的时候,如果子树的高度不满足要求,这个时候就会进行旋转操作,左旋或者右旋,保证树的高度差不超过1.
4. 你知道有哪些排序方式
内部8中排序方式,分为选择排序,插入排序,交换排序,归并排序,基数排序
选择排序:简单选择排序,堆排序
插入排序:直接插入排序,希尔排序
交换排序:冒泡,快排
归并:分治法
基数排序:线性排序方法,但是需要额外的空间
5. 归并排序的思想及时间空间复杂度
思想,典型的分治法,把一个问题分为多个独立的子问题,先求得这些子问题,最后将这些子问题合并,拿归并排序来说,归并排序就是把一个序列分为两个序列,再次分为两个序列,如果这两个序列子问题已经排序好,只需要在把这两个序列合并成为一个序列,即可排序好。
时间复杂度:nlg(n)
原址排序:不需要额外的空间
6. 你知道图论算法吗
知道一些,主要有图的最小生成树算法,图的单元节点算法。
图的最小生成树,是判断图中节点遍历一遍,开销最小的算法,其实核心是使用的贪心算法,每次选择最小的路径进行遍历,如果发生了闭环,则跳过当前的最小路径,最后遍历完所有的节点,这种方法是ks算法
图的单元节点算法,是判断图中任意两点的最小距离,使用的是图的广度搜索算法,首先找到最小的路径,按照这个路径进行广度的搜索,将每一个搜索的节点都加上之前的距离,最后得出每个节点到源节点的距离。
7. C语言中内存对齐问题,sizeof(struct {char c; int a;}) = ?
结构体内存对齐,前面的地址要是后面地址的整数倍,不是就补齐,所以这个结构体,显然char要补齐3个字节,后面int也是4个字节,最后就是8个字节。
8. 进程的地址空间分布
操作系统在管理内存时,每个进程都有一个独立的进程地址空间,进程地址空间的地址为虚拟地址,对于32位操作系统,该虚拟地址空间为2^32=4GB。 进程在执行的时候,看到和使用的内存地址都是虚拟地址,而操作系统通过MMU部件将进程使用的虚拟地址转换为物理地址。
进程地址空间中分为各个不同的部分:
(1)由于系统内核中有些代码、数据是所有进程所公用的,所以所有进程的进程地址空间中有一个专门的区域存放公共的内核代码和数据,该区域内的内容相同,且该虚拟内存映射到同一个物理内存区域。
(2)进程在执行的时候,需要维护进程相关的数据结构,比如页表、task和mm结构、内核栈等,这些数据结构是进程独立的,各个进程之间可能不同。这些数据结构在进程虚拟地址空间中一个专门的区域中。
(3)进程在进行函数调用的时候,需要使用栈,于是进程地址空间中存在一个专门的虚拟内存区域维护用户栈。
(4)进程在进行动态内存分配的时候,需要使用堆,于是进程地址空间中存在一个专门的虚拟内存区域维护堆。
(5)==进程中未初始化的数据在 .bss 段 ==
(6)进程中初始化的数据在 .data 段
(7)进程代码在 .text 段
(8)进程执行的时候可能会调用共享库,在进程地址空间中有一个共享库的存储器映射区域,这个是进程独立的,因为每个进程可能调用不同的共享库。
linux系统中进程的地址空间分布如下图所示,其中在32位系统中0-3GB为用户空间,3-4GB为内核空间:
9. bss段的功能
先明确 BSS 段“存放”的是未初始化的全局变量与局部静态变量,此处指的存放是指为其预留空间(占位符)。但BSS段在磁盘上不是真的占用变量大小的空间,它仅是在该段中记录了所有未初始化全局变量与局部静态变量的大小总和,至于每个变量的大小则存储在符号表的size属性中。即:
BSS段内容:无内容,它将在段表中占一个段描述符,该段描述符的size属性将记录未初始化的全局变量与局部静态变量的大小总和
每个未初始化全局对象与静态对象的大小:存储在符号表的 size 属性中
BSS段在加载运行前的处理
当可执行文件加载运行前,会为BSS段中的变量分配足够的空间并全部自动清理(因此,才有未初始化的全局变量的值为0的说法)。
BSS段的作用
BSS段主要是为了节省可执行文件在磁盘上所占的空间,其仅仅记录变量所需的大小。对未初始化的大型数组的节省效率比较明显。
10. 字符串考察
char *str1 = "1";
char str2[] = "1";
str1, str2分别指向什么地方
这个是c语言里面的问题,第一个str1指向了一个常见字符串,处于内存的常量区。
第二个str2是一个数组,数组的指针指向了常量区域的常见字符串1,那么此时数组的第一个值将被初始化称为1。
11. 哪个命令可以查看内存使用情况
top
12. touch有什么用(一定要说两个功能,很多人只知道一个功能)
修改一个文件的时间戳
如果文件不存在,则直接创建一个文件
13.棋盘问题,气数(函数calc计算围棋盘位置(x,y)处的棋子还有多少口气。
某个位置处的棋子还有多少口气的计算方法(简化计算):从该位置出发,向四个方向遍历,允许拐弯,但不允许走斜线。如果遇到边线和对方棋子,则认为不能继续往前走。遍历完成后统计遍历过程中遇到的未落子的位置个数,该位置个数即出发点棋子的气的数目。)
14.结构体内存对齐
(可以回答作用:1.平台移植 2.提高<访问>效率 3.节省存储空间)
15.能不能修改默认对齐数,怎么修改(使用宏:#param pack)
explicit关键字的作用(防止隐性转换和拷贝初始化,然后举拷贝初始化失败的一个例子)
strcpy在栈里拷贝到一个字符数组会出现的情况。(strcpy拷贝过程判断’\0’,字符数组没有该字符时,会把后面地址的数据进行覆盖)
16 对于struct结构体,能不能用memcmp进行内存比较。为什么。
(不能,结构体对齐后,自动填充的字节的内容是随机的)
17 拷贝构造函数的参数不是引用可以吗?
(不可以,函数对于非引用的参数值而言,都会对其在栈内进行拷贝,而对类进行拷贝,又调用了拷贝构造函数,这样会造成无限的调用,直至函数栈溢出)
18 如果是线程池,固定了创建的线程数量,如果每个线程都阻塞了,怎么办。
(我并没有并发开发的经验,但个人根据OS原理:资源分配不合理导致的问题,要么增加系统资源满足任务调用,要么重新分配任务的工作量,减少单个任务的资源占用)
19 如果一个单线程阻塞了一个系统调用,比如read,如何解决。
(使用select函数进行定时读取,多次阻塞无效后,放弃资源,提示应用系统错误信息,交给用户进一步排查;也可以是将read设置为非阻塞)
20 有A B C D四个数字序列,求这四个序列的交集。
内存放不下,没考虑序列中有重复值,被鄙视。(先对数字序列进行排除重复值,然后建立二叉搜索树,节点含藏数值和计数变量,分别输入四个处理后的数字序列,最后统计计数变量为4的数值,就是4个数字序列的交集)
21:struct{char data[0]}这个data表示什么意思(有点像变长数组,类似一个指针使用)
在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。
struct MyData { int nLen; char data[0];};
在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
实际用时采取这样:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
这样就可以通过p->data 来操作这个str。
22: struct结构体
例如:struct {char a:1,char b:1}(位域,同样会有字节对齐问题)
表示a只占一个bit,b只占1个bit
系统调用与函数调用(回答完四点,最好是加上自己的理解,不然就是背课本)
函数库调用 | 系统调用 |
---|---|
在所有的ANSI C编译器版本中,C库函数是相同的 | 各个操作系统的系统调用是不同的 |
它调用函数库中的一段程序(或函数) | 它调用系统内核的服务 |
与用户程序相联系 | 是操作系统的一个入口点 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户时间” | 它的运行时间属于“系统时间” |
属于过程调用,调用开销较小 | 需要在用户空间和内核上下文环境间切换,开销较大 |
在C函数库libc中有大约300个函数 | 在UNIX中大约有90个系统调用 |
典型的C函数库调用:system fprintf malloc | 典型的系统调用:chdir fork write brk |
23、linux信号有哪些(中断、堆栈、段错误、父子进程)
1) | SIGHUP | 连接挂断 | 终止(默认处理) |
---|---|---|---|
2) | SIGINT | 终端中断,Ctrl+c产生该信号 | 终止(terminate) |
3) | SIGQUIT | 终端退出,Ctrl+\ | 终止+转储 |
4) | SIGILL | *进程试图执行非法指令 | 终止+转储 |
5) | SIGTRAP | 进入断点 | 终止+转储 |
6) | SIGABRT | *进程异常终止,abort()产生 | 终止+转储 |
7) | SIGBUS | 硬件或对齐错误 | 终止+转储 |
8) | SIGFPE | *浮点运算异常 | 终止+转储 |
9 | )SIGKILL | 不可以被捕获或忽略的终止信号 | 终止 |
10) | SIGUSR1 | 用户定义信号1 | 终止 |
11) | SIGSEGV | *无效的内存段访问=>Segmentation error | 终止+转储 |
12) | SIGUSR2 | 用户定义信号2 | 终止 |
13) | SIGPIPE | 向读端已关闭的管道写入 | 终止 |
14) | SIGALRM | 真实定时器到期,alarm()产生 | 终止 |
15) | SIGTERM | 可以被捕获或忽略的终止信号 | 终止 |
16) | SIGSTKFLT | 协处理器栈错误 | 终止 |
17) | SIGCHLD | 子进程已经停止, 对于管理子进程很有用 | 忽略 |
18) | SIGCONT | 继续执行暂停进程(用户一般不用) | 忽略 |
19) | SIGSTOP | 不能被捕获或忽略的停止信号 | 停止(stop) |
20) | SIGTSTP | 终端挂起,用户产生停止符(Ctrl+Z) | 停止 |
21) | SIGTTIN | 后台进程读控制终端 | 停止 |
22) | SIGTTOU | 后台进程写控制终端 | 停止 |
23) | SIGURG | 紧急I/O未处理 | 忽略 |
24) | SIGXCPU | 进程资源超限 | 终止+转储 |
25) | SIGXFSZ | 文件资源超限 | 终止+转储 |
26) | SIGVTALRM | 虚拟定时器到期 | 终止 |
27) | SIGPROF | 实用定时器到期 | 终止 |
28) | SIGWINCH | 控制终端窗口大小改变 | 忽略 |
29) | SIGIO | 异步I/O事件 | 终止 |
30) | SIGPWR | 断电 | 终止 |
31) | SIGSYS | 进程试图执行无效系统调用 | 终止+转储 |
24、内存溢出解决
(将要使用的内存超出了允许使用的范围;使用strncpy而不是strcpy)
25、一棵树转换成二叉树(翻车了,不会)
如何将一棵树转化为对应的二叉树?
解答:
1.将 节点的孩子 放在左子树;
2.将 节点的兄弟 放在右子树。
例题:
答案:
延伸:
任何一棵树都可以表示成二叉树,并不是任何一棵二叉树都可以表示成树。那么树多还是二叉树多?
1. 任何一棵树都可以表示成二叉树,结合以上题目很容易理解。
2.不是任何一棵二叉树都可以表示成树:
当根节点包含右子树的时候,就无法表示成树了。
26、如何比较两个结构体是否相等(逐个成员对比,不能使用memcomp)
逐个成员对比,不能使用memcomp,因为存在内存对齐的问题
27. 一共四个人过桥
每个通过桥的时间为1,2,5,8分钟,他们只有一个手电筒,桥每次只能承受两个人的重量,问你怎么过桥最快?换成是一堆人该怎么办?(讲述思路即可,8=5+2+1;一堆人的话,就凑整)
28、 卫星网络中网络带宽足够,但丢包率高,导致网页打不开,通信质量差,什么原因?如何解决?(设备丢包、MTU设置不恰当、网络攻击)
29,什么技术可以代替宏定义
(这其实考的面非常广,看你软件开发的经验,看你对宏技术发展的理解;C++里面可以:const实现常量、inline内联替代宏函数、typedef替代类型定义、条件编译)
面筋2
1.数据库的四大特性
本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别。
如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
2.事务的隔离级别
事务的隔离性,当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种问题:
1,脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。例如:用户A向用户B转账100元,对应SQL命令如下
update account set money=money+100 where name=’B’; (此时A通知B)
update account set money=money - 100 where name=’A’;
当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。
2,不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
3,虚读(幻读)
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
——现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
3.可重复性读是怎么实现的,底层原理
Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的。
这句话的核心,是“但是不能看到其他事务对已有记录的更新”,那么RR隔离级别是怎么保证这一点的呢?
如果数据库并发控制引擎是单纯的封锁协议机制,则应该在读取数据的时候,判断数据项是不是其他事务更新过的。可是InnoDB没有这么做,而是通过如下方式,在RR隔离级别下为事务设置了一个“一致性读视图(即快照)”,之后读取数据,就是根据这个快照来获取,这样,就不能看到他晚于本事务的事务对已有记录的更新(更新生成新版本,必然不在旧的快照所限定的范围内)。
4.数据库的优化
这个优化法则归纳为5个层次:
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)
5.哪些地方适合做索引
频繁查询某个列,但是很少删除插入的地方
6.JAVA的垃圾回收机制
自动回收内存的一种机制
7.STL内存管理,实现机理,多线程的实现
这个allocator是一个由两级分配器构成的内存管理器,当申请的内存大小大于128byte时,就启动第一级分配器通过malloc直接向系统的堆空间分配,如果申请的内存大小小于128byte时,就启动第二级分配器,从一个预先分配好的内存池中取一块内存交付给用户,这个内存池由16个不同大小(8的倍数,8~128byte)的空闲列表组成,allocator会根据申请内存的大小(将这个大小round up成8的倍数)从对应的空闲块列表取表头块给用户。
这种做法有两个优点:
1)小对象的快速分配。小对象是从内存池分配的,这个内存池是系统调用一次malloc分配一块足够大的区域给程序备用,当内存池耗尽时再向系统申请一块新的区域,整个过程类似于批发和零售,起先是由allocator向总经商批发一定量的货物,然后零售给用户,与每次都总经商要一个货物再零售给用户的过程相比,显然是快捷了。当然,这里的一个问题时,内存池会带来一些内存的浪费,比如当只需分配一个小对象时,为了这个小对象可能要申请一大块的内存池,但这个浪费还是值得的,况且这种情况在实际应用中也并不多见。
2)避免了内存碎片的生成。程序中的小对象的分配极易造成内存碎片,给操作系统的内存管理带来了很大压力,系统中碎片的增多不但会影响内存分配的速度,而且会极大地降低内存的利用率。以内存池组织小对象的内存,从系统的角度看,只是一大块内存池,看不到小对象内存的分配和释放。
10.数据库的三级结构模式
数据库系统的模式(Schema)
数据模型中有“型”和“值”的概念,如:学生(学号,性别,班级)是“型”,而:张三(20160310001,1,3年2班)是“值”。
模式(Schema)是数据库中全体数据的逻辑结构和特征的描述,它仅仅描述型,而并不包括值。模式的值称为模式的一个实例(Instance),同一个模式可以有多个实例。
虽然实际的DBMS系统种类很多,他们支持的数据模式不尽相同,使用不同的语言,建立在不同的OS上,数据的存储结构也各不相同,但他们在体系结构上通常具有相同的特征,即采用三级模式结构
数据库的三级模式结构是指:数据库系统是由外模式、模式和内模式三级构成,如图:
1. 模式(Schema)
模式也称为:逻辑模式,它是DB中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。模式层是数据库模式结构的中间层,既不涉及到数据的物理存储细节和硬件环境,也与具体的应用程序、应用开发工具以及高级程序设计语言无关(C、C++、JAVA等)。
模式就是数据库数据在逻辑上的视图,且一个数据库只有一个模式。实际工作中,模式就等同于程序员创建一个具体的数据库的全部操作,如:这是一个MySQL数据库,有2张表,每个表的名字,属性的名字、类型、取值范围,主键,外键,索引,其他完整性约束等等。
DBMS提供模式描述语言(模式DDL)来严格地定义模式。
2. 外模式
外模式也称为:子模式(subschema)/用户模式,它是数据库用户(应用程序员、最终用户)能够看到的使用的局部数据的逻辑结构和特征的描述,是数据库的数据视图,是与某一个应用有关的数据的逻辑表示。
外模式通常是模式的子集。一个数据库可以有多个外模式。同一个外模式可以为某一用户的多个应用系统所使用,但一个应用系统只能使用一个外模式。
外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。
DBMS提供子模式描述语言(子模式DDL)来严格地定义子模式。
3. 内模式
内模式也称为:存储模式(Storage schema),一个数据库只有一个内模式。它是数据库物理结构和存储方式的描述,是数据在数据库内部的表示方式。如:记录的存储方式是堆存储,还是按照某些属性值的升(降)存储,还是按照属性值聚簇(cluster)存储;索引按照什么方式组织,是B+树索引,还是hash索引等等。
DBMS提供内模式描述语言(内模式DDL/存储模式DDL)来严格定义内模式。
13.https是怎么样确保安全性的
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL
Https的作用
● 内容加密 建立一个信息安全通道,来保证数据传输的安全;
● 身份认证 确认网站的真实性
● 数据完整性 防止内容被第三方冒充或者篡改
Https的劣势
● 对数据进行加解密决定了它比http慢
需要进行非对称的加解密,且需要三次握手。首次连接比较慢点,当然现在也有很多的优化。
出于安全考虑,浏览器不会在本地保存HTTPS缓存。实际上,只要在HTTP头中使用特定命令,HTTPS是可以缓存的。Firefox默认只在内存中缓存HTTPS。但是,只要头命令中有Cache-Control: Public,缓存就会被写到硬盘上。 IE只要http头允许就可以缓存https内容,缓存策略与是否使用HTTPS协议无关。
HTTPS和HTTP的区别
● https协议需要到CA申请证书,一般免费证书很少,需要交费。
● http是超文本传输协议,信息是明文传输;https 则是具有安全性的ssl加密传输协议。
● http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
● http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
14.MD5为什么不算是加密算法
不是。MD5 好像是一种散列算法。
根据解释,一般来说:
MD5哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。
当前普遍MD5 算法的哈希值大小为 128 位。
我个人认为,加密算法因该是指那些可以将明文通过一定算法后得到密文,并且可以通过相对应的解密算法和密钥,计算出原来的明文。MD5算法好像不符合这个模式。
16.死锁相关问题及算法,线程同步的问题
已有解释
17.什么是MVC
从图中可以看出,控制器获取到了用户的请求 然后不做任何处理就转发给了模型,模型通过自己的业务逻辑判断,以及对数据库中数据的操作,找到了满足控制器所转发过来的用户请求,假设模型所要提交给视图的请求都和视图有一个虚拟的链接地址,那么每次在模型确定好要传送的已经处理好的用户请求的时候,视图就会对模型的这一请求做出回应,便会将不同的页面展示给用户,然后根据用户的进一步要求继续重复之前的流程。
从个人角度,用大白话来说就是:模型=建筑公司的施工部门;控制器=建筑公司的销售部门;视图=建筑公司的设计部门;
在销售部门成功拉到用户的时候,他会将用户的需求直接交给施工部门,其中需求就包括到底谁要做什么;施工部门在得到销售部门从用户那里得到的请求之后,就会用用户的请求和自己所能承接的项目做对比呀,比如 一个房地产开发商要盖一座别墅,那么施工部门就会判断自己会不会改别墅喽;在施工部门确定好是否能满足用户的需求之后就会把这个决定告诉设计部门,那么就会让设计部门负责把他们所能做的图纸反馈给用户,当然,如果不能做,那就会反馈给用户一张白纸加许多句解释的话呗。如果用户满意了,那么就直接进行这个项目,如果用户觉得图纸上哪个地方有问题,那么久继续重复之前的操作。
MVC是一种设计思想,M代表model,模型。V代表view,视图,C代表controller控制层。M主要是业务层以及数据实体类。V负责与用户交互,前台jsp等。C负责调度分配作用。从浏览器发出请求到收到响应显现在页面的顺序。
a:用户在浏览器输入请求地址:http://主机:端口/应用名/index.do,请求协议是http超文本传输协议。
b:webContent下web.xml中配置访问地址,如果默认welcome-list元素,那么访问默认 页面index.jsp
如果配置servelt和server-mapping元素,那么会自动分发。
c:请求路径通过SimpleHandleMapping类自动匹配到后台的RequestMapping中的路径。如果配置MVC,那么
需要配置mvc驱动。
d:在控制层调用业务层,处理完数据后,返回页面和处理完的数据。
e:页面重定向到页面和配置文件ViewRevoler的拼接,可以使用tiles框架(如果jsp页面过多的情况)
同时将数据也带过去,然后将响应返回浏览器。
f:浏览器显示给用户。
18.机器码的大端存储,小端存储的问题
考虑一个16位整数,它由两个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。
19.循环队里的又来,一定要用顺序表实现吗,可以用链表吗
队列最好的方法就是链表来实现
非要用数组来实现的时候,可以使用循环队列的使用方法。
20,满二叉树和完全二叉树的区别
满二叉树,所有的叶子节点都在最后一层
完全二叉树,所有的叶子节点出现在最后一层和倒数第二层
21.http的状态码
404,没有找打,200 成功,301 转移了,500 服务器错误
面经3
美团面经:
1.linux的启动
首先bios硬件自检,自检通过了之后,bios固件去硬盘第一个扇区MSR中找引导向grub,找到了grub,grub程序负责把内核镜像从硬盘加载到内存中,镜像中init.sh脚本完成系统初始化进程,资源分配等。
2.回溯法dfs:剑指offer的最后两个题,很有代表性