1.面向对象的理解
面向对象是把构成问题的各个事务分解成各个对象。
封装:将一个对象的属性和行为的代码封装到一个类中,属性用变量定义,行为用方法定义
继承:父子类,为了拓展新内容不改变原有代码,提高可重用性和可扩展性
多态:引用变量指向具体类型,实现具体类型中的方法
2.SQL怎么优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如select id from t where num is null;可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5.in 和 not in 也要慎用,否则会导致全表扫描
6.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
7.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
3.抽象类和接口的区别
1)抽象类和接口都是数据类型,都属于引用数据类型,有很多相同点,比如说都可以包含抽象方法,都不能被实例化,都需要被继承/实现才有意义
2)但是它们也有不同点:
2.1)抽象类中可以包含很多东西(常量、变量、普通方法、抽象方法、构造方法);而接口中只能包含常量和抽象方法
2.2)一个类只能继承一个抽象类,但可以实现多个接口,用逗号分隔,继承抽象类的派生类,可以重写抽象方法也可以不重写,不重写将派生类也设置成抽象类;接口的实现类必须重写所有抽象方法
2.3)抽象类中成员的默认访问权限就是默认的,即同包中访问;接口中成员的默认访问权限是public
4.linux查看日志的命令是什么
Tail:查询尾部日志
Head:查询日志头几行日志
Cat:查看日志
Tac:倒序查看
5.linux移动文件命令
mv
-i: 如果目标文件存在,将会询问用户是否覆盖
-f: 覆盖已有的目标文件时不给出任何提示。
6.如何防止sql注入
sql预编译
确认每种数据的类型,数字必须使用int类型存储
规定数据长度
严格限制数据库权限
7.catch中如果有return finally中的代码是否还会执行
会执行,优先执行finally中的代码,再执行catch中的代码
8.springMVC工作流程
DispatcherServlet前端控制器
HandlerMapping处理器映射器
HandlerAdapter处理器适配器
ViewResolver视图解析
View视图渲染
9.Arraylist和Linkedlist区别
ArrayList动态数组的数据结构,内存存储地址是连续的,有索引更适合查询,ArrayList初始容量为10,每次扩容会固定为之前的1.5倍;
LinkedList基于链表的数据结构,首位添加(删除)元素,LnkedList性能远远优于ArrayList
10.对缓存的理解?
缓存能让原本打开很慢的页面,变得能“秒开”;
缓存是基于内存去建立的,内存读写速度比硬盘快,能大大提高访问数据的速度。
预读取:先将硬盘中的一部分加载到内存,然后再对外提供服务,减轻数据库访问量。
延迟写:先将需要写入磁盘或数据库的数据,暂时写入到内存,然后返回成功,再定时将内存中的数据批量存入到磁盘。
11.mybatis中自带的缓存?
采用 mybatis 内置的 cache 机制。在 sql 语句映射文件中加入 <cache /> 语句 , 并且相应的 model 类要实现 java Serializable 接口。单纯的 <cache /> 表示如下意思:
1.所有在映射文件里的 select 语句都将被缓存。
2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。
3.缓存使用“最近很少使用”算法来回收
4.缓存不会被设定的时间所清空。
5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。
6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。
- spring/springboot 常用的注解, 配置文件中的注解
Spring常用注解:
@Component:泛指各种组件(@Controller控制层、@Service业务层、@Repository数据访问层)
@Bean:导入第三方包里面的注解
@Autowired
@ComponentScan:用于对Component进行扫描
@Value
- ${}是去找外部酒配置的参数,将值赋过来
- #{}是SpE表达式,去寻找对应变量的内容
- #{}直接写字符串就是将字符串的值注入进去
SpringMVC常用注解:
@Controller @RestController
@RequestMapping:用于映射web请求,包括访问路径和参数
@ResponseBody:用户返回json数据
@RequsetBody:
@PathVariable:
@Transactional:事务
SpringBoot常用注解:
@SpringBootApplication
@SpringBootConfiguration
@Lazy使bean懒加载,取消bean预初始化
- 依赖注入的方式
接口注入,构造器注入,Setter注入
14.nginx的作用 如何理解反向代理
作用:
1.静态HTTP服务器
首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML、图片)通过HTTP协议展现给客户端。
server {
listen80; # 端口号
location / {
root /usr/share/nginx/html; # 静态文件路径
}
}
2.反向代理 负载均衡
客户端本来可以直接通过HTTP协议访问某网站应用服务器,网站管理员可以在中间加上一个Nginx,客户端请求Nginx,Nginx请求应用服务器,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
server {
listen80;
location / {
proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址
}
}
当网站访问量非常大,将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
upstream myapp {
server192.168.20.1:8080; # 应用服务器1
server192.168.20.2:8080; # 应用服务器2
}
server {
listen80;
location / {
proxy_pass http://myapp;
}
}
15.linux 创建文件的命令
Touch 文件名;
16.linux创建文件夹的命令
Mkdir 创建文件夹;
17.linux修改权限的命令
Chmod
Chgrp
Chown
18.ajax异步刷新是怎么实现的?
当xmlHttpRequest对象的readyState更新时,就会自动执行onreadystatechange绑定的js事件(体现异步),在该事件中操作DOM更新html页面(体现局部刷新)。
19.maven是干嘛的?
maven是下载和管理项目所需的依赖,还可以把项目打包
20.如果需要用到集合,你会选择用哪个?为什么
选择ConcurrentHashMap,不但线程安全,而且效率比hashtable高,把数据分区,每个部分添加同步锁,使其他部分的数据使用不受限制,大大提高效率
21.equals和==区别
==是值比较,对于引用类型变量==是判断引用的值是否是同一个对象地址值,如果是相同对象其内容也一定是相同的
equals方法判断的是对象的内容是否相同,由于其默认方法采用的==进行引用比较,所以需要重写为按照对象内容比较是否相同。
22.string、stringbuffer、stringbuffer有什么区别,如果要用到这些?你会怎么选择?为什么这么选?
tring是final类,不可以改变,线程不安全,stringbuilder线程不安全,stringbuffer线程安全的。
如果使用时,没有高并发情况,只是一个单线程,考虑stringbuilder,效率高;如果使用时有很高的并发,那么使用stringbuffer,它自带同步锁,保证线程安全
23.spring中的事务是怎么管理的?
Spring提供了多种事务管理器,将事务的具体工作委托给底层的持久化机制来实现(一般是数据库)。
Spring为不同的事务提供了一致的编程模型。
具体使用时,可以选择使用声明式或者编程式事务。
24.索引优缺点?平时用索引你是怎么用的?
优点:
1、大大加快数据的检索速度;
2、创建唯一性索引,保证数据库表中每一行数据的唯一性;
3、加速表和表之间的连接;
4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
1、索引需要占物理空间。
2、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
25.SQL中delete、truncate、delete分别是删除什么的?
drop删除库,不可恢复
delete删除某条记录或者表中所有记录,记录到日志中,可以回滚,可恢复
truncate删除表中所有记录,不可恢复
26.linux中的 grep 命令
linux中最为常用的三大文本(awk,sed,grep)处理工具
grep命令的常用格式为:grep [选项] “模式” [文件]
grep家族总共有三个:grep,egrep,fgrep
常用选项:
-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
模式:
直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度
使用基本正则表达式
27.SQL左外链接,右外连接,内连接查询的是什么
SQL左外链接查询的是左表和右表重叠部分的数据加左表全部数据,右外连接查询的是右表数据和左表数据重叠部分的数据,内连接查询的是两个表重叠部分的数据
28.linux常用命令
Ls
Cd
Cp
Rm
Mv
Mkdir
29.项目部署到linux上,出问题了,怎么解决
1、无法登录
因为在SpringBoot项目中的MyBatis配置中设置的数据库的地址为localhost,需改成安装mysql的主机的IP地址
2、本地无法连接远程服务器(Host is not allowed to connect to this MySQL server)解决办法
由于当前的root用户限制在当前的内网ip内访问的,需要修改他的访问域(%)
30.数组与链表的区别
数组:相同数据类型的元素按一定顺序排列的集合;数组的存储区间是连续的,占用内存比较大;
数组的特点是:随机访问性强,查询简单速度快,从头尾增加和删除困难;
链表:是一种物理存储单元上非连续、非顺序的存储结构,链表存储区间离散,占用内存比较宽松
链表的特点是:查询相对于数组困难,增加和删除容易。
31.HashMap,HashTable,LinkedHashMap之间的区别
HashMap:线程不安全,允许key值为null
HashTable:线程安全,不允许空值
LinkedHashMap:集成了HashMap的特点,并保留了插入时的顺序
- HashMap并发死循环怎么解决
创建一个synchronizedMap
使用Collections.synchronizedMap(将创建的Map传进来)
- 反射创建的三种方式,最常用的是哪一种
全路径
类名.class:最常用
类的对象.getClass()
34.市面上有比mabatis更好的,但是为什么还要使用mybatis
Hibernate
1.首先是运行速度,hibernate是在jdbc上进行了一次封装,而mybatis基于原生的jdbc,因此mybatis天生就有运行速度上的优势。
2.mybatis开放了插件接口。
3.Mybatis框架相对简单很容易上手
35.如何优化数据库查询
1.建立索引
2.改善SQL语句
36.Spring如何处理事务
1.Spring的事务机制包括声明式事务和编程式事务。
编程式事务管理:Spring推荐使用TransactionTemplate,实际开发中使用声明式事务较多。
声明式事务管理:将我们从复杂的事务处理中解脱出来,获取连接,关闭连接、事务提交、回滚、异常处理等这些操作都不用我们处理了,Spring都会帮我们处理。
声明式事务管理使用了AOP面向切面编程实现的,本质就是在目标方法执行前后进行拦截。在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或是回滚事务。
2.Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的。
1)PlatformTransactionManager:事务管理器–主要用于平台相关事务的管理
主要有三个方法:
commit 事务提交;
rollback 事务回滚;
getTransaction 获取事务状态。
2)TransactionDefinition:事务定义信息–用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用
这个接口有下面四个主要方法:
getIsolationLevel:获取隔离级别;
getPropagationBehavior:获取传播行为;
getTimeout:获取超时时间;
isReadOnly:是否只读(保存、更新、删除时属性变为false–可读写,查询时为true–只读)
事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。
3)TransactionStatus:事务具体运行状态–事务管理过程中,每个时间点事务的状态信息。
例如它的几个方法:
hasSavepoint():返回这个事务内部是否包含一个保存点,
isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚
isNewTransaction():判断当前事务是否是一个新事务
37.事务的4个特性
原子性:要么都成功,要么都失败
一致性:事务必须是数据库从一个一致状态变到另一个一致性状态
隔离性:一个事务的执行不能被其他事务干扰,并发执行的各个事务之间不能互相干扰
持久性:一个事务一旦提交,他对数据库中数据的改变是永久性的。
- 谈谈你对AOP和IOC的理解
Spring的两个重要特性
IOC:控制翻转,是一种设计思想。将创建对象交给Spring容器来管理,负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期
IOC的优点是什么?
IOC或依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。
AOP:面向切面编程,动态地将代码切入到类的指定方法、指定位置上的编程思想
AOP可以在系统启动时为目标类型创建子类或兄弟类型对象,这样的对象我们通常会称之为动态代理对象。
组合方式:借用JDK官方API(Proxy)为目标对象类型创建其兄弟类型对象,但是目标对象类型需要实现相应接口。
继承方式:借助CGLIB库(Enhancer)为目标对象类型创建其子类类型对象,但是目标对象类型不能使用final修饰。
AOP术语:切面,切入点,通知,连接点
39.nacos如何进行注册
1.下载nacos并成功启动,进入登录页面进行登录
2.在服务提供方和服务消费方的父工程中引入服务注册依赖
3.分别给两服务的配置文件汇总添加naocs服务地址
4.两服务的启动类上添加注解@EnableDiscoveryClient,注册nacos
40.vue的双向绑定原理
vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
41.什么是mvvm
MVVM是Model-View-ViewModel的缩写。MVVM是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来;ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,是一个同步View 和 Model的对象。View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
42.两种路由模式的区别
前端中存在着两种路由模式:一种是hash 路由模式另一种是 history 模式。
hash:hash路由虽然出现在url中,但是在请求的时候不会被包含在http请求中,对后端来说没有什么影响,所以从另一方面来说hash的改变不会重新加载页面
history:这种模式是利用H5中新增的pushState()和replaceState() 方法,这两个方法用于浏览器的历史记录栈,在当前已有的 back,forword,go基础上,提供了修改历史记录的功能,当执行修改的时候,虽然修改了当前的url ,浏览器不会立即向后端发送请求
43.路由的钩子函数
三个参数:
to:路由将要跳转的路径信息,信息是包含在对像里边的。
from:路径跳转前的路径信息,也是一个对象的形式。
next:路由的控制参数,常用的有next(true)和next(false)。
全局钩子:都会对所有的路由进行拦截,beforeEach:进入之前,afterEach:已经进入了
路由独享钩子:可以针对某一个路由进行拦截,这个需要写在路由规则里
组件内的守卫:针对组件进行拦截
44.vuex的一系列问题
Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采取集中式存储管理应用的所有组件的状态
state, getters, mutations, actions, modules。
1. state:vuex的基本数据,用来存储变量
2. geeter:从基本数据(state)派生的数据,相当于state的计算属性
3. mutation:提交更新数据的方法,必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数,提交载荷作为第二个参数。
4. action:和mutation的功能大致相同,不同之处在于 ==》1. Action 提交的是 mutation,而不是直接变更状态。 2. Action 可以包含任意异步操作。
5. modules:模块化vuex,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。
45.Synchronize和volatile有什么区别
synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问,也就无法并发执行。
volatile关键字解决的是内存可见性的问题,会使得所有对volatile变量的读写都会直接刷到主存,即保证了变量的可见性。
1.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
2.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
3.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化
46.Spring中如何开启一个事物
声明式事务管理:
1.基于Aspectj AOP开启事务,添加配置事务通知,aop代理事务,扫描指定路径下的所有方法
2.基于注解@Transactional
编程式事务管理:
1.使用 TransactionTemplate 事务模板对象
2.使用 事务管理器 PlatformTransactionManager 对象
47.防止重复提交用什么方法
1.给数据库增加唯一键约束
2.利用session防止表单重复提交
实现原理:
服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。当表单提交时会带上subToken,服务器拦截器Interceptor会拦截该请求,拦截器判断session保存的subToken和表单提交subToken是否一致。若不一致或session的subToken为空或表单未携带subToken则不通过。
首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。当再次提交表单时由于session的subToken为空则不通过。从而实现了防止表单重复提交。
48.Spring中事务标签有那些
@Transactional
49.Java中的HashMap的工作原理是什么
一,存储方式:Java中的HashMap是以键值对(key-value)的形式存储元素的。
二,调用原理:HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。
50.线程池有那些参数,什么参数
1.corePoolSize 线程池核心线程大小
2.maximumPoolSize 线程池最大线程数量
3.keepAliveTime 空闲线程存活时间
4.unit 空闲线程存活时间单位
5.workQueue 工作队列
6.threadFactory 线程工厂
7.handler 拒绝策略
51.简述springcloud
spring cloud 是一系列框架的有序集合。它利用 spring boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 spring boot 的开发风格做到一键启动和部署。
52.spring cloud 的核心组件有哪些?
Eureka:服务注册于发现。
Config:配置管理。
Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
Hystrix:断路器,限流熔断,保护系统,控制故障范围。提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
53.SpringCloud和Dubbo
SpringCloud和Dubbo都是现在主流的微服务架构
SpringCloud是Apache旗下的Spring体系下的微服务解决方案
Dubbo是阿里系的分布式服务治理框架
从技术维度上,其实SpringCloud远远的超过Dubbo,Dubbo本身只是实现了服务治理
54.Mybatis中动态SQL是什么意思?如何实现动态SQL?
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率
什么是动态sql?
1,根据用户输入参数等才能确定的语句,根据用户输入参数增删改查;
2,解决PL/SQL中不支持DDL语句的问题
如何实现动态SQL?
首先采用条件标签描述需要表达的语义,维护在配置文件中;初始化过程中,解析配置文件中的标签,生成sql配置对应的抽象语法树;请求处理过程中,根据参数对象解释该抽象语法树,生成当前请求的动态SQL语句。
55.Redis是什么?作用?优缺点?适用场景
Redis是什么
Redis是非关系型数据库,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
Redis的优点
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子性 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis的缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
Redis的应用场景有哪些?
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
Redis的数据类型
String类型、哈希类型、列表类型、集合类型和顺序集合类型。