面试:第六章:面试题收集

//面向对象:
面向对象的特征:1抽象性 2继承 3封装 4多态性
多态性的四种体现:1接口和接口的继承 2类和类的继承 3重载 4重写
重载在同一个类里同名形参列表不同,重写在实现类里面。

jvm:是Java Virtual Machine(Java虚拟机)的缩写,是整个Java实现跨平台的最核心的部分。JVM是Java平台的基础。
所有Java程序先编译为.class文件。
内存泄露与溢出的区别:
1内存泄露是指被分配出去的内存无法收回了。
2内存溢出是指程序要求的内存超过了系统所能分配的范围。
3内存溢出是提供的内存不够,内存泄漏是无法在提供内存资源。

GC线程是守护线程
GC是不确定的,当监控的对象确定为不可达时就有责任回收,但并不保证一定会运行。
Java理论上不会存在内存泄漏。
伊甸园,对象最初诞生的区域。
幸存者乐园,从伊甸园幸存的对象会挪到这里。
终生颐养园,足够老的幸存对象的归宿。

什么是JVM,什么是JDK,什么是JRE
JVM:Java Virtual Machine(Java虚拟机的缩写)
JRE:java runtime environment(Java运行环境的缩写)光有JVM还不能让class文件执行,还需要类库lib。
可以认为JDK目录里面jre目录里有两个文件夹,可以认为bin就是jvm,lib就是所需的类库。jvm和类库lib合起来就是JRE
JDK:java development kit(java开发工具包)
JDK包含JRE,JRE包含JVM。

Java程序从源文件创建到程序运行要经过两大步骤:1、源文件由编译器编译成字节码(ByteCode)  2、字节码由java虚拟机解释运行

JVM中类的加载是由ClassLoader和它的子类来实现的,Java ClassLoader是一个很重要的JAVA运行时系统组件。它负责在运行时查找和装入类文件的类。

双亲委派机制,ClassLoader类加载器用来加载类到虚拟机中,java文件经过编译器编译后转换成java.lang.Class类的一个实例。
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果可以完成成功返回,无法完成才自己去加载。

多线程与锁的问题:
实现多线程的方法有四种:1继承Thread类 2实现Runnable接口 3实现Callable接口通过FutrueTask包装器来创建Thread线程 4线程池比如ExectorService。

乐观锁和悲观锁
乐观锁:取数据的时候默认没有其他人去跟新这个数据,不会上锁,提高吞吐量。
悲观锁:默认上锁,如果数据间经常冲突就比较适合。

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这
个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。

不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

抽象类(abstract class)和接口(interface)有什么异同?
抽象类:
1.抽象类中可以定义构造器
2.可以有抽象方法和具体方法
3.接口中的成员全都是public的
4.抽象类中可以定义成员变量
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
6.抽象类中可以包含静态方法
7.一个类只能继承一个抽象类
接口:
1.接口中不能定义构造器
2.方法全部都是抽象方法
3.抽象类中的成员可以是 private、默认、protected、public
4.接口中定义的成员变量实际上都是常量
5.接口中不能有静态方法
6.一个类可以实现多个接口
相同:
1.不能够实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要
被声明为抽象类

 阐述静态变量和实例变量的区别?
静态变量: 是被 static 修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;
实例变量: 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对
象共享内存。

==和equals的区别?
equals和== 最大的区别是一个是方法一个是运算符。  
==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象
的地址值是否相等。
equals():用来比较方法两个对象的内容是否相等。
注意:equals 方法不能用于基本数据类型的变量,如果没有对 equals 方法进行重写,则比较的是引用类型的变
量所指向的对象的地址。

break和continue的区别?
break和continue都是用来控制循环的语句。
break用于完全结束一个循环,跳出循环体执行循环后面的语句。
continue用于跳过本次循环,执行下次循环。

Java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动
态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变
量的类型中定义的方法。

throw和throws的区别
throw:
1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
2)throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
1)throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
2)throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
3)throws表示出现异常的一种可能性,并不一定会发生这种异常。

final、finally、finalize的区别?
1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
2)finally:异常处理语句结构的一部分,表示总是执行。
3)finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法
提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法
被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对
象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。

String 、StringBuilder 、StringBuffer的区别?
Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们都可以储存和操作字符串,区别
如下。
1)String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。初学者可能会有这样的误解: 如上,字符串str明明是可以改变的呀!其实不然,str仅仅是一个引用对象,它指向一个字符串对象“abc”。第
二行代码的含义是让 str 重新指向了一个新的字符串“bcd”对象,而“abc”对象并没有任何改变,只不过该对象已
经成为一个不可及对象罢了。
2)StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
3)StringBuilder是Java5中引入的,它和 StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,
因为它的所有方法都没有被synchronized修饰,因此它的效率理论上也比StringBuffer要高。

Java中有几种类型的流
按照流的方向:输入流(inputStream)和输出流(outputStream)。
按照实现功能分:节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个
已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要
带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于
InputStreamReader 和OutputStreamWriter。

字节流和字符流的区别
字节流可以处理所有类型数
据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符
流,除此之外都用字节流。字节流主要是操作 byte类型数据,以 byte 数组为准,主要操作类就是OutputStream、
InputStream

什么是java序列化,如何实现java序列化?实现 Serializable 接口
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读
写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

java集合类:集合类型主要有3种:set(集)、list(列表)和map(映射)。
List总结,所有的List中只能容纳单个不同类型的对象组成的表,可以有相同的元素,基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
Set总结,Set实现的基础是Map(HashMap);Set中的元素是不能重复的,

多线程基础:
1继承Thread类创建线程,写run方法,然后new Thread,.start();
2实现Runnable接口创建线程,重写run方法,new Thread,.start();
3通过Callable和FutureTask创建线程
4通过线程池创建线程
同步的实现方面有两种,分别是 synchronized,wait与 notify
wait():使一个线程处于等待状态,并且释放所持有的对象的 lock
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法
notify():唤醒一个处于等待状态的线程
最大的不同是在等待时wait会释放锁,而sleep一直持有锁。wait通常被用于线程间交互,sleep通常被用于暂
停执行。
线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用new线程而是直接去池中拿线程即可,节
省了开辟子线程的时间,提高的代码执行效率。

在有些情况下死锁是可以避免的。两种用于避免死锁的技术: 加锁顺序/加锁时限

进程就是一段程序的执行过程,线程时进程的一个执行单位。

启动一个线程是调用 start()方法

说说你对Java中反射的理解
反射机制指的是程序在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。

动态代理(以下称代理),利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象)
代理的是接口(Interfaces),不是类(Class),更不是抽象类。
反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。

设计模式有哪些 :工厂模式/单例模式
单例模式分为懒汉式和饿汉式
饿汉式直接创建对象,私有化构造器。懒汉式声明变量,私有化构造器,提供对外方法。
工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

栈stack:由系统自动分配,堆heap:需要程序员自己申请。
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空
间;而通过new关键字和构造器创建的对象则放在堆空间

是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char

原生jdbc操作数据库流程?
第一步:Class.forName()加载数据库连接驱动;
第二步:DriverManager.getConnection()获取数据连接对象;
第三步:根据SQL获取sql会话对象
第四步:执行SQL处理结果集,执行SQL前如果有参数值就设置参数值setXXX();
第五步:关闭结果集、关闭会话、关闭连接。

Http 协议 (超文本传输协议)
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。
由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;
异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

http常见的状态码
200 OK      //客户端请求成功
302 found 重定向
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

GET和POST的区别?
1. GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间
以&相连,如:login.action?name=zhagnsan&password=123456。POST把提交的数据则放置在是HTTP包的包
体中。
2. GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据。
3.POST的安全性要比GET的安全性高。

http中重定向和请求转发的区别?
本质区别:转发是服务器行为,重定向是客户端行为。
重定向两次请求

Cookie和Session的区别
Cookie 是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。
Session 是存储在 web 服务器端的一块信息。

1、无论客户端做怎样的设置,session都能够正常工作。当客户端禁用cookie时将无法使用cookie。
2、在存储的数据量方面:session能够存储任意的java对象,cookie只能存储String类型的对象。

分布式如何实现session共享
在单点登录中,如果cookie被禁用了怎么办?
单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie,
然后服务端从 cookie 里获取 session ID,再查询到用户信息。所以,保持登录的关键不是 cookie,而是通过
cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。除了 cookie,还通常使用 HTTP 请求头来传
输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。

什么是jsp,什么是Servlet?jsp和Servlet有什么区别?
jsp本质上就是一个Servlet,它是Servlet的一种特殊形式(由SUN公司推出),每个jsp页面都是一个servlet
实例。
Servlet是由 Java提供用于开发 web服务器应用程序的一个组件,运行在服务端,由servlet 容器管理,用来生
成动态内容。一个 servlet 实例是实现了特殊接口 Servlet 的 Java 类,所有自定义的 servlet 均必须实现 Servlet 接
口。

区别:
jsp是html页面中内嵌的Java代码,侧重页面显示;  
Servlet是html代码和Java代码分离,侧重逻辑控制

jsp有哪些域对象和内置对象及他们的作用?
内置对象:page/exception/application/pagecontext/session/config/request/response
四大域对象:
(1)pageContext  page域-指当前页面,在当前jsp页面有效,跳到其它页面失效
(2)request request域-指一次请求范围内有效,从http请求到服务器处理结束,返回响应的整个过程。
在这个过程中使用forward(请求转发)方式跳转多个jsp,在这些页面里你都可以使用这个变量
(3)session session域-指当前会话有效范围,浏览器从打开到关闭过程中,转发、重定向均可以使用
(4)application context域-指只能在同一个web中使用,服务器未关闭或者重启,数据就有效

什么是xml,使用xml的优缺点,xml的解析器有哪几种,分别有什么区别?
xml是一种可扩展性标记语言,支持自定义标签
优点:用于配置文件,格式统一,符合标准
缺点:xml文件格式复杂,数据传输占流量

Xml常用解析器有2种,分别是:DOM和SAX;

Ajax是一种创建交互式网页应用的的网页开发技术;Asynchronous JavaScript and XML”的缩写。
Ajax的优势:
通过异步模式,提升了用户体验。
优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。
Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
Ajax的最大特点:
可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。

jsonp原理
JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的安全性限制,
被称为“Same-Origin Policy”(同源策略)。这一策略对于JavaScript代码能够访问的页面内容做了很重要的
限制,即JavaScript只能访问与包含它的文档在同一域下的内容。

jsonp 的最基本的原理是:动态添加一个<script>标签,使用 script 标签的 src 属性没有跨域的限制的特点实现跨域。首先在客户端注册一个 callback, 然后把 callback 的名字传给服务器。此时,服务器先生成 json 数
据。 然后以 javascript 语法的方式,生成一个 function , function 名字就是传递上来的参数 jsonp。最后将
json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义
好的 callback 函数里。

常用的Linux命令
列出文件列表:ls 【参数 -a -l】
创建目录和移除目录:mkdir  rmdir
用于显示文件后几行内容:tail
打包:tar -xvf
打包并压缩:tar -zcvf
查找字符串:grep
显示当前所在目录:pwd
创建空文件:touch
编辑器:vim  vi
列出文件列表:ls 【参数 -a -l】
创建目录和移除目录:mkdir  rmdir
用于显示文件后几行内容:tail
打包:tar -xvf
打包并压缩:tar -zcvf
查找字符串:grep
显示当前所在目录:pwd
创建空文件:touch
编辑器:vim  vi

Mybatis 框架中的mapper 方式中的 # 也能很大程度的防止sql注入($无法防止sql注
入)。

Mysql性能优化
1、当只要一行数据时使用limit 1
3. 用not exists代替not in
4. 对操作符的优化,尽量不采用不利于索引的操作符
如:in    not in    is null    is not null    <>  等

在千万级的数据库查询中,如何提高效率?
使用explain sql 来分析sql语句

1)数据库设计方面
a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。  
b. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
c. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询
可能不会去利用索引
d. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的
效率
e. 应尽可能的避免更新索引数据列
f. 尽量使用数字型字段

Spring 框架就像一个家族,有众多衍生产品例如 boot、security、jpa等等。但他们的基础都是Spring 的ioc和 aop,ioc 提供了依赖注入的容器, aop解决了面向横切面的编程,然后在此两者的基础上实现了其他延伸产品的高级功能。

Spring MVC提供了一种轻度耦合的方式来开发web应用。它是Spring的一个模块,是一个web框架。

Spring Boot实现了自动配置,降低了项目搭建的复杂度。它主要是为了解决使用Spring框架需要进行大量的配置太麻烦的问题,所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。

Spring 是一个“引擎”;

Spring MVC 是基于Spring的一个 MVC 框架;

Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

SpringMVC的工作原理
a. 用户向服务器发送请求,请求被springMVC前端控制器DispatchServlet捕获;  
b. DispatcherServle对请求URL进行解析,得到请求资源标识符(URL),然后根据该URL调用HandlerMapping
将请求映射到处理器HandlerExcutionChain;
c. DispatchServlet根据获得Handler选择一个合适的HandlerAdapter适配器处理;
d. Handler对数据处理完成以后将返回一个ModelAndView()对象给DisPatchServlet;
e. Handler 返回的 ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet 通过
ViewResolver试图解析器将逻辑视图转化为真正的视图View;
h. DispatcherServle 通过 model 解析出 ModelAndView()中的参数进行解析最终展现出完整的 view 并返回给
客户端;

开启注解处理器和适配器
 springmvc.xml 中通过开启 <mvc:annotation-driven>来实现注解处  
理器和适配器的开启。

如何解决get和post乱码问题?
解决 post 请求乱码:我们可以在 web.xml 里边配置一个 CharacterEncodingFilter 过滤器。 设置为 utf-8.  
解决 get 请求的乱码:有两种方法。对于 get 请求中文参数出现乱码解决方法有两个:  
1. 修改 tomcat 配置文件添加编码与工程编码一致。  
2. 另 外 一 种 方 法 对 参 数 进 行 重 新 编 码 String userName = New
String(Request.getParameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);

谈谈你对Spring的理解
Spring是一个开源框架,为简化企业级应用开发而生。Spring是一个IOC和AOP容器框架。

在Spring容器中为一个bean配置依赖注入有三种方式:
· 使用属性的setter方法注入  这是最常用的方式;
· 使用构造器注入;
· 使用Filed注入(用于注解方式).

Spring容器的主要核心是:
控制反转(IOC)
依赖注入(DI)面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象。而在面向切面编程
中,我们将一个个的对象某些类似的方面横向抽成一个切面,对这个切面进行一些如权限控制、事物管理,记录日志等
公用操作处理的过程就是面向切面编程的思想。AOP底层是动态代理

Spring中的设计模式
1单例模式 2模板方式模式 3前端控制器模式 4试图帮助 5依赖注入 6工厂模式

简单介绍一下Spring bean的生命周期
1bean定义 2bean初始化 3bean调用 4bean销毁

spring结构
(1)核心容器:包括Core、Beans、Context、EL模块。
(2)AOP、Aspects模块:

Spring能帮我们做什么?
Spring能帮我们根据配置文件创建及组装对象之间的依赖关系
Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制
Spring能非常简单的帮我们管理数据库事务
Spring还能与第三方数据库访问框架(如Hibernate、JPA)无缝集成
Spring还能与第三方Web(如Struts、JSF)框架无缝集成

Spring配置文件有什么作用?
Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。

 什么是Spring IOC 容器
IOC 控制反转:Spring IOC 负责创建对象,管理对象。通过依赖注入(DI),装配对象,配置对象,并且管理这
些对象的整个生命周期。

 IOC的优点是什么?
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试

什么是Spring的依赖注入?
,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而
是通过 spring 容器帮我们 new 指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反
转”

Mybatis中#和$的区别?
#相当于对数据 加上 双引号,$相当于直接显示数据
 #方式能够很大程度防止sql注入。
.$方式无法防止Sql注入
$方式一般用于传入数据库对象
一般能用#的就别用$.

Mybatis的编程步骤是什么样的?
1、创建SqlSessionFactory
2、通过SqlSessionFactory创建 SqlSession
3、通过sqlsession执行数据库操作
4、调用session.commit()提交事务
5、调用session.close()关闭会话

使用MyBatis的mapper接口调用时有哪些要求?
1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
4. Mapper.xml文件中的namespace即是mapper接口的类路径。

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。
MyBatis中用于实现动态SQL的元素标签主要有:

if
where
set
choose(when,otherwise)
trim
foreach

Redis的特点?
内存高速缓存数据库
该软件使用C语言编写,典型的NoSQL数据库服务器,Redis是一
个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和
数据持久化的特征。

Redis常见的性能问题都有哪些?
(1)、Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是
非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
(2)、Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会
不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF
日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一
次。
(3)、Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服
务load过高,出现短暂服务暂停现象。
(4)、Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域
网内

Redis最适合的场景有哪些?
(1)、会话缓存(Session Cache)
(2)、全页缓存(FPC)
(3)、队列
(4)、排行榜/计数器
(5)、发布/订阅

Redis的数据结构有五种
String——字符串
String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可
以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。
 Hash——字典
在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值
(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。
 List——列表
List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。
Set——集合
Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集
合性的数据。
Sorted Set——有序集合
和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进
行有序排列

Redis的优缺点
a) 性能极高 – Redis 能支持超过 100K+ 每秒的读写频率。
b) 丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets数据类型操作。
 c) 原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。

Redis的持久化
RDB 持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照
AOF 持久化:记录服务器执行的所有写操作命令

消息队列 ActiveMQ 如何使用ActiveMQ解决分布式事务?
在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作:
1. 收集用户录入信息,保存到数据库
2. 向用户的手机或邮箱发送验证码
等等…

但是在分布式架构中,用户和发送验证码是两个独立的服务,它们都有各自的数据库,那么就不能通过本地事物
保证操作的原子性。这时我们就需要用到ActiveMQ(消息队列)来为我们实现这个需求。
 
在用户进行注册操作的时候,我们为该操作创建一条消息,当用户信息保存成功时,把这条消息发送到消息队列。
验证码系统会监听消息,一旦接受到消息,就会给该用户发送验证码。

1.如何防止消息重复发送?
解决方法很简单:增加消息状态表。通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去
状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。

Dubbo
dubbo reference注解问题
@Reference 只能在 springbean 实例对应的当前类中使用

dubbo的启动流程
1服务端开始启动,向注册中心(zookeeper)进行注册
2消费者向注册中心订阅服务端自己所需要的服务
3注册中心接收到会以(notify)通知方式通知消费者
4消费者开始向服务端消费自己所需要的服务
5同时,异步的向监控中心记录下有多少服务端在启动,多少消费者在消费。

Dubbo的客户端和服务端有三种连接方式,分别是:广播,直连和使用zookeeper注册中心

Dubbo注册中心和广播注册中心配置类似,不过需要指定注册中心类型和注册中心地址,这个时候就不是把服务
信息进行广播了,而是告诉给注册中心进行管理,这个时候我们就需要有一个注册中心。
官方推荐使用zookeeper作为注册中心。

调用关系说明:
1)服务容器负责启动,加载,运行服务提供者。
2)服务提供者在启动时,向注册中心注册自己提供的服务。
3)服务消费者在启动时,向注册中心订阅自己所需的服务。
4)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台
调用。
6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Nginx反向代理为什么能够提升服务器性能?
对于后端是动态服务来说,Nginx 有个好处是它会把 Request 在读取完整之前 buffer 住,这样交给后端的就是一个完整的 HTTP  
请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。 同样,Nginx 也可以把
response 给 buffer 住,同样也是减轻后端的压力。

负载均衡策略
1、轮询:这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。
2、最少连接:把请求分配到连接数最少的server
3、权重:使用weight来指定server访问比率
4、ip_hash:每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。

Zookeeper
简单介绍一下zookeeper以及zookeeper的原理
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务
ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、 功能稳定的系统提供给用户

znode节点每个代表一个属性,包含当前版本,数据版本,建立时间和修改时间等

 

Activity 工作流
工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触
发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人
与软件系统协作完。

tomcat集群
单一服务器终究无法满足需要处理的负荷量
修改 tomcat1, tomcat2 的 server.xml 文件添加集群内容

在 web 开发中,如果对象被保存在了 Session 中,tomcat 在重启时要把 Session 对 象序列化到硬盘,这个对象就必须实现 Serializable 接口。如果对象要经过分布式系统进行 网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现 Serializable 接口。
 
Java中的String,StringBuilder,StringBuffer三者的区别
速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的(StringBuffer中很多方法可以带有synchronized关键字)
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

elasticSearch
倒排索引是搜索引擎的基石,也是Elasticsearch能实现快速全文搜索的根本。归纳起来,主要是对一个文档内容做两步操作:分词、建立“单词-文档”列表

线程安全性概念
线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
相反地,
线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得的数据是脏数据。

Java基础——6种常用类讲解
一、System类
二、Runtime类
三、Date类和SimpleDateFormat
四、Calendar类
五、Math类
六、Random类

Java常用的八种排序算法与代码实现
1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序
总结:
一、稳定性:
 稳定:冒泡排序、插入排序、归并排序和基数排序
不稳定:选择排序、快速排序、希尔排序、堆排序
二、平均时间复杂度
O(n^2):直接插入排序,简单选择排序,冒泡排序。
在数据规模较小时(9W内),直接插入排序,简单选择排序差不多。当数据较大时,冒泡排序算法的时间代价最高。性能为O(n^2)的算法基本上是相邻元素进行比较,基本上都是稳定的。
O(nlogn):快速排序,归并排序,希尔排序,堆排序。
其中,快排是最好的, 其次是归并和希尔,堆排序在数据量很大时效果明显。
三、排序算法的选择
1.数据规模较小
1)待排序列基本序的情况下,可以选择直接插入排序;
2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡
2.数据规模不是很大
1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。
2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序
3.数据规模很大
1)对稳定性有求,则可考虑归并排序。2)对稳定性没要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡

servlet的生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止

tcp是网络传输协议
http是超文本传输协议

关系型数据库
增删改查

Servlet的生命周期
1.创建Servlet对象,通过服务器反射机制创建Servlet对象,第一次请求时才会创建。(默认)
2,调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次;
3,响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。
4,? 在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。

Java中的四个核心技术思想
虚拟机
API
类装载器的体系结构
class文件

 


简历:
用explain分析查询语句,查看type查看连接使用了哪些类别,有无使用索引,system/const/eq_ref/ref/range/index/all
mysql通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
EXPLAIN可以帮助开发人员分析SQL问题,explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上Explain就可以了
使用方式主要是乐观锁和悲观锁。

1. 什么是spring?
java企业级应用的开源开发框架

2. 使用Spring框架的好处是什么?
轻量级/控制反转IOC,不用去创建对象等/面向切面编程AOP,将业务逻辑和系统服务分开/有容器管理对象生命周期和配置/有MVC框架,web框架的替代品/事务管理/统一的一场管理

9. 解释对象/关系映射集成模块
契合mybatis,支持主流的ORM框架

10.  解释WEB 模块
透明的处理各种请求

13.  什么是Spring IOC 容器?
负责创建对象,管理配置对象

14.  IOC的优点是什么?
将代码量降到最低,容易测试

17. 一个Spring的应用看起来象什么?
一个定义了功能的接口,实现各种,包括属性,方法等

18. 什么是Spring的依赖注入?
DI是IOC的一个方面,不用主动去创建对象

19.  有哪些不同类型的IOC(依赖注入)方式?
构造器注入,setter注入

24. 你怎样定义类的作用域?
在<bean>标签里面定义

27. 解释Spring框架中bean的生命周期
实例化,调用,销毁

51.  解释AOP
面向切面的编程,将业务逻辑和系统服务分开

64. 什么是Spring的MVC框架?
配备的构建Web应用的全功能MVC框架,清晰的将业务逻辑和控制逻辑分开。

65. DispatcherServlet
用来处理所有的http请求和响应。

67. 什么是Spring MVC框架的控制器?
控制器提供访问应用程序的行为,这个行为通过服务接口实现,控制视图解析器解析然后呈现一个完整的视图


spring的工作原理:有IOC反转控制,AOP面向切面编程,利用了反射,在运行时动态的去创建对象,调用对象的方法,就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理


mybatis定制了sql存储过程和高级映射
使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

 

 

项目一
采用了SpringBoot+Dubbo+Zookeeper作为底层架构,Dubbo是作为服务之间的通信,Zookeeper作为注册中心。
采用了SOA分布式架构,为不同模块定义接口,功能模块有很多,例如后台管理模块,经销商模块,订单模块,购物车模块,前台系统,支付模块,搜索模块等
该系统用mybatis处理数据库层的操作,后台的页面用了easyui来做,里面一些功能是有表的就用了easyui的分页插件查询,后端控制的用的是mybatis的PageHelper分页。
将数据封装传输到页面显示。用了pagehelper的工具类将其封装。
redis是key-value型数据库
使用 Redis 做为缓存服务器,提高系统访问率。Redis分布式锁,同一时间下只有一个线程能使用相应的代码块。当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
使用es先将数据库已存在的商品列表分词封装,放进es数据库里,大大提高了商品检索效率。如果后台管理添加了新的产品信息,更新数据库时附带插入新的es数据
使用了nginx反向代理,通过轮询的方式实现负载均衡,提高了系统并发处理能力。
用了fastfds插件整合在后台模块的model里,用来储存商品的图片信息,头像信息等。提高了图片的处理能力,在linux上配置好相应的储存节点
后台管理模块:
商品列表管理,简单的增删改查按钮,多级分类连级不同的属性展示不同的商品列表,编辑spu属性用了easyui的dialog配合动态网格增加删除行列来修改属性值,提交后数据库修改
spu管理是具体的商品详情管理,同样三级连级属性查询,一件商品有很多的属性,例如用了fastfds储存图片信息等
这里面还有库存管理sku属性,添加相应的规格属性和数量,也是用dialog,提交就修改数据库
物资详情页显示,后台提取封装每个类型产品的属性作为筛选条件,条件动态展示,
筛选用了面包屑,还用进去单独产品页可以进行属性挑选,不同的产品不同的条件,根据产品的spu属性决定,会提示是否有库存
搜索模块用了es,es是一个nosql数据库,动态的将数据库的产品数据封装分词放进去,通过全页查询可以查询出关键字产品。