国企面试基础知识

好多知识都面试问过,在面工行 招商 光大 农行 移动 中信 人寿的时候…(ง •̀_•́)ง

1.httphttps区别

HTTPS=HTTP+(加密+认证+完整性保护)

HTTP URLhttp:// 开头,而HTTPS URL https:// 开头

HTTP 是不安全的,而HTTPS 是安全的

HTTP 标准端口是80 ,而HTTPS 的标准端口是443

OSI网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层

HTTP 无法加密,而HTTPS 对传输的数据进行加密

HTTP无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书

HTTP 无法验证数据报文的完整性,可能被篡改

2linux常见的命令(压缩和解压缩,创建文件)

cd命令切换当前目录

ls命令查看文件与目录

-l :列出数据串,包含文件的属性与限数据等

-a :列出全部的文件,藏文件(开头为.的文件)一起列出来(常用)

-d 列出目本身,而不是列出目的文件数据

-h :将文件容量以的方式(GBkB等)列出来

-R 同子目的内容一起列出(递归列出),等于下的所有文件都会示出来

grep命令该命令常用于分析一行的信息

find命令 是一个基于查找的功能非常强大的命令

cp命令 copy之意,它还可以把多个文件一次性地复制到一个目录下

mv命令该命令用于移动文件、目录或更名,move之意,它的常用参数如下:

rm命令该命令用于删除文件或目录

ps命令 该命令用于将某个时间点的进程运行情况选取下来并输出。查看一个程序是否运行

tar命令该命令用于对文件进行压缩与解压缩。 压缩tar–zcf 解压缩tar -zxf

cat命令该命令用于查看文本文件的内容

vim命令 该命令主要用于文本编辑

time命令该命令用于测算一个命令(即程序)的执行时间。

Pwd 当前工作目录的绝对路径

kill 终止线程

touch 创建文件

mkdir创建文件夹

rmdir 删除目录(此目录是空目录)

chmod命令该命令用于改变文件的权限,

tail 查看日志文件

vim是所有UnixLinux系统下标准的编辑器,

编辑器删除一行的操作是dd

3.deletetruncate drop区别

4.tcpudp区别

1)连接方面区别TCP面向连接(如打电话要先拨号建立连接)。UDP是无连接的,即发送数据之前不需要建立连接。

2)安全方面的区别TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,即不保证可靠交付。

3)传输效率的区别TCP传输效率相对较低。UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。

4)连接对象数量的区别TCP连接只能是点到点、一对一的。UDP支持一对一,一对多,多对一和多对多的交互通信。

基于TCP的应用层协议有:SMTP简单邮件传输协议、TELNETHTTPFTP

基于UDP的应用层协议:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(简单文件传输协议)等。

5.线程间通信方式

方式一:使用 volatile 关键字

基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式

方式二:使用Object类的wait() notify() 方法

众所周知,Object类提供了线程间通信的方法:wait()notify()notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。

6.什么是线程间的通信

线程通就是多个线程同操作一个源,但是操作的作不同

7.线程和进程区别

进程:是系统进行分配和管理资源的基本单位,一段运行的程序

线程:进程的一个执行单元, 是进程内调度的实体、是CPU调度和分派的基本单位, 是比进程更小的独立运行的基本单位。线程也被称为轻量级进程, 线程是程序执行的最小单位。

1)进程是资源分配的最小单位,线程是程序执行的最小单位。

2)进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。

3)线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

4)但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

10.cookiesession区别

1cookie数据存放在客户的浏览器上,session数据放在服务器上

2cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑*到安全应当使用session

3)单个cookie保存的数*据不能超过4K,很多浏览器都限制一个站点最多保存20cookie

4session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE

所以:将登信息等重要信息存放SESSION;其他信息如果需要保留,可以放在COOKIE

11 webstorage

webStorage html5 提供的本地存储方案,包括两种方式:sessionStorage

localStorage。相比 cookie 这种传统的客户端存储方式,webStorage 有许多优点:

ü   保存在客户端,不与服务器通信,因此比 cookie 更安全、速度更快

ü   存储空间有限,但比cookie 大(5MB)

ü   仅支持 String 类型的存储内容(和cookie 一样)

ü   html5 提供了原生接口,数据操作比cookie 方便

localStorage

持久化的本地存储,浏览器关闭重新打开数据依然存在(除非手动删除数据)。应用场景:长期登录、判断用户是否已登录,适合长期保存在本地的数据。

sessionStorage

浏览器窗口关闭后数据被销毁。应用场景:敏感账号一次性登录

12.线程有哪几种状态

线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。

第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态;

第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态

第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend等方法都可以导致线程阻塞。

第五是死亡状态。如果一个线程的run方法执行结束,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪状态。

进程状态:

一般来说,进程有三个状态,即就绪状态,运行状态,阻塞状态。

运行态:进程占用CPU,并在CPU上运行;
就绪态:进程已经具备运行条件,但是CPU还没有分配过来;
阻塞态:进程因等待某件事发生而暂时不能运行;

13.说出5种排序算法

简单选择、快排、冒泡、归并、插入

14. http的三次握手和四次挥手:

浏览器在给服务器传输数据之前,有三次握手,握手成功之后,才可以传输数据

1)浏览器需要先发送SYN码,客户端请求和服务器建立连接;

2)服务器接收到SYN码,再发送给客户端SYN+ACK码,我可以建立连接;

3)客户端接收到ACK码,验证这个ACK是否正确,如果正确则客户端和服务端则建立起数据连接;双方的数据发送通道都将开启;

四次挥手:

1)当客户端无数据要传输了,会发送FIN码告诉服务器,请求关闭连接;

2)当服务端接收完毕后,告诉客户端ACK码,我收到你的关闭连接请求了;

3)服务器发送一个FIN给客户端,请求关闭连接;

4)当客户端接收完毕之后,客户端同样发送ACK码,服务端关掉连接,客户端等了一会没有回复,也关闭连接;

三次握手和四次挥手的好处:确保数据的安全和完整

15、为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACKSYNACK起应答作用,而SYN起同步 作用)放在一个报文里来发送。但关闭连接时,当服务端收到客户端的FIN报文通知时,它仅仅表示没有客户端数据发送给你了;但未必服务端所有的数据都全部发送给客户端了, 所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给客户端之后,再发送FIN报文给客户端来表示你同意现在可以关闭连接了,所以它这里 的ACK报文和FIN报文多数情况下都是分开发送的。

16、什么是缓存?

缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行。

17、写出三种缓存策略

1.FIFOFirst In First out):先见先出,淘汰最先近来的页面,新进来的页面最迟被淘汰,完全符合队列。

2.LRULeast recently used:最近最少使用,淘汰最近不使用的页面

(3)   .LFU(Least frequently used: 最近使用次数最少, 淘汰使用次数最少的页面

18、缓存会导致什么问题?

1 缓存存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会直接去数据库层进行查询,从系统层面来看像是穿透了缓存层直接达到db,从而称为缓存穿透,没有了缓存层的保护,这种查询一定不存在的数据对系统来说可能是一种危险,如果有人恶意用这种一定不存在的数据来频繁请求系统,不,准确的说是攻击系统,请求都会到达数据库层导致db瘫痪从而引起系统故障

缓存穿透业内的解决方案已经比较成熟,主要常用的有以下几种

bloom filter:类似于哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。

2)缓存雪崩:在普通的缓存系统中一般例如redismemcache等中,我们会给缓存设置一个失效时间,但是如果所有的缓存的失效时间相同,那么在同一时间失效时,所有系统的请求都会发送到数据库层,db可能无法承受如此大的压力导致系统崩溃。

交错失效时间:这种方法时间比较简单粗暴,既然在同一时间失效会造成请求过多雪崩,那我们错开不同的失效时间即可从一定长度上避免这种问题,在缓存进行失效时间设置的时候,从某个适当的值域中随机一个时间作为失效时间即可。

3)缓存击穿:实际上是缓存雪崩的一个特例,大家使用过微博的应该都知道,微博有一个热门话题的功能,用户对于热门话题的搜索量往往在一些时刻会大大的高于其他话题,这种我们成为系统的“热点“,由于系统中对这些热点的数据缓存也存在失效时间,在热点的缓存到达失效时间时,此时可能依然会有大量的请求到达系统,没有了缓存层的保护,这些请求同样的会到达db从而可能引起故障。击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。

方法:二级缓存:对于热点数据进行二级缓存,并对于不同级别的缓存设定不同的失效时间,则请求不会直接击穿缓存层到达数据库。

19.泊松分布中lambda参数是什么含义?
泊松分布的参数λ是单位时间(或单位面积)内随机事件的平均发生率。

6.二叉树层次遍历用到的数据结构是什么?

队列

9.在网页地址栏输入网址,按回车之后都完成了哪些过程

1. 域名解析

2. 发起TCP3次握手

3. 建立TCP连接后发起http请求

4. 服务器端响应http请求,浏览器得到html代码

5. 浏览器解析html代码。

6 浏览器对页面进行渲染呈现给用户

15.二叉树有几种遍历算法,时间复杂度是多少?

非递归版:

由于不管是先序遍历还是中序遍历以及后序遍历,我们都需要利用一个辅助栈来进行每个节点的存储打印,所以每个节点都要进栈和出栈,不过是根据那种遍历方式改变的是每个节点的进栈顺序,所以时间复杂度为O(n),同样空间复杂度也为O(n)n为结点数。层序遍历是通过队列来进行每个节点的存储打印的,所以时间复杂度和空间复杂度也与前三种遍历方式一样。

递归版:

空间复杂度与系统堆栈有关,系统栈需要记住每个节点的值,所以空间复杂度为O(n)。时间复杂度应该为O(nlogn),每个节点都要遍历到,需要n次,而且需要将二叉树划分logn次,所以递归版的遍历的空间复杂度为O(nlogn)

16.不稳定性是啥?快排是稳定的吗,为什么不稳定

在排序之前,有两个数相等。但是在排序结束之后,它们两个有可能改变顺序.

不稳定的。

在选取一个数出来分组的时候,如果选到了A,那么在B<=A的情况下,B将会排在A的前面.比如序列为5 3 3 4 3 8

18.如何创建线程

1)继承Thread类创建线程

2)实现Runnable接口创建线程

3)使用CallableFuture创建线程

4)使用线程池例如用Executor框架

下面让我们分别来看看这四种创建线程的方法。

19.sql攻击

sql攻击就是通过把SQL命令插入到(Web表单提交或输入域名或页面请求的)查询字符串,最终达到欺骗服务器执行恶意的SQL

select id from users where  password = '"  + password +"'" 这里password都是我们存取从web表单获得的数据。

防止方法:

(1) prepared statement

(2) 正则匹配

网站代码里写入过滤sql特殊字符的代码,对一些特殊字符进行转化,比如单引号,逗号,*,(括号)AND 1=1 、反斜杠,select union等查询的sql语句都进行安全过滤,限制这些字符的输入,禁止提交到后端中去。

3)字符串过滤

比较通用的一个方法

25.集合有哪几种

集合类型主要有3种:set()list(列表)map(映射)

1)、List(有序、可重复)

List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。

2)、Set(无序、不能重复)

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

3)、Map(键值对、键唯一、值不唯一)

Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。

26.异常机制

throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是ErrorRuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。

throw语句:throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。

抛出异常:如果程序中出现了异常,没有办法将具体的异常打印出来,不做任何处理

捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的Log

27.回收机制

JAVA内存回收算法,主要采用的方式有两种,一种是标记计数器方式,一种是根目录搜索法。

标记计数器方式,是对每一个对象如果被引用,则标记计数器加1,解除引用,则标记计数器减1。当一个对象标记计数器为0时,则回收此对象。但这种方式存在问题,假如两个对象存在交叉引用,则对象值为null时,则无法回收此对象。

而采用根目录搜索法,是从一个根目录对象开始搜索,如果某个对象不可达,则此对象可以回收。

信息安全:

28 对称加密 非对称加密总结

对称加密:AB 之间之间的通讯数据都用同一套的密钥来进行加密解密。

优点:简单快捷,密钥较短,且破译困难。

缺点:如果用户一旦多的话,管理密钥也是一种困难。不方便直接沟通的两个用户之间怎么确定密钥也需要考虑,这其中就会有密钥泄露的风险,以及存在更换密钥的需求。

对称加密通常有DES,IDEA,3DES 加密算法。

非对称加密:用公钥和私钥来加解密的算法。打个比方,A 的公钥加密过的东西只能通过A 的私钥来解密;同理,A 的私钥加密过的东西只能通过A 的公钥来解密。顾名思义,公钥是公开的,别人可以获取的到;私钥是私有的,只能自己拥有。

缺点:加解密比对称加密耗时.

优点:比对称加密安全.

非对称rsa ecc

29

共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

一简要说明为什么会发生死锁?解决死锁的主要方法是什么?

若干事务相互等待释放封锁,就陷入无限期等待状态,系统就进入死锁。多个进行相互等待对方资源,在得到所有资源继续运行之前,都不会释放自己已有的资源,这样造成了循环等待的现象,称为死锁。

解决死锁的方法应从预防和解除的两个方面着手:

(1)死锁的预防方法:要求每一个事务必须一次封锁所要使用的全部数据(要么全成功,要么全不成功)规定封锁数据的顺序,所有事务必须按这个顺序实行封锁。

(2)允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事物撤消,回滚这个事务,并释放此事务持有的封锁,使其他事务继续运行

二、产生死锁的四大必要条件:

资源互斥/资源不共享

每个资源要么已经分配给了一个进程,要么是可用的,只有这两种状态,资源不可以被共享使用,所以所谓的互斥是指:资源不共享,如果被使用,只能被一个进程使用。

占有和等待/请求并保持

已经得到资源的进程还能继续请求新的资源,所以个人觉得叫占有并请求也许更好理解。

资源不可剥夺

当一个资源分配给了一个进程后,其它需要该资源的进程不能强制性获得该资源,除非该资源的当前占有者显示地释放该资源。

环路等待

死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源。

30 HashMapHashTable的区别

1HashMap线程不安全,HashTable是线程安全的。

2)二者的基类不一样。HashMap派生于AbstractMapHashTable派生于Dictionary。法,而在Dictionary中只有少量的接口,并且都是abstract类型。

3keyvalue的取值范围不同。HashMapkeyvalue都可以为null,但是HashTablekeyvalue都不能为null

31线程安全则是多线程操作同一个对象不会有问题。

StringBuilder是非线程安全的,StringBuffer是线程安全的。

32瀑布式开发和敏捷开发区别

敏捷开,首先把客最关注的件原型先做出来,交付或者上线,在实际场景中去修改弥需求中的不足,快速修改,再次布版本。再次上线或者交付。通一些敏捷践方式,story,可以提供更小的迭代。如此循,直到用(客意。适用于需求不明确的目、新性的目或者需要占市目。

瀑布式开要求明确的需求,大家按照需求一步步做好划,在目运作程中出各种文档,按着流程一步步走下去。种模式一般适用于需求比明确、to B

33 电子商务平台的安全性

1)保证交易双方身份的真实性:

常用的处理技术是身份认证,依赖某个可信赖的机构(CA认证中心)发放证书,并以此识别对方。目的是保证身份的精确性,分辨参与者身份的真伪,防止伪装攻击。

(2)保证信息的保密性:

保护信息不被泄露或被披露给未经授权的人或组织,常用的处理技术是数据加密和解密,其安全性依赖于使用的算法和密钥长度。常见的加密方法有对称式密钥加密技术(DES算法)和公开密钥加密技术(RSA算法)

(3)保证信息的完整性:

常用数据杂凑等技术来实现。通过散列算法来保护数据不被未授权者(非法用户)建立、嵌入、删除、篡改、重放。典型的散列算法为美国国家安全局开发的单向散列算法之一。

(4)保证信息的真实性:

常用的处理手段是数字签名技术。目的是为了解决通信双方相互之间可能的欺诈,如发送用户对他所发送信息的否认、接收用户对他已收到信息的否认等,而不是对付未知的攻击者,其基础是公开密钥加密技术。目前,可用的数字签名算法较多,如RSA数字签名、ELGamal数字签名等。

34 请教webservice安全和加密的方法

WebService访问API是公开的,知道其URL者均可以研究与调用。

访问安全性:当前访问者是注册合法用户
通信安全性:客户端与服务器之间的消息即使被第三方窃取也不能解密
本文安全的基本思路是:
注册
用户登录时使用RSA加密
Web API
调用参数使用
DES加密(速度快)

#面经##国企#
全部评论
楼主你好,请问你是实习、校招还是社招?岗位是什么?开发的话,是Java方向还是C++方向?或者其他语言方向~
1 回复
分享
发布于 2020-06-01 21:24
#国企面试# 👈点击话题查看更多同类面经干货!每日面经精选,为你发掘牛客干货!
1 回复
分享
发布于 2020-06-02 15:09
饿了么
校招火热招聘中
官网直投
雷锋啊
点赞 回复
分享
发布于 2020-09-24 17:33
爱心
点赞 回复
分享
发布于 2021-03-14 19:09

相关推荐

57 630 评论
分享
牛客网
牛客企业服务