后台Java基础Java的数据结构有那些StringBuffer,Stringbuilder有什么区别锁读写锁乐观锁互斥锁自旋锁权限修饰符自动数据类型转换Springspring 的优点?Spring事物什么是AOPAOP的优点AOP的基本概念AOP 和 OOP的区别什么是IOCIOC的优点常用注解@Autowired与@Resource的区别Spring的事务管理SpringMvcSpringMVC的流程Springmvc的优点springMVC和struts2的区别有哪些Spring MVC的异常处理SpringMVC常用的注解SpringMvc里面拦截器MyBatis什么是MyBatis$和#的差别Mybaits的优点MyBatis框架的缺点Mapper编写有哪几种方式mybatis sql 动态解析缓存一级缓存二级缓存SpringBoot为什么要用 Spring BootSpring Boot 常用注解SpringBoot读取配置注解springboot常用的starter有哪些SpringCloud核心组件Eureka(尤里卡) 服务治理注册中心Ribbon(瑞本) 负载均衡Ribbon与Nginx差别Feign 声明式服务调用Hystrix 熔断器Zuul API网关服务Config 配置中心Dubbo Dubbo优点多线程创建线程Runnable接口和Callable接口有何区别run()方法和start()方法有和区别线程安全的MapswitchJava8新特性并行流&串行流并行流JVM堆内存Java数据结构Collection(单列集合)List(有序,可重复)Set(无序,唯一)Map(双列集合)数据库MySql数据库事务的四个特性及含义三大范式数据库系统特点网状结构数据库4种视图模式sql预编译sql执行顺序Mysql索引Redis底层数据结构类型Redis支持的数据类型Redis持久化缓存过期 && 缓存淘汰缓存穿透 && 布隆过滤器缓存击穿 && 缓存雪崩服务端Tomcatnginxnginx 的 upstream目前支持 4 种方式的分配 RabbitMq优点交换机信道ElasticSearchLinuxchmodchowntar排查CPU占用前端VUEVUE的生命周期一句话回答
线性表(ArrayList)
链表(LinkedList)
栈(Stack)
队列(Queue)
图(Map)
树(Tree)
StringBuffer与StringBuilder都继承了AbstractStringBulder类,而AbtractStringBuilder又实现了CharSequence接口,两个类都是用来进行字符串操作的。
在做字符串拼接修改删除替换时,效率比string更高。
StringBuffer是线程安全的,Stringbuilder是非线程安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized关键字
名称 | 说明 | 备注 |
---|---|---|
public | 可以被任何类访问 | |
protected | 可以被同一包中的所有类访问可以被所有子类访问 | 子类没有在同一包中也可以访问 |
private | 只能够被 当前类的方法访问 | |
缺省无访问修饰符 | 可以被同一包中的所有类访问 | 如果子类没有在同一个包中,也不能访问 |
操作数 1 类型 | 操作数 2 类型 | 转换后的类型 |
---|---|---|
byte 、 short 、 char | int | int |
byte 、 short 、 char 、 int | long | long |
byte 、 short 、 char 、 int 、 long | float | float |
byte 、 short 、 char 、 int 、 long 、 float | double | double |
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部
事务特性(4种):
原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
一致性(Consistency):事务的执行的前后数据的完整性保持一致.;如银行转帐,A转帐给B,必须保证A的钱一定转给B,一定不会出现A的钱转了但B没收到,否则数据库的数据就处于不一致(不正确)的状态。
隔离性(Isolation):事务之间相互独立,互不干扰;
持久性(Durability):事务一旦执行成功,事务的提交结果,将持久保存在数据库中,不会因比如遇到系统故障或断电造成数据不一致或丢失。
面向切面编程,常用语异常捕捉,日志记录
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分。
也可以说 AOP 是面向业务中的动词领域, OOP 面向名词领域。
AOP 的一个很重要的特点是源代码无关性,也就是说如果我们的系统中引用了 AOP 组件,即使我们把该组件去掉,系统代码也应该能够编译通过。要实现这一点,可以使用动态 proxy 模式。
控制反转,DI注入,解耦组件,注解方式引入
在设计上,Spring的IoC容器是一个高度可扩展的无侵入容器。所谓无侵入,是指应用程序的组件无需实现Spring的特定接口。
IoC 的实现原理就是工厂模式加反射机制。使用ClassName
1,通过IOC容器,开发人员不需要关注对象是如何创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的热插拔。
2,IOC容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试。
缺点:
3,对象是通过反射机制实例化出来的,因此对系统的性能有一定的影响。
4,创建对象的流程变得复杂。
@Required:该注解应用于设值方法。
@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
Spring的声明式事务通常是指在配置文件中对事务进行配置声明,其中包括了很多声明属性,它是通过Spring Proxy帮你做代理,自己不用额外的写代码,只要在Spring配置文件中声明即可;通常用在数据库的操作里面;
编程式事务就是指通过硬编码的方式做事务处理,这种处理方式需要写代码,事务中的逻辑可以自己定制;可以是数据库的东东,也可以是其他的操作。
Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
xxxxxxxxxx
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
xxxxxxxxxx
(1)可以支持各种视图技术,而不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的角色分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4)支持各种请求资源的映射策略。
xxxxxxxxxx
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
可以将异常抛给Spring框架,由Spring框架来处理;我们只需要配置简单的异常处理器,在异常处理器中添视图页面即可。
xxxxxxxxxx
@Conntroller注解,表示是表现层
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
xxxxxxxxxx
有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
#:会在预编辑阶段解析为JDBC的预编译参数标记符。在DBMS中才变量替换
$:在动态sql解析阶段就进行变量替换,会存在sql注入问题。表名称为变量时,必须使用$
xxxxxxxxxx
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
(4)能够与Spring很好的集成;
(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
xxxxxxxxxx
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
mybatis 在调用 connection 进行 sql 预编译之前,会对sql语句进行动态解析,动态解析主要包含如下的功能:
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。
SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开席需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了
xxxxxxxxxx
独立运行
简化配置
自动配置
无代码生成和XML配置
应用监控
xxxxxxxxxx
@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
xxxxxxxxxx
@PropertySource
@Value
@Environment
@ConfigurationPropertie
xxxxxxxxxx
spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持
spring-boot-starter-data-jpa 数据库支持
spring-boot-starter-data-redis redis数据库支持
spring-boot-starter-data-solr solr支持
mybatis-spring-boot-starter 第三方的mybatis集成starter
Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目。
相同点:
不同点:
Callable接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会堵塞主线程继续往下执行,如果不调用就不会堵塞。
xxxxxxxxxx
在Java7之前,switch只能支持 byte、short、char、int或者其对应的封装类以及Enum类型。
在Java7中,也支持了String类型 String byte short int char Enum 类型
并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
Java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。
Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与串行流之间进行切换 。
新生代
old区
ArrayList与LinkedList的区别
名称 | 结构 | 查询速度 | 增删速度 | 线程安全 | 默认容量 | 扩容 | 效率 |
---|---|---|---|---|---|---|---|
ArrayList | 数组 | 快 | 慢 | 不安全 | 10 | 0.5(右移一位) | 高 |
Vector | 数组 | 快 | 慢 | 安全 | 10 | 1(复制一份长度) | 低 |
LinkedList | 链表 | 慢 | 快 | 不安全 | 双向链表无默认大小 | 0 | 高 |
名称 | 结构 | 依赖方法 |
---|---|---|
HashSet | 哈希表 | hashCode(),equals() |
LinkedHashSet | 链表加哈希表 | 链表保证顺序有序,哈希保证元素唯一 |
TreeSet | 红黑树 | 自然排序,比较器排序 |
Hashtable与ConcurrentHashMap的区别
名称 | 结构 | 实现 | 线程安全 | 允许null | 备注 |
---|---|---|---|---|---|
HashMap | 哈希表,链表,红黑树(1.8,数量大于8个) | hashCode ^异或 (hashCode >>> 16) | 不安全 | Y | 默认16,临界值0.75,扩大*2 |
Hashtable | 哈希表,链表 | hashCode | 安全 | N | 默认11,临界值0.75,*2+1所有操作加锁,效率低 |
TreeMap | 红黑树 | 不安全 | |||
ConcurrentHashMap | 数组 + 链表(使用volatile修饰) | 安全 | 不允许Null值 |
xxxxxxxxxx
数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译
<where_condition>
的记录才会被插入虚拟表VT4;
<having_condition>
的记录才会被插入到VT7;
<order_by_list>
进行排序操作,产生虚拟表VT10;
结构
FULLTEXT
HASH
BTREE
多路平衡查找树:所有关键字和数据分布在整个树中。任何关键字出现且只出现在一个节点中。
RTREE
类型
由ANSI C编写。
简单动态字符串
SDS
len:buf中已占用长度
free: 剩余长度,初次分配时没有空余,修改后会有空余
buf[]:数据空间
链表
redis使用的双向无环链表。
使用list结构持有链表
head:头节点
tail:尾节点
len:长度
dup:复制
free:释放
match:对比
链表提供了更高的节点排重能力,即顺序性的节点访问,并且可以通过增删节点来灵活的调整链表长度。 列表键底层实现之一就是链表。当一个列表键包含了较多的元素,又或者列表中包含的元素都是比较长的了字符串时,redis就会使用链表作为列表的底层实现。
慢查询,发布订阅,监视器
字典
Redis字典所使用的哈希表由dict.h/dictht结构定义
table:哈希数组
size: 哈希大小
sizemask:哈希表大小掩码,用于计算索引值
used:该哈希表已有数据
跳跃表:链表加多级索引
整数整合:向上转型
压缩列表:预先标示元素大小
Ziplist: 列表和哈希实现
对象
Redis中每个对象都由一个redisObject结构标示
type:类型
encoding:编码
ptr:指针
RDB,AOF
1、aof文件比rdb更新频率高,优先使用aof还原数据。
2、aof比rdb更安全也更大
3、rdb性能比aof好
4、如果两个都配了优先加载AOF
击穿是一个人的雪崩,雪崩是一群人的击穿
xxxxxxxxxx
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、url_hash(第三方)
nginx内置策略包含加权轮询和ip hash
加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;
名称 | 优点 | 缺点 |
---|---|---|
ActiveMq | java编写,可做jar包形式使用,更简单 | 只有两种工作模式,queue:一对一,topics:广播 |
RabbitMq | erlang编写,比较小,可以指定交换机 | |
kafka | 号称为分布式而生。只有topics(广播)模式,每个消费需要指出自己属于哪个consumerGroup,可以读取已经消费了的消息 |
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
生产者
消费者
主要是TCP连接的“昂贵”性,生产者及消费者都需要和MQ建立连接,对于操作系统来说TCP的建立和销毁都非常昂贵。
信道是建立在Connection 之上的虚拟连接。当应用程序与Rabbit Broker建立TCP连接的时候,客户端紧接着可以创建一个AMQP 信道(Channel) ,每个信道都会被指派一个唯一的ID。RabbitMQ 处理的每条AMQP 指令都是通过信道完成的。
ElasticSearch是一个基于Lucene的实时的分布式搜索和分析引擎
ES使用了倒排索引(inverted index),该结构对于全文检索非常快。
倒排索引包括一个在任意文档中出现的唯一性的词语列表,对于每个词语,都有一个它出现过的文档列表。
倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。
修改权限使用
当前用户-当前组-其他用户
r=4 w=2 x=1
修改文件及目录所属组
chown user file
-x 解压
-c 打包
-v 显示过程
-f 指定名称
xxxxxxxxxx
top 获取对应pid
ps -mp pid -o THREAD,tid,time 获取对应进程
piintf "%x\n" number 进程号转16进制
jstack pid|grep 进程号
xxxxxxxxxx
beforeCreate(创建前) 在数据观测和初始化事件还未开始
created(创建后) 完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来
beforeMount(载入前) 在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。
mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。
beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。
destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
xxxxxxxxxx
1.css只在当前组件起作用
答:在style标签中写入scoped即可 例如:<style scoped></style>
2.v-if 和 v-show 区别
答:v-if按照条件是否渲染,v-show是display的block或none;
3.$route和$router的区别
答:$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等。
4.vue.js的两个核心是什么?
答:数据驱动、组件系统
5.vue几种常用的指令
答:v-for 、 v-if 、v-bind、v-on、v-show、v-else
6.vue常用的修饰符?
答:.prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用
7.v-on 可以绑定多个方法吗?
答:可以
8.vue中 key 值的作用?
答:当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。
9.什么是vue的计算属性?
答:在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③计算属性内部this指向vm实例;④在template调用时,直接写计算属性名即可;⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。
10.vue等单页面应用及其优缺点
答:优点:Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
缺点:不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。