我的面试点总结

redis面试点

1.redis如何保持和数据库的一致性
简答:
(1)更新数据库数据
(2)数据库会将操作信息写入binlog日志当中
(3)订阅程序提取出所需要的数据以及key
(4)另起一段非业务代码,获得该信息
(5)尝试删除缓存操作,发现删除失败
(6)将这些信息发送至消息队列
(7)重新从消息队列中获得该数据,重试操作。

redis相关命令
启动redis: redis-server /目录/redis.conf
关闭redis: ./redis-cli shutdown
查看redis是否在运行: ps aux | grep redis

mybatis面试点

1.mabatis的缓存机制
mybatis提供两级缓存机制,第一级缓存是sqlsession级别的缓存默认开启在一次会话中可以共享查询数据减少数据库的实际访问次数
在数据库执行完修改数据库(insert,update操作后),会清空一级缓存
缓存的实现是采用一个没有容量限定的HashMap

第二级缓存机制是namespace,默认关闭,开启后会先查询二级缓存,同一个namespacesql可以共享数据,提交后有效,其他namespace的修改操作会出现脏数据,二级缓存的实用性不强

mabatis的缓存都是基于本地实现的,分布式建议使用redis等缓存

kafka消息队列

zookeeper组件和Eureka组件对比
在分布式系统中有个著名的CAP定理(C-数据一致性;A-服务可用性;P-服务对网络分区故障的容错性,这三个特性在任何分布式系统中不能同时满足,最多同时满足两个);
zookeeper主要是基于cp设计的保障了数据的一致性和故障容错
Eureka主要是基于ap设计的在服务可用性比较重要的情况下作为服务注册中心是比较有优势的

springMVC组件
前端控制器DispatcherServlet(不需要程序员开发)。
作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发)。
作用:根据请求的url查找Handler。
处理器适配器HandlerAdapter(不需要程序员开发)。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。
处理器Handler(需要程序员开发)。
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
视图解析器ViewResolver(不需要程序员开发)。
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
视图View(需要程序员开发jsp)。
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
【注】:不需要程序员开发的,需要程序员自己做一下配置即可。
springMVC工作原理
前后端分离时参数怎么传递

spring几大核心技术

spring IOC, spring aop,spring对象管理

spring IOC

spring通过spring对象容器管理bean对象同时通过配置文件来对bean对象的注入依赖对象
spring的依赖倒置和依赖注入主要是利用的spring容器来管理对象和依赖关系,实现了解耦

spring ioc容器底层是一个ConcurrentHashMap,通过反射的方式创建相应的bean对象后放入容器中以待使用

spring aop

spring aop采用了代理模式,对于有接口的实现类,采用jdk动态代理的技术,没有的话使用cgbl动态代理模式

代理模式的核心作用就是通过代理,控制对对象的访问。它的设计思路是:定义一个抽象角色,让代理角色和真实角色分别去实现它。分离业务核心逻辑和分支逻辑

实际应用中我们可以配合注解的方式可以轻松的抽离出一些系统逻辑(例如事务管理等),减少重复工作

动态代理主要就是利用反射由程序来创建代理类

Spring Cloud组件及用法
Eureka:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号,各个服务中有对应的组件负责注册服务和拉取服务信息到本地缓存(对比zookeeper)

Feign:声明式 WebService 客户端,主要使用动态代理模式封装了服务器连接一系列流程,使我们可以用接口的方式直接调用其他服务,简化开发

Ribbon:负责实现服务器的负载均衡,默认采用轮询的算法,可以通过设置来采用其他算法
随机,轮询,选择并发量最小的服务等,也可以自定义算法

Hystrix:断路器 解决由于某个服务出现问题导致分布式系统出现雪崩效应
请求的接口出现问题的时候采取服务熔断的方式,给与一个默认的返回值,防止系统长时间等待

Zuul 微服务API网关:代理+路由+过滤三大功能,可以通过zuul实现
主要对外提供暴露的接口,并可以实现限流、认证授权、安全等非业务流程

Spring Cloud Config:提供集中式的、动态的配置管理

在这里插入图片描述

hashMap解决哈希冲突
1.设计好的hash算法
2.hash冲突时使用链表,1.8以后链表长度大于8后转化为红黑树
3.元素过多的时候扩容

多线程导致Hashmap死锁(链表成环状)
Put导致的扩容操作时其他线程调用get方法

红黑树解决红黑树失衡问题
特征

  1. 根节点是黑色
  2. 所有节点是黑色或者红色
  3. 红色节点的子节点是黑色
  4. 叶子结点到根节点的黑色节点个数相同
    平衡修正
  5. 父节点和叔叔节点是红色
  6. 插入节点的父节点是红色,叔叔节点是黑色,且插入节点是其父节点的右子节点
  7. 插入节点的父节点是红色,叔叔节点是黑色,且插入节点是其父节点的左子节点
    变色——>左旋——>右旋

GC回收策略

1.java中将gc回收主要是针对堆内存
2.堆内存主要分为新生代,老年代和永久代
3.新建的对象主要放置在新生代中,新生代分为eden和两块Survivor区域,eden中的主要放置新建的对象,eden gc回收后幸存对象放置在 Survivor中,再次回收eden和Survivor后将幸存对象放置到Survivor2中,经过多次(默认15次)回收后,幸存对象转移到老年代中
4.老年代对象满后会进行Major GC
5.永久代保存了类的元数据(方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等),JDK8删除了永久代,类的元数据直接保存在本地内存区域(堆外内存),称之为元空间
6.标记-清除算法:等待被回收对象的“标记”过程在上文已经提到过,如果在被标记后直接对对象进行清除,会带来另一个新的问题——内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。
7.新生代gc算法:首先还是先标记处待回收内存和不用回收的内存,下一步将不用回收的内存复制到新的内存区域,这样旧的内存区域就可以全部回收,而新的内存区域则是连续的。它的缺点就是会损失掉部分系统内存,因为你总要腾出一部分内存用于复制
8.老年代gc算法:标记-压缩算法首先还是“标记”,标记过后,将不用回收的内存对象压缩到内存一端,此时即可直接清除边界处的内存
9、整个对象实例以一个树呈现,根节点是一个称为“GC Roots”的对象,从这个对象开始向下搜索并作标记,遍历完这棵树过后,未被标记的对象就会判断“已死”,即为可被回收的对象

java内存模型

程序计数器:当前线程所执行的字节码的行号指示器,属于每个线程私有
Java虚拟机栈:线程私有,用于存储局部变量表(基本数据类型,对象的引用和returnAddress类型)、操作数栈、动态链接、方法出口等信息。
本地方法栈:同java虚拟机栈,用于执行本地方法
Java堆:是Java虚拟机所管理的内存中最大的一块。Java堆在主内存中,是被所有线程共享的一块内存区域,其随着JVM的创建而创建,堆内存的唯一目的是存放对象实例和数组。同时Java堆也是GC管理的主要区域
方法区:方法去是所有线程共享的一个内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

内存区域 线程私有 主要作用 溢出异常
程序计数器 是 记录当前线程执行的位置 无异常
虚拟机栈 是 存储局部变量表(基本数据类型,对象的引用和returnAddress类型)、操作数栈、动态链接、方法出口等信息(java方法) StackOverflowError和OutOfMemoryError
本地方法栈 是 和虚拟机栈相似,区别本地方法栈为虚拟机使用到的Native方法服务 StackOverflowError和OutOfMemoryError
堆 否 存放对象实例和数组 OutOfMemoryError
方法区 否 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 OutOfMemoryError

java类加载机制

java类加载
加载阶段:
1.通过一个类的全限定名来获取定义此类的二进制字节流
2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3.在内存中(堆中)生成一个代表这个类的java.lang.Class对象,用来封装类在方法区里的数据结构,作为方法区中这个类的各种数据的访问入口

验证阶段:验证加载的字节流文件符合规范,对虚拟机无害

准备阶段:为类变量(static修饰的变量)分配内存和赋予初始值(变量类型的零值)

解析阶段:解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

初始化阶段:在初始化阶段,为类的静态变量赋予程序中指定的初始值,还有执行静态代码块中的程序
备注(初始化阶段是执行类构造器方法(注意:不是我们平时说的类的构造方法)的过程,构造器方法是()方法,它是由编译器自动收集类中所有的静态变量的赋值动作和静态代码块中的语句合并产生的)

设计模式
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

项目问题
我们的项目为什么不采用spring boot的来搭建
我们的NetStar项目是基于现网的硬件采集数据进行分析,或者对规划的网络进行
分析。和电商系统不同,我们的项目对服务的可用性要求不高,所以采用cp定理设计的zookpeer管理服务比较适合

数据库索引
1.单列索引
普通索引:
唯一索引:列的所有值唯一
主键索引:不允许有空值,列的所有值唯一
2.组合索引: 由不同列组合成的索引
3.全文索引:对文本的内容进行分词,进行搜索

springbean生命周期
1、实例化一个Bean--也就是我们常说的new;

2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;

3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值

4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);

5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);

6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;

7、如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。

8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;

注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。

9、当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;

10、最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

OOP是面向对象编程,特征分别是封装、继承、多态、抽象。
封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如果外部程序要访问对象内部,可以调用内部提供的get或set方法。简单来说,封装就是要找出某一类事务的公性然后提取出来。
继承:子类继承了父类所有的成员方法和属性,并且可以拥有自己特性。继承解决了代码的重用问题
多态:多态存在的三个条件1.继承2.重写3.父类引用指向子类对象
多态的实现方式1.接口实现,继承父类方法重写,同一个类中进行重载
重载:多个同名函数同时存在,具有不同的参数个数/类型,返回值类型可以相同可
以不同,调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性,存在于父类和子类、同类中
重写:1.参数列表必须完全与被重写的方法相同
2.返回的类型必须一直与被重写的方法的返回类型相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
5.存在于父类和子类之间,方法被定义为final不能被重写。
抽象:如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

数据结构分类
1、数组
2、栈
3、队列
4、链表
5、树
6、散列表
7、堆
8、图

一个完整的HTTP请求过程
整个流程
域名解析 —> 与服务器建立连接 —> 发起HTTP请求 —> 服务器响应HTTP请求,浏览器得到html代码 —> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片) —> 浏览器对页面进行渲染呈现给用户

8.谈谈java8的新特性
笔试简答:
常用层级:Lambda表达式,Stream API,方法引用,Optional类
理解层级:默认方法
了解层级:Nashorn,JavaScript引擎,Date Time API(加强对日期与时间的处理),新的编译工具(如:Nashorn引擎jjs、类依赖分析器jdeps)
1.Lambda表达式,Stream API,方法引用三大特性使代码简化并且增强了可读性。
2.Optional类使处理空指针更加便捷。
3.默认方法使大量源代码可以便捷扩展

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值