Java面试知识总结(带基础)
Spring什么是spring?spring是一个轻量级的ioc哥aop容器的开源开发框架,简化企业级应用的开发,常见的三种配置方式:基于XML的配置,基于注解的配置,基于java的配置spring的特点:轻量,控制反转(IOC),面向切面的编程(AOP),容器,MVC框架,事务管理,异常处理Spring主要由几个模块组成:SpringCore:核心类库,提供IOC服务SpringContext:
目录
Spring
什么是spring?
spring是一个轻量级的ioc和aop容器的开源开发框架,简化企业级应用的开发,
常见的三种配置方式:
基于XML的配置,基于注解的配置,基于java的配置
spring的特点:
轻量,控制反转(IOC),面向切面的编程(AOP),容器,MVC框架,事务管理,异常处理
spring常用注解
@Autowired
@bean
@Configuration
@Value
Spring主要由几个模块组成:
SpringCore:核心类库,提供IOC服务
SpringContext:提供框架式的bean访问方式
SpringAop:Aop服务
SpringDAO:对JDBC的抽象,简化了数据访问异常的处理
SpringORM:对现有的ORM框架的支持
SpringWeb:提供基本的面向Web的综合特性
SpringMVC:提供面向Web应用的Model-View-Controller实现
依赖注入的方式有几种?
1.构造器注入 2.setter注入 3.注解注入
SpringMVC的组件:
1.前端控制器DispatcherServlet
2.处理器映射器HandlerMapping
3.处理器适配器HandlerAdapter
4.后端处理器Handler
5.视图解析器View resolver
MVC执行流程?
1.用户发送请求至前端控制器
2.前端控制器收到请求后调用处理器映射器
3.处理器映射器根据url找到具体的处理器生成处理器对象返回给前端控制器
4.前端控制器调用处理器适配器
5.处理器适配器调用Handler后端控制器
6.Handler执行完返回ModelAndView
7.处理器适配器将handler执行结果MAV返回给前端控制器
8.前端控制器将MAV传给视图解析器,视图解析器解析完返回View
9.前端控制器对View进行渲染
10.前端控制器响应用户
SpringMVC常用注解:
@requestMapping
@requestBody
@responseBody
谈谈对SpringAop的理解
面向切面编程,便于减少系统重复的代码,降低模块之间的耦合度,有利于未来的可拓展性和可维护性,
aop是基于动态代理,代理的对象实现了某个接口,使用JDK动态代理,没有实现接口使用CGlib代理
SpringAOP和AspectjAOP的区别
SpringAOP是属于运行时增强,而Aspectj是编译时增强,SpringAOP是基于代理而Aspectj基于字节码操作
AOP中连接点和切入点的区别
连接点代表一个应用程序的某个位置,这个位置可以插入一个aop切面是应用程序执行AOP的位置
切入点是一个或者一组连接点通知将在这些位置执行,可以通过表达式或者匹配的方式指明切入点
什么是通知,哪些类型
在方法执行前后要做的动作,是程序执行时要通过SpringAOP框架触发的代码段
before 前置通知
after 后置通知
after-returning 当方法成功执行完执行的通知
after-throwing 方法抛出异常退出时执行的通知
around 在方法执行前后的通知
什么是IOC
ioc就是控制反转,创建对象的主动权交给Spring容器管理,由容器去创建和管理各个实例之间的依赖关系,对象与对象之间的松耦合
DI(依赖)注入:应用程序在运行时候依赖ioc容器来动态注入对象需要的外部资源
IOC注入的三种方式:构造器注入,setter注入,注解注入
SpringBean的生命周期:
实例化bean,设置对象属性,处理aware接口,beanpostprocessor,initializingBean和ini-method,DisposableBean,destroy-method
bean的生命周期:定义,初始化,调用,销毁
解释Spring支持的几种bean作用域
singleton,prototype,request,session,global-session
Spring基于xml注入bean的几种方式
set方法注入,构造器注入#通过index设置参数位置#通过type设置参数类型
Spring框架中用到哪些设计模式
工厂模式,单例模式,原型模式,迭代器模式,代理模式,适配器模式,观察者模式
事务的隔离级别
未提交读,提交读,可重复读,可串行化
事务的传播机制
PROPAGATION_REQUIRED 默认
PAOPAGATION_REQUIRE_NEW
PROPAGATION_NESTED
PROPAGATION_SUPPORTS
PROPAGATION_NOT_SUPPORTED
PROPAGATION_MANDATORY
PROPAGATION_NEVER
Spring事务实现方式
编程式事务管理,声明式事务管理
事务管理的优点
它为不同的事务API
提供了统一的编程模型。它为编程式事务管理提供了一个简单的API而非一系列复杂的事务API,它支持声明式事务管理。它可以和Spring 的多种数据访问技术很好的融合。
数据源,事务管理器,事务应用和属性配置
事务注解的本质是什么
1.配置文件配置扫描路径
2.递归包扫描获取.class文件
3.反射确定需要交给ioc管理的类
4.对需要注入的类进行依赖注入
BootStrapClassLoader
ExtClassLoader
AppClassLoader
Mybatis
通过来映射字段名和实体类属性名的--对应关系
SpringBoot
SpringBoot的优点
1.独立运行
2.简化配置
3.自动配置
4.无代码生成和XML配置
5.应用监控
Springboot核心注解
@springbootapplication
@springbootconfiguration
@enableAutoConfiguration
@ComponentScan
运行springboot有几种方式
1.打包用命令或者放到容器中运行
2.用maven/Gradle插件运行
3.直接执行main方法运行
如何理解Springboot中的Starters?
可以理解为启动器,包含了许多项目中需要用到的依赖,快速运行
springboot配置加载顺序
properties文件,yaml文件,系统环境变量,命令行参数
Springboot核心配置文件?
application和bootstrap配置文件
Mysql
数据库三范式是什么
第一范式:列不可再分
第二范式:属性完全依赖于主键
第三范式:属性不依赖于其它非主属性 属性直接依赖于主键
最终目的:减少数据的冗余
数据库的命名规范:
1.字段名必须以字母开头,尽量不要使用拼音
2.长度不能超过30个字符
3.不能使用sql的保留字
4.只能使用az,AZ,0-9,$等
5.多个单词用下划线隔开
常用基础函数
lower--数据转小写
upper--数据转大写
length--数据的长度
substr--截取
replace--替换
ifnull--判断是否为null
round&ceil&floor---round四舍五入,ceil向上取整,floor向下取整
uuid--返回uuid
now--查询时间
year&month&day--查询年月日
' '--转义字符
条件查询
distinct--去除重复的记录行
where--后面带条件
like--通配符,通配符前面的值表示以什么开头
null--过滤字段值为空的
between and---在什么之间
limit---分页查询
order by--默认升序
order by desc--降序
聚合查询
count--查询有多少条数据
max/min--求字段的最大最小值
sum/avg--总记录数
分组查询
group by--表示分组
having--过滤返回的结果
表的关系
一对一,一对多,多对一,多对多
数据库的事务
什么是数据库的事务?
将一堆的sql语句绑定在一起执行,要么都执行成功,要么都执行失败,否则就会恢复到sql之前的状态
主键和外键的区别?
主键在本表中是唯一不可为空的,外键可以重复可以为空,外键和另一张表的主键关联,不能创建对应表中不存在的外键
事务的特性:
原子性:只有所有操作都成功整个事务才会提交
一致性:事务操作成功后,数据库所处的状态和他的业务规则是一致的,数据不会被破坏
隔离性:不同的事务拥有各自的数据空间,所有操作不会互相干扰
持久性:一旦事务提交成功,事务中所有操作都必须持久化到数据库中
事务隔离级别
读未提交:安全性最差,可能发生并发数据问题,性能最好
读提交:Oracle默认的隔离级别
可重复读:mysql默认的隔离级别,安全性较好,性能一般
串行化:表级锁,读写都加锁,效率低下,安全性高,不能并发
索引是什么?
帮助mysql高效获取数据的数据结构,加快数据库的查询包括聚集索引,覆盖索引,组合索引,前缀索引,唯一索引
SQL优化手段:
1.查询语句中不要使用select*
2.尽量减少子查询,使用关联查询代替
3.减少使用IN或者Not IN,使用exists,not exists或者关联查询语句替代
4.避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
5.or的查询尽量使用union或者union all代替
6.避免在where子句中对字段进行null判断
数据库优化方式?
1.选取最适用的字段属性
2使用连接查询(join)代替子查询(Sub-queries)
3.使用联合查询(union)来代替手动创建临时表
4.事务
5.锁定表
6.使用外键
7.使用索引
8.优化的查询语句
什么是视图?
一种虚拟的表,可以对视图进行增删改查,是有一个表或者多个表的行列的子集
什么是内连接,左外联接,右外联接
内联接(Inner Join):匹配2张表中相关联的记录。
左外联接(Left Outer Join):除了匹配2张表中相关联的记录外,还会匹配左表中剩余的记
录,右表中未匹配到的字段用NULL表示。
右外联接(Right Outer Join):除了匹配2张表中相关联的记录外,还会匹配右表中剩余的记
录,左表中未匹配到的字段用NULL表示。在判定左表和右表时,要根据表名出现在Outer Join的左右位置关系。
并发事务会带来哪些问题
脏读,丢失修改,不可重复读,幻读
大表如何优化?
1.限定数据的范围
2.读写分离
3.垂直分区
4.水平分区
分库分表之后id主键如何处理
UUID:不适合做主键,太长并且无序不可读,查询效率低
数据库自增id:需要独立部署数据库实例,成本高,有性能瓶颈
利用redis生成id:性能比较好,不依赖数据库,可用性降低,编码复杂,增加系统成本
Mysql中一条查询sql是如何执行的?
1.取得链接
2.查询缓存
3.分析器
4.优化器
5.执行器
索引有什么优点和缺点?
优点:提高数据查询速度,降低数据库io成本
缺点:占用储存空间,降低更新表的速度
Mysql索引类型有哪些?
主键索引,普通索引,唯一索引,全文索引,空间索引,前缀索引
什么时候不要使用索引?
1.经常增删改的列不要建立索引
2.有大量重复的列
3.表记录太少
数据库的锁?
共享锁
排他锁
表锁
行锁
什么是悲观锁,
为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务 ,无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
什么是乐观锁?
通过为数据库表增加一个“version”字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据
怎么避免死锁的出现?
1.设置获取锁的超时时间
2.设置按照统一顺序访问资源
3.避免事务中的用户交叉
4.保持事务简短并在一个批处理中
5.使用低隔离级别
6.使用绑定链接
主键与索引的区别?
主键一定会创建一个唯一索引,但是又唯一索引的列不一定是主键
主键不允许为空,唯一索引列允许空值
一个表只能有一个主键,但是可以又多个唯一索引
主键可以被其他表引用为外键,唯一索引不可以
主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构
Mysql如何做到高可方案
1.mysql高可用:分库分表,通过mycat连接多个mysql
2.mycat也得高可用:haproxy,连接多个mycat
3.haproxy也得高可用:通过keepalived辅助haproxy
JavaSE
Java语言的特点:
1.简单易学,有丰富的类库
2.面向对象(查询==程序耦合度低,内聚性更高)
3.与平台无关
4.可靠性安全
5.支持多线程
八大基本类型及封装类
Java自动装箱:将基本类型转换为包装类型
Java自动拆箱:将包装类型转换为基本类型
对面向对象的理解?
是由一组数据结构和处理他们的方法组成的,重点数据包括对象的特性,状态等的静态信息
面向对象的目的:解决软件系统的可拓展性,可维护性和可重用性
封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读写和修改的访问级别
继承:子类继承父类,可以继承父类的方法和属性,可以对父类方向进行覆盖
多态:一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中的实现方法,必须在程序运行期间才能决定
重写与重载的区别
重写:父类与子类之间,方法名,参数列表,返回值类型必须相同,访问修饰符大于重写方法的修饰符,不能抛出新的检查异常
重载:同名方法有不同参数列表(参数类型不同,参数个数不同,参数顺序不同)视为重载,不能通过返回值类型判断
java中实现多态的机制是什么?
方法的重写和重载
常用的数据结构:链表,堆栈,二叉树,队列,图,堆,集合
Java程序怎么优化?
1.明确对性能的具体要求
2.了解当前程序的性能
3.找到程序的性能瓶颈
4.采取适当的措施来提高性能
5.只进行某一方面的修改来提高性能
6.返回到步骤3继续做类似的工作,一直达到要求的性能为止
equals与==的区别
==:比较两个变量在栈内存中存放的对象的地址值
equals:比较的是两个对象的内容是否相等
String StringBuilder和StringBuffer的区别
String是只读字符串,并不是基本类型而是一个对象每次对String的操作都会生成一个新的对象
StringBuilder和StringBuffer都是可变的字符数组StringBuffer对方法加了同步锁所以是线程安全
Object常用方法
clone:实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法
finalize :判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。
equals:一般 equals 和 == 是不一样的,但是在 Object 中两者是一样的
hashCode:哈希查找,重写了 equals 方法一般都要重写 hashCode 方法
wait:调用该方法后当前线程进入睡眠状态
notify:配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程
notifyAll:配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程
虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入 ReferenceQueue 中
new创建对象
通过反射机制
采用clone机制
通过反序列化机制
final用于声明属性,方法和类分别表示属性不可变,方法不可覆盖,类不可继承
finally是异常处理的语句结构的一部分,表示总是执行
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收
获取一个类class对象的方式
1.通过类对象的 .getClass() 方法获取
2.通过类的静态成员表示,每个类都有隐含的静态成员 .class。
3.通过 Class 类的静态方法 .forName() 方法获取。
深拷贝和浅拷贝
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
堆和栈的区别
栈内存是运行单位,代表着逻辑,包含基本数据类型和堆中对象引用
堆是储存单位,代表着数据
类的生命周期
加载,连接,初始化,使用和卸载
Java的类加载器的种类?
1.根类加载器
2.扩展类加载器
3.系统类加载器
4.自定义类加载器
java的对象结构
对象头,实例数据,对齐填充
抽象类和接口有什么异同?
不同点:
1.抽象类中可以定义构造器,接口不能
2.抽象类可以有抽象方法和具体方法,接口不能有具体方法
3.接口中的成员变量都是public的,抽象类中的成员可以使用private,public,protected,默认等修饰
4.抽象类中可以定义成员变量,接口中只能是常量
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
6.抽象类中可以包含静态方法,接口中不能有静态方法
7.一个类只能继承一个抽象类,一个类可以实现多个接口
相同点:
1.不能够实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法进行实现,否则该类仍然需要被声明为抽象类
java有几种排序方法?
1.插入排序(直接插入排序,希尔排序)
2.交换排序(冒泡排序,快速排序)
3.选择排序(直接选择排序,堆排序)
4.归并排序,分配排序(箱排序,基数排序)
java程序是如何执行的
1.把 Java 代码编译成字节码
2.把 class 文件放置到 Java 虚拟机
3.Java 虚拟机使用类加载器(Class Loader)装载 class 文件
4.JVM 解释器会把字节码翻译成机器码交由操作系统执行
锁的优化机制
锁的状态:无锁-偏向锁-轻量级锁-重量级锁
锁的优化:自旋锁,自适应锁,锁消除,锁粗化,偏向锁,轻量级锁
产生死锁的四个必要条件
1. 互斥条件:一个资源每次只能被一个线程使用
2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
3. 不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺
4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
避免死锁(指定获取锁的顺序)
Java内存溢出的原因?
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据
2.集合类中有对象的引用,使用完未清空,使得jvm不能回收
3.代码中存在死循环或者产生过多重复的对象实体
4.使用的第三方软件中的bug
5.启动参数内存值设定的过于小
数组和集合
ArrayList和linkedList的区别
Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的
缺点: 数组初始化必须指定初始化的长度, 否则报错
List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection
Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。
Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引 用相同的对象,但Key不能重复
List,set,Map有什么区别?
List是有序的,允许重复,允许按照对象在集合中的索引位置检索对象
Map是无序的,不能重复,
Set是无序的,不允许重复
ArrayList和LinkedList的区别有哪些
ArrayList:是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)
因为地址连续,ArrayList 要移动数据,所以插入和删除操作效率比较低。
LinkedList :基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等 一个连续的地址。对于新增和删除操作,比较占优势,适用于要头尾操作或插入指定位置的场景。
因为 LinkedList 要移动指针,所以查询操作性能比较低。
适用场景
当需要对数据进行对随机访问的时候,选用 ArrayList。
当需要对数据进行多次增加删除修改时,采用 LinkedList
HashMap 是继承自 AbstractMap 类,而 Hashtable 是继承自 Dictionary类
2、对外提供的接口不同
3 、对 null 的支持不同
4、安全性不同
有可能, 在产生 hash 冲突时 , 两个不相等的对象就会有相同的 hashcode 值 . 当 hash 冲突产生时 , 一般
开放定址法
再哈希
多线程并发
创建,就绪,运行,阻塞,死亡
1. 继承 Thread 类
串行在时间上不可能发生重叠,前一个任务没执行完毕,下一个任务只能等着
并行在时间上是重叠的,两个任务同一时刻互不干扰的同时执行
并发允许两个任务彼此干扰,统一时间点只有一个任务允许,交替执行
execute() 方法的返回类型是 void ,它定义在 Executor 接口中 ,
1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗
异常处理机制
怎么处理java异常
try-catch-finally
try 块负责监控可能出现异常的代码
catch 块负责捕获可能出现的异常,并进行处理
finally 块负责清理各种资源,不管是否出现异常都会执行
其中 try 块是必须的,catch 和 finally 至少存在一个标准异常处理流程
try catch finally,try里有return,finally还执行么?
1、不管有木有出现异常,finally块中代码都会执行
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值
exception表示是可以捕捉或者需要程序进行处理的异常
IO流
什么是序列化,如何实现序列化?
序列化就是一种来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。
实现方式:将需要被序列化的类实现Seralizable接口该接口没有需要实现的方法
字节流和字符流的区别?
字节流读取数据的时候,读到一个字节就返回一个字节,字符流使用了字节流读到一个或者多个字节时,先去查指定的编码表,将查到的字符返回
反射机制
获取class对象
优点: 能够运行时动态获取类的实例,提高灵活性,与动态编译结合
Vue
Vue的优点:
1.轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十 kb ;
2.简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;
3.双向数据绑定:保留了 angular 的特点,在数据操作方面更为简单;
4.组件化:保留了 react 的优点,实现了 html 的封装和重用,在构建单页面应用方面有着独特的优势;
5.视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;
6.虚拟DOM:dom 操作是非常耗费性能的, 不再使用原生的 dom 操作节点,极大解放 dom 操作,但具体操作的还是 dom 不过是换了另一种方式;
7.运行速度更快:相比较于 react 而言,同样是操作虚拟 dom ,就性能而言, vue 存在很大的优势。
Vue中常用的一些指令:
1.v-model指令:用于表单输入,实现表单控件和数据的双向绑定。
2.v-on:简写为@,基础事件绑定
3.v-bind:简写为:,动态绑定一些元素的属性,类型可以是:字符串、对象或数组。
4.v-if指令:取值为true/false,控制元素是否需要被渲染
5.v-else指令:和v-if指令搭配使用,没有对应的值。当v-if的值false,v-else才会被渲染出来。
6.v-show指令:指令的取值为true/false,分别对应着显示/隐藏。
7.v-for指令:遍历data中存放的数组数据,实现列表的渲染。
8.v-once: 通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新
v-show和v-if指令的共同点和不同点:
相同点:v-show和v-if都能控制元素的显示和隐藏。
不同点:
1.实现本质方法不同:v-show本质就是通过设置css中的display设置为none;控制隐藏v-if是动态的向DOM树内添加或者删除DOM元素;
2.v-show都会编译,初始值为false,只是将display设为none,但它也编译了;v-if初始值为false,就不会编译了
总结:v-show只编译一次,后面其实就是控制css,而v-if不停的销毁和创建,如果要频繁切换某节点时,故v-show性能更好一点。
说说vue的生命周期的理解:
beforecreate (初始化界面前)
created (初始化界面后)
beforemount (渲染界面前)
mounted (渲染界面后)
beforeUpdate (更新数据前)
updated (更新数据后)
beforedestory (卸载组件前)
destroyed (卸载组件后)
Vue组件通信有哪些方式:
1.父传子:props
父组件通过 props 向下传递数据给子组件。注:组件中的数据共有三种形式:data、props、computed
2.父传子孙:provide 和 inject
父组件定义provide方法return需要分享给子孙组件的属性,子孙组件使用 inject 选项来接收指定的我们想要添加在这个实例上的 属性;
3.子传父:通过事件形式
子组件通过 $emit()给父组件发送消息,父组件通过v-on绑定事件接收数据。
4.父子、兄弟、跨级:eventBus.js
这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来(e m i t ) 触 发 事 件 ( emit)触发事件和(emit)触发事件和(on)监听事件,巧妙而轻量地实现了任何组件间的通信。
5.通信插件:PubSub.js
6.vuex
vuex 是 vue 的状态管理器,存储的数据是响应式的。只需要把共享的值放到vuex中,其他需要的组件直接获取使用即可;
router和route的区别:
router为VueRouter的实例,相当于一个全局的路由器对象,里面含有很多属性和子对象,例如history对象。。。经常用的跳转链接就可以用this.$router.push,和router-link跳转一样。
route相当于当前正在跳转的路由对象。。可以从里面获取name,path,params,query等
vue-router有几种钩子函数?
1.全局路由
全局导航钩子主要有两种钩子:前置守卫(beforeEach)、后置钩子(afterEach)
2. 路由独享的钩子
单个路由独享的导航钩子,它是在路由配置上直接进行定义的
3.组件内的导航钩子
组件内的导航钩子主要有这三种:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。他们是直接在路由组件内部直接进行定义的。
ps:详细知识点可以点击路由导航守卫查看;
vue-router路由跳转方式:
编程式( js跳转)
this.$router.push('/home')
this.$router.push({name:'home'})
this.$router.push({path:'/home'})
声明式(标签跳转)
<router-link :to="{name:'home'}"></router-link>
<router-link :to="{path:'/home'}"></router-link>
axios 是什么,其特点和常用语法
1.Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。前端最流行的 ajax 请求库,
2.react/vue 官方都推荐使用 axios 发 ajax 请求
特点:
1.基于 promise 的异步 ajax 请求库,支持promise所有的API
2.浏览器端/node 端都可以使用,浏览器中创建XMLHttpRequests
3.支持请求/响应拦截器
4.支持请求取消
5.可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据
6.批量发送多个请求
7.安全性更高,客户端支持防御 XSRF,就是让你的每个请求都带一个从cookie中拿到的key, 根据浏览器同源策略,假冒的网站是拿不到你cookie中得key的,这样,后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入,从而采取正确的策略。
做过哪些Vue的性能优化?
1.尽量减少data中的数据,data中的数据都会增加getter和setter,会收集对应的watcher
2.v-if和v-for不能连用
3.如果需要使用v-for给每项元素绑定事件时使用事件代理
4.SPA 页面采用keep-alive缓存组件
5.在更多的情况下,使用v-if替代v-show
6.key保证唯一
7.使用路由懒加载、异步组件
8.防抖、节流
9.第三方模块按需导入
10.长列表滚动到可视区域动态加载
11.图片懒加载
SpringCloud
cloud有什么优势
1.与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题
2.服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈
3.冗余-分布式系统中的冗余问题
4.负载平衡 --负载平衡改善跨多个计算资源的工作负荷
5.性能-问题 由于各种运营开销导致的性能问题
6.部署复杂性-Devops 技能的要求
什么是服务熔断?什么是服务降级?
熔断机制:是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路
服务降级:一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端 可以自己准备一个本地的fallback回调,返回一个缺省值
Boot 专注于快速方便的开发单个个体微服务
Nginx
Nginx是一个web服务器和方向代理服务器
Nginx的优点:更快,高扩展性,跨平台,高可靠性,低内存消耗,单机支持10万以上的并发连接,热部署
Nginx的特性
1. Nginx服务器的特性包括:
2. 反向代理/L7负载均衡器
3. 嵌入式Perl解释器
4. 动态二进制升级
5. 可用于重新编写URL,具有非常好的PCRE支持
Nginx和Apache 之间的不同点
什么是正向代理和反向代理
正向代理:客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发
反向代理:服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端
Redis
为什么要使用缓存?
提升读写性能,更高的并发量
redis有什么好处?
读取速度快,因为数据存在内存中,所以数据获取快;
支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等;
支持事务,且操作遵守原子性,即对数据的操作要么都执行,要么都不支持;
还拥有其他丰富的功能,队列、主从复制、集群、数据持久化等功能。
缺点:
由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然
Redis 本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定
期删除数据。如果进行完整重同步,由于需要生成 RDB 文件,并进行传输,会占用主机的 CPU并会消耗现网的带宽。不过 Redis 2.8 版本,已经有部分重同步的功能,但是还是有可能有完整重同步的
什么是redis?
一个开源、基于内存、支持多种数据结构的存储系统,可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串、哈希、列表、集合 、有序集合(sorted sets)等,除此之外还支持bitmaps、hyperloglogs 和地理空间( geospatial )索引半径查询等功能。
RDB持久化方式:用数据集快照的方式半持久化模式)记录(默认)
redis支持同时开启两种持久化方式
内部原因:
1.修改配置文件redis.conf的maxmemory参数,增加redis可用内存
2.设置缓存淘汰策略,提高内存的使用率
3.使用redis集群模式,提高储存量
分布式
HTTP请求所经历的步骤
1.DNS解析
2.HTTP请求
3.客户端向服务器发送请求命令(get,post),客户端发送请求头信息和数据
4.服务器发送应答头信息,服务器向客户端发送数据
5.服务器关闭TCP连接
6.客户端根据返回的html,css,js进行渲染
ACID:指数据库事务的四个基本要素
1.原子性 2.一致性 3.隔离性 4.持久性
CAP:在一个分布式系统中,一致性,可用性,分区容忍性
BASE理论:
Basically Available(基本可用)
Soft state(软状态)
Eventually consistent(最终一致性)
分布式事务提交解决方案:
1. 两阶段提交(2PC)
2. 三阶段提交(3PC)
3. 补偿事务(TCC=Try-Confifirm-Cancel)
4. 本地消息队列表(MQ)
5. Sagas事务模型(最终一致性)
分布式ID的特性:
1.唯一性 2.有序递增性 3.高可用性 4.带时间
UUID:算法的核心思想是结合机器的网卡、当地时间、一个随记数来生成UUID
优点:本地生成,生成简单,性能好,没有高可用风险
缺点:长度过长,储存冗余,且无序不可读,查询效率低
如何提高系统的并发能力
使用分布式系统。
部署多台服务器,并做负载均衡。
使用缓存(Redis)集群。
数据库分库分表 + 读写分离。
引入消息中间件集群。
JavaWeb
HTTP响应码
200:成功,Web 服务器成功处理了客户端的请求。
301:永久重定向,当客户端请求一个网址的时候,Web 服务器会将当前请求重定向到另一个网址,搜索引擎会抓取重定向后网页的内容并且将旧的网址替换为重定向后的网址。
302:临时重定向,搜索引擎会抓取重定向后网页的内容而保留旧的网址,因为搜索引擎认为
重定向后的网址是暂时的。
400:客户端请求错误,多为参数不合法导致 Web 服务器验参失败。
404:未找到,Web 服务器找不到资源。
500:Web 服务器错误,服务器处理客户端请求的时候发生错误。
503:服务不可用,服务器停机。
504:网关超时
Get和Post请求的区别:
get 请求用来从服务器获取资源
post 请求用来向服务器提交数据
TCP和UDP的区别
1.TCP面向连接 UDP是无连接
2.TCP提供可靠的服务 UDP不保证可靠交付
3.UDP具有较好的实时性
4.TCP只能是点到点 UDP支持一对一,多对多,多对一,一对多
5.TCP对系统资源要求多 UDP要求少
HTTP和HTTPS的区别
端口不同:HTTP和 HTTPS 的连接方式不同没用的端口也不一样,HTTP是80, HTTPS 用的是443
消耗资源:和HTTP相比,HTTPS通信会因为加解密的处理消耗更多的CPU和内存资源。
开销: HTTPS 通信需要证书,这类证书通常需要向认证机构申请或者付费购买
TCP如何保证可靠性
1.序列号和确认号机制
2.超时重发机制
3.对乱序数据包重新排序
4.丢弃重复数据
5.流量控制
如何实现跨域:JSONP、CORS方式、代理方式
设计模式
单例模式:
(1)饿汉式单例模式的写法:线程安全
(2)懒汉式单例模式的写法:非线程安全
(3)双检锁单例模式的写法:线程安全
代理模式:
优点:
代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;
可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务
缺点:
由于使用了代理模式,因此程序的性能没有直接调用性能高;
使用代理模式提高了代码的复杂度
工厂模式:
优点:
简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象
客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类
缺点:
不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑
产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护
Maven
1.添加第三方jar包
2.jar包之间的依赖关系
3.获取第三方jar包
优点:
1.最短路径原则(依赖传递的路径越短越优先)
3.覆写原则(直接覆盖父工程传过来)
更多推荐
所有评论(0)