1.面试总结(一)

1.数据库的三大范式:1.每列保持原子性 2.记录唯一性 3.数据不要冗余

2.Token的三个部分:头部、载荷、签名

3.redis的淘汰机制: redis.conf配置文件中的 maxmemory 属性限定了 Redis 最大内存使用量,当占用内存大于maxmemory的配置值时会执行内存淘汰策略。

4.java中的闭包是什么: Lambda表达式。lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码。

5.JavaScript的垃圾回收机制:Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。

原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。 js中最常用的垃圾回收方式就是标记清除

6.Dao接口的工作原理:Dao接口即Mapper接口,Mapper接口里的方法,是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行MapperStatement所代表的sql,然后将sql执行结果返回。

7.抽象类的意义:1.可以把同一种类型的对象共性抽取出来后封装成抽象类通过抽象类定义一系列规范,继承该抽象类的子类必须实现相应的抽象方法,使得该子类具有相应的规范性。

抽象类和接口的区别

1、抽象类中有构造方法,接口中无构造方法。

2、接口和接口之间支持多继承,类和类之间只能单继承。

3、一个类可以实现多个接口,但只能继承一个抽象类。

8.基于jwt和session用户认证的区别和优缺点

优点:

1.可扩展性好:应用程序分布式部署的情况下,session需要做多机数据共享,通常可以存在数据库或者redis里面。而jwt不需要。

2.无状态:jwt不在服务端存储任何状态

缺点:

1.安全性:由于jwt的payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。

2.性能:并且用户在系统中的每一次http请求都会把jwt携带在Header里面,因此使用jwt的http请求比使用session的开销大得多。

3.一次性:无状态是jwt的特点,但也导致了这个问题,jwt是一次性的。想修改里面的内容,就必须签发一个新的jwt。

9.jwt无状态登录流程

介绍:JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;

无状态登录的流程

  • 当客户端第一次请求服务时,服务端对用户进行信息认证(登录)
  • 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证
  • 以后每次请求,客户端都携带认证的token
  • 服务的对token进行解密,判断是否有效。
  • 整个登录过程中,最关键的点是安全性:token是识别客户端身份的唯一标示,如果加密不够严密,被人伪造那就完蛋了。采用何种方式加密才是安全可靠的呢?我们将采用JWT + RSA非对称加密
9.为什么静态方法不能调用非静态变量,非静态方法可以引用静态变量

:理由很简单,静态方法不属于对象,是属于类的,是不需要实例化的,而非静态变量是属于对象的,需要先实例化。相反,非静态方法是可以引用静态变量的。

10.说一下 MyISAM 和 InnoDB 的区别?
  1. InnoDB支持事务,MylSAM不支持事务
  2. InnoDB支持外键,MyISAM不支持外键
  3. Innodb的B+树主键索引的叶子节点就是数据文件,非主键索引的叶子节点存放的是主键的值;MylSAM的B+树索引的叶子节点都是数据文件的地址
11.数据库的引擎和锁

Mysql的引擎有很多种,最常见是MylSAM和Innodb锁分为三种,行级锁、表级锁、页级锁。
Innode支持页级锁和行级锁,,默认为行级锁。行级锁开销大,加锁慢,并发程度高。

MyISAMA采用表级锁,表级锁开销小,加锁快,并发程度低。
页级锁的开销和加锁时间,介于行级锁和表级锁之间。表级锁速度快,但是冲突多,行级锁冲突少,但是速度慢。采取折中的页级锁。

12.Nginx 了解吗?如何做负载均衡?

轮询——1:1轮流处理请求

权重——通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。

13.java多线程中run和start区别

run只是Thread里面的一个普通方法,start是启动线程的方法。

start()方法让一个线程进入就绪队列等待分配 cpu, 分到 cpu 后才调用实现的run()方法。

14.成员变量和局部变量区别

在类中的位置不同
成员变量:在类中方法外面
局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)
在内存中的位置不同
成员变量:在堆中(方法区中静态区),成员变量属于对象,对象进堆内存
局部变量:在栈中,局部变量属于方法,方法进栈内存
生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用或代码块的执行而存在,随着方法的调用完毕或者代码块的执行完毕而消失
初始值
成员变量:有默认初始值
局部变量:没有默认初始值,使用前需赋值

15.链表、队列和栈的区别
1
2
3
链表是一种数据的存储方式,保存的数据在内存中不连续的,用指针对数据进行访问;
队列是一种数据结构,其特点是先进先出,后进后出;
栈特点是后进先出
16.二叉树和二叉搜索树的区别

二叉树: 二叉树是一棵树,它的特点是每个结点至多有两棵子树。并且,子树有左右之分,其次序不能颠倒(有序)。

二叉搜索树:本质上是一个二叉树: 存储每一个元素都是有大小的。根节点, left子树小于根节点, right子树大于根节点