1.常见的加密算法

常见的对称加密算法:DES、AES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6。

常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

常见的哈希加密算法:SHA-1、MD2、MD4、MD5、HAVAL、SHA、HMAC、HMAC-MD5、HMAC-SHA1。

https采用的是对称加密和非对称加密传输数据的。

**在AES加密的10轮循环中,前9轮与第10轮区别为:操作不同、安全性不同、目的不同。 **

  • 一、操作不同

  • 1、前9轮:前9轮包括字节间减法运算(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)、轮密钥加法运算(AddRoundKey)操作。

  • 2、第10轮:第10轮包括字节间减法运算(SubBytes)、行移位(ShiftRows)、轮密钥加法运算(AddRoundKey)操作。

  • 二、安全性不同

  • 1、前9轮:前9轮 的线性操作对安全性影响较大,从效率考虑不可以忽略列混合。

  • 2、第10轮:第10轮的线性操作对安全性影响不大,从效率考虑可以忽略列混合。

  • 三、目的不同

  • 1、前9轮:前9轮保留一个列混合(MixColumns)操作,使得加密解密时需要用到等价密钥,增强了保密性。

  • 2、第10轮:第10轮省掉一个列混合(MixColumns)操作,使得加密可以有一个类型的轮函数形式。

2. 进程是由进程控制块(Processing Control Block)、程序段、数据段三部分组成,不包括堆栈。

3. linux中,用mkdir命令创建新的目录时,如果需要在其父目录不存在时先创建父目录需要用到-p或--parents 参数选项,若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录。

4. c中sizeof()主要用来计算当前变量或者当前类型占用的字节数,例如:

char a='b';

cout<<sizeof(a)<<endl;//计算变量a所占的字节空间,结果为1个字节

cout<<sizeof(int)<<endl;//int类型的所占用的字节空间,为4

看一道题目:

char a[]="world";

cour<<sizeof(a)<<endl;

输出结果为6,因为是以字符串的形式定义的字符数组,所以字符串末尾默认会有一个\0字符,\0是表示字符串结束的字符,所以共有六个字符,1个字符占一个字节,六个字符占用六个字节,所以输出是6。

如果这样定义:

char a[]=['w','o','r','l','d'];

那么上述的输出结果为5。

5. c中指针所占的字节数是4;字符类型所占字节数是1,而java是2;其他的和java都差不多

6.常见http请求状态码

  • 101 切换协议请求者已要求服务器切换协议,服务器已确认并准备切换。
  • 201 已创建请求成功并且服务器创建了新的资源。
  • 202 已接受服务器已接受请求,但尚未处理。
  • 301 永久移动请求的网页已永久移动到新位置,即永久重定向。
  • 302 临时移动请求的网页暂时跳转到其他页面,即暂时重定向。
  • 303 当前请求的资源在其它地址
  • 304 请求资源与本地缓存相同,未修改
  • 400 服务端无法理解客户端发送的请求,请求报文中可能存在错误语法
  • 401 未授权请求没有进行身份验证或验证未通过。
  • 403 禁止访问服务器拒绝此请求。
  • 405 不允许的请求方法
  • 413 请求实体过大请求实体过大,超出服务器的处理能力。
  • 500 服务器内部错误
  • 503 服务器目前无法使用
  • 504 网关超时

7.会导致用户进程从用户态切换到内核的操作

  • 系统调用
  • 异常
  • 外围设备的中断

8.死锁概念、死锁产生的四个必要条件、死锁产生的原因、死锁解决办法

  • 死锁概念:进程以独占的方式访问资源,当多个进程并发执行时可能出现进程永远被阻塞现象,如两个进程分别等待对方所占的资源,于是两者都不能执行而处于永远等待状态,此现象称为死锁。

死锁产生的四个必要条件

  • 互斥条件 临界资源是独占资源,进程应互斥且排他的使用这些资源。
  • 占有和等待条件 进程在请求资源得不到满足而等待时,不释放已占有资源。
  • 不剥夺条件 又称不可抢占,已获资源只能由进程自愿释放,不允许被其他进程剥夺。
  • 循环等待条件 又称环路条件,存在循环等待链,其中,每个进程都在等待链中等待下一个进程所持有的资源,造成这组进程处于永远等待状态。

死锁产生的原因

  • 进程顺序不当
  • PV操作使用不妥
  • 同类资源分配不均
  • 对某些资源的使用未加限制

死锁解决办法主要有一下三种方法:

  • 死锁防止 死锁防止的策略就是至少破坏四个必要条件中的任何一个
  • 死锁避免 在程序运行时避免发生死锁,采用安全状态、单个资源的银行家算法、多个资源的银行家算法 通过协议来预防或避免死锁,确保系统不会进入死锁状态
  • 死锁检测和恢复 不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复

9.计算机有哪三类总线和操作系统按照功能关系分为哪几类

  • 三类总线:地址总线、数据总线、控制总线
  • 操作系统按照功能关系分为:系统层、管理层和应用层

10.Serializable序列化总结

Serializable接口是一个标记接口(没有成员方法和变量),用来序列化对象

  1. 序列化:可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化)
  2. 一个类要想序列化就必须继承java.io.Serializable接口,同时它的子类也可以序列化(不用再继承Serializable接口)。
  3. Serializable接口,不仅可以本机,也可以网络操作,它自动屏蔽了操作系统的差异,字节顺序等。
  4. 序列化只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且序列化保存的只是变量的值,对于变量的任何修饰符都不能保存。记住序列化是保存对象的状态。

transient关键字

  1. 阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。

  2. 简单的说:当某些变量不想被序列化,同是又不适合使用static关键字声明,那么此时就需要用transient关键字来声明该变量。(不会再反序列化的时候被获取数据,只会取得初始值,如 int 型的是 0,对象型的是 null。)

11.接口和抽象类的区别

接口和抽象类的相似性

  1. 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

  2. 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

接口和抽象类的区别

  1. (不能为普通方法提供方法体)接口里只能包含抽象方法,静态方法和默认方法(加default),不能为普通方法提供方法实现,抽象类则完全可以包含普通方法,接口中的普通方法默认为抽象方法。

  2. (public static final 赋值)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,并且必须赋值,否则通不过编译。

  3. (是否有构造器)接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

  4. (不能包含初始化块)接口里不能包含初始化块,但抽象类里完全可以包含初始化块。

  5. (继承一个抽象类、多个接口)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

12. 23种设计模式

12.Spring框架中用到了哪些设计模式

1.工厂设计模式: spring ioc核心的设计模式的思想体现就是工厂模式,他自己这个IOC容器就是一个大的工厂,把所有的bean实例都给放在了spring容器里,如果你要使用bean,就找spring容器就可以了,自己不用创建对象了。

2.单例设计模式:Spring中的bean默认作用域就是singleton都是单例的。

3.代理设计模式:Spring AOP功能的实现就用到了代理模式,Spring AOP生成一些代理对象,做一定的增强,然后我们对目标对象的访问呢就是基于这个代理对象去访问。

4.模板方法模式:Spring中的jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,它们就使用到了模板模式。

5.包装器设计模式:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

6.观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。

7.适配器模式:Spring AOP的增强或通知(Advice)使用到了适配器模式、Spring MVC中也是用到了适配器模式适配Controller。

13.Mybatis用到的设计模式

1.Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;

2.工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;

3.单例模式,例如ErrorContext和LogFactory;

4.代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;

5.组合模式,例如SqlNode和各个子类ChooseSqlNode等;

6.模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;

7.适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;

8.装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;

9.迭代器模式,例如迭代器模式PropertyTokenizer;

14.为什么用redis?优点是啥?应用场景有哪些?

1.为什么使用redis

(1).解决应用服务器的CPU和内存压力;

(2).减少IO的读操作,减轻IO的压力;

(3).关系型数据库的扩展性不强,难以改变表结构;

2.优点

(1).Nosql数据库没有关联关系,数据结构简单,拓展表比较容易;

(2).Nosql读取速度快,对较大数据处理快;

3.适用场景

(1).缓存

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略, 所以,现在Redis用在缓存的场合非常多。

(2).排行榜

很多网站都有排行榜应用的,如淘宝的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。

(3).计数器

什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得给+1,并发量高时如果每次都请求数据库操作无疑是种挑战和压力。Redis提供的incr命令来实现计数器功能,内存操作,性能非常好,非常适用于这些计数场景。

(4).分布式会话

集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

(5).分布式锁

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。可以利用Redis的setnx功能来编写分布式的锁,如果设置返回1说明获取锁成功,否则获取锁失败,实际应用中要考虑的细节要更多。

15.redis单线程和多线程?

Redis6之前是单线程,Redis6引入了多线程。

reids单线程的缺点:性能瓶颈主要在网络IO操作上。也就是在读写网络 read/write 系统调用执行期间会占用大部分 CPU 时间。如果你要对一些大的键值对进行删除操作的话,在短时间内是删不完的,那么对于单线程来说就会阻塞后边的操作。

redis多线程:将网络数据读写和协议解析通过多线程的方式来处理 ,对于命令执行来说,仍然使用单线程操作。

所以,严格来说,redis现在的处理还是单线程的,对于多线程的引用只是在网络读写这一块,比如读取socket,解析请求,这些是多线程的,但是真正的执行redis读写命令还是单线程的,对于多线程的应用程度没那么深

redis相关推荐:redis持久化机制1redis持久化机制2redis持久化机制3redis key过期策略redis 常见面试题