精华内容
下载资源
问答
  • Java面试宝典

    万次阅读 多人点赞 2018-11-10 23:49:18
    Java 基础-------------------------------------------------------------------------------------------------- 1 基本数据类型----------------------------------------------------------------------------...

    Java 基础-------------------------------------------------------------------------------------------------- 1

    基本数据类型--------------------------------------------------------------------------------------------- 1

    包装类型--------------------------------------------------------------------------------------------------- 1

    集合--------------------------------------------------------------------------------------------------------- 2

    多线程------------------------------------------------------------------------------------------------------ 2

    生命周期--------------------------------------------------------------------------------------------------- 2

    热门面试问题:------------------------------------------------------------------------------------------ 3

    1、什么是 GC?为什么要有 GC--------------------------------------------------------------------- 3

    2、final, finally 和 finalize 的区别?----------------------------------------------------------------- 3

    3、什么是单例模式?实现步骤----------------------------------------------------------------------- 3

    4、ArrayList 和 LinkedList 有何区别?------------------------------------------------------------- 3

    5、HashMap 和 Hashtable 的区别?--------------------------------------------------------------- 3

    6、Iterater 和 ListIterator 之间有什么区别?------------------------------------------------------ 4

    7、创建线程的方式?----------------------------------------------------------------------------------- 4

    8、什么是死锁?----------------------------------------------------------------------------------------- 4

    9、wait()与 sleep()的区别?--------------------------------------------------------------------------- 4

    10、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的区别?------------------------- 4

    Java Web--------------------------------------------------------------------------------------------------- 5

    Ajax---------------------------------------------------------------------------------------------------------- 5

    JQuery ------------------------------------------------------------------------------------------------------5

    Cookie------------------------------------------------------------------------------------------------------ 5

    Session----------------------------------------------------------------------------------------------------- 6

    热门面试问题:------------------------------------------------------------------------------------------- 6

    1、原生态 Ajax 执行流程?---------------------------------------------------------------------------- 6

    2、转发(forward)和重定向(redirect)的区别?---------------------------------------------- 6

    3、怎么防止表单重复提交?--------------------------------------------------------------------------- 7

    4、web.xml 文件中可以配置哪些内容?------------------------------------------------------------ 7

    数据库(MySQL) ----------------------------------------------------------------------------------------7

    连接查询----------------------------------------------------------------------------------------------------- 7
    内连接-------------------------------------------------------------------------------------------------------- 7

    外连接-------------------------------------------------------------------------------------------------------- 7

    联合查询----------------------------------------------------------------------------------------------------- 8

    索引----------------------------------------------------------------------------------------------------------- 9

    数据库引擎-------------------------------------------------------------------------------------------------- 9

    存储过程----------------------------------------------------------------------------------------------------- 9

    热门面试问题:------------------------------------------------------------------------------------------- 10

    1、JDBC 编程的步骤?--------------------------------------------------------------------------------- 10

    2、事务的 ACID 是什么?事务并发会产生哪些问题?------------------------------------------ 10

    3、数据库性能优化有哪些方式?--------------------------------------------------------------------- 10

    框架部分----------------------------------------------------------------------------------------------------- 11

    Spring-------------------------------------------------------------------------------------------------------- 11

    Spring 的理解----------------------------------------------------------------------------------------------- 11

    Spring Bean 生命周期------------------------------------------------------------------------------------ 12

    Spring 中的设计模式-------------------------------------------------------------------------------------- 12

    Spring 注解-------------------------------------------------------------------------------------------------- 12

    Spring 事务-------------------------------------------------------------------------------------------------- 13

    SpringMVC-------------------------------------------------------------------------------------------------- 14

    SpringMVC 执行流程------------------------------------------------------------------------------------- 14

    springmvc 常用注解--------------------------------------------------------------------------------------- 14

    SpringMVC 和 Struts2 对比----------------------------------------------------------------------------- 15

    Mybatis -------------------------------------------------------------------------------------------------------15

    Mybatis 的理解--------------------------------------------------------------------------------------------- 15

    Mybatis 缓存 ------------------------------------------------------------------------------------------------16

    SpringBoot-------------------------------------------------------------------------------------------------- 16

    SpringBoot 简介------------------------------------------------------------------------------------------- 16

    SpringBoot 特性 -------------------------------------------------------------------------------------------16

    SpringBoot 核心 -------------------------------------------------------------------------------------------16

    SpringCloud ------------------------------------------------------------------------------------------------17

    SpringCloud 简介 -----------------------------------------------------------------------------------------17

    SpringCloud 核心组件 -----------------------------------------------------------------------------------17
    微服务 -------------------------------------------------------------------------------------------------------17

    Docker -------------------------------------------------------------------------------------------------------17

    Docker 简介 ------------------------------------------------------------------------------------------------17

    Docker 理解 ------------------------------------------------------------------------------------------------17

    Redis ---------------------------------------------------------------------------------------------------------24

    Redis 简介 --------------------------------------------------------------------------------------------------24

    Redis 支持的数据类型 -----------------------------------------------------------------------------------24

    Redis 应用场景 --------------------------------------------------------------------------------------------24

    Redis 持久化 -----------------------------------------------------------------------------------------------24

    Redis 的优势 -----------------------------------------------------------------------------------------------24

    Solr -----------------------------------------------------------------------------------------------------------25

    Solr 简介 ----------------------------------------------------------------------------------------------------25

    Solr 配置 ----------------------------------------------------------------------------------------------------25

    倒排索引 ----------------------------------------------------------------------------------------------------25

    RabbitMQ/ActiveMQ -------------------------------------------------------------------------------------26

    RabbitMQ 简介 --------------------------------------------------------------------------------------------26

    RabbitMQ 特点 --------------------------------------------------------------------------------------------26

    RabbitMQ 工作模式 --------------------------------------------------------------------------------------26

    ActiveMQ 简介 ---------------------------------------------------------------------------------------------27

    ActiveMQ 工作模式 ---------------------------------------------------------------------------------------27
    MQ 对比 -----------------------------------------------------------------------------------------------------27

    Dubbo --------------------------------------------------------------------------------------------------------27

    Dubbo 简介 -------------------------------------------------------------------------------------------------27

    Dubbo 开发流程 -------------------------------------------------------------------------------------------28

    FastDFS -----------------------------------------------------------------------------------------------------28

    FastDFS 简介 ----------------------------------------------------------------------------------------------28

    文件上传流程 -----------------------------------------------------------------------------------------------29

    Nginx ---------------------------------------------------------------------------------------------------------29

    Nginx 简介 --------------------------------------------------------------------------------------------------29

    Nginx 功能 --------------------------------------------------------------------------------------------------29

    Quartz -------------------------------------------------------------------------------------------------------30

    Quartz 简介 ------------------------------------------------------------------------------------------------30

    Quartz 核心元素 ------------------------------------------------------------------------------------------30

    数据库笔试题 ----------------------------------------------------------------------------------------------31

    用一条 SQL 语句查询出每门课都大于 80 分的学生姓名 ---------------------------------------31

    所有球队之间的比赛组合 -------------------------------------------------------------------------------31

    显示文章标题,发帖人、最后回复时间 -------------------------------------------------------------31

    航空网的几个航班查询题 -------------------------------------------------------------------------------32


    Java 基础

    基本数据类型:

    在这里插入图片描述

    包装类型:

    包装类型是对基本数据类型不足之处的补充。

    基本数据类型的传递方式是值传递,而包装类型是引用传递,同时提供了很多数据类型间转换的方法。

    Java1.5 以后可以自动装箱和拆箱。

    集合

    在这里插入图片描述

    List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。

    Set:无序、不可重复。

    Map:键值对、键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对 map 集合遍历时先得到键的 set 集合,对 set 集合进行遍历,得到相应的值。

    多线程

    在这里插入图片描述

    新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序 start 这个线程。

    运行状态:当一个新状态的线程被 start 以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务

    就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。

    休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的时间发生了,该状态的线程切换到运行状态。

    终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。


    热门面试问题:

    1、什么是 GC?为什么要有 GC?

    GC(Garbage Collection)是垃圾收集的意思,负责清除对象并释放内存。Java 提供的 GC 功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的,从而防止内存泄漏。

    2、final, finally 和 finalize 的区别?

    final 用于声明属性,方法和类,表示属性不可变,方法不可被重写,类不可被继承。

    finally 是异常处理语句结构的一部分,表示总是执行。

    finalize 是 object 类的一个方法,在垃圾收集器执行的时候会调用这个对象回收的方法,工垃圾收集时其他资源的回收,比如关闭文件。

    3、什么是单例模式?实现步骤?

    单例模式保证了对象唯一。分为懒汉式(在类加载时不初始化)和饿汉式(在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快)。

    实现步骤:私有化构造函数、创建一个静态的私有对象、提供公共的访问方法。

    4、ArrayList 和 LinkedList 有何区别?

    ArrayList 是基于动态数组的数据结构,LinkedList 是基于链表的数据结构;对于随机访问 get 和 set,ArrayList 较优,因为 LinkedList 要移动指针;对于新增和删除操作 add 和 remove,LinedList 较优,因为ArrayList 要移动数据。

    5、HashMap 和 Hashtable 的区别?

    HashMap 允许空键值,Hashtable 不允许;

    HashMap 继承自 AbstractMap,Hashtable 继承自 Dictionary 类,两者都实现了 Map 接口; HashMap 的方法不是同步的,Hashtable 的方法是同步的。

    6、Iterater 和 ListIterator 之间有什么区别?

    Iterator 用来遍历 Set 和 List 集合,而 ListIterator 只能遍历 List; Iterator 只可以向前遍历,而 LIstIterator 可以双向遍历;ListIterator 从 Iterator 接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

    7、创建线程的方式?

    继承 Thread 类

    实现 Runnable 接口

    使用 Executor 框架

    8、什么是死锁?

    两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。

    9、wait()与 sleep()的区别?

    sleep()来自 Thread 类,wait()来自 Object 类;

    调用 sleep()方法,线程不会释放对象锁。而调用 wait 方法线程会释放对象锁;

    sleep()睡眠后不出让系统资源,wait 让其他线程可以占用 CPU;

    sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒。而 wait()需要配合 notify()

    或者 notifyAll()使用。

    10、什么是 ThreadLocal?ThreadLocal 和 Synchonized 的区别?

    线程局部变量。是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。

    synchronized 是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而 ThreadLocal 为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。


    Java Web

    Ajax

    AJAX = Asynchronous JavaScript and XML(异步 JavaScript 和 XML)。

    Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据,然后用 Javascript 来操作 DOM 而更新页面。这其中最关键的一步就是从服务器获得请求数据。

    XmlHttpRequest 是 ajax 的核心机制,它是在 IE5 中首先引入的,是一种支持异步请求的技术。简单的说,也就是 Javascript 可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。
    在这里插入图片描述

    JQuery

    JQuery 是一个 JavaScript 库。功能包括 HTML 元素选取和操作、CSS 操作、HTML 事件函数、 JavaScript 特效和动画、HTML DOM 遍历和修改、AJAX 和 Utilities。除此之外,JQuery 还提供了大量插件。

    基础语法: $(selector).action()。

    选择器:主要分四大选择器,分别是基本选择器、层次选择器、过滤选择器、属性过滤选择器。

    事件:例如 click()、dblclick()、mouseenter()、mouseleave()、mousedown()等。

    Cookie

    在 web 程序中是使用 HTTP 协议来传输数据的,因为 http 是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,cookie 技术则弥补了这一缺陷。

    cookie 实际上一段的文本信息,客户端请求服务器。如果服务器需要记录该用户的状态,就使用 response 向客户端浏览器颁发一个 cookie。客户端浏览器会把 cookie 保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 cookie 一同提交给服务器。服务器检查该 cookie,以此来辨认用户的状态。服务器还可以根据需要修改 cookie 的内容。
    cookie 生命周期:

    cookie 的 maxAge 决定 cookie 的生命周期,单位为秒(second)。cookie 通过 getMaxAge() 方法和 setMaxAge()方法来获得 maxAge 属性,如果 maxAhe 属性为正,则表示 cookie 会在 maxAge 秒之后自动失效。如果 maxAge 属性为负,则说明 cookie 仅在本浏览器窗口和本窗口打开的子窗口下有效,关闭窗口 cookie 则失效。maxAge 的默认值是-1 当 maxAge 的值为 0 时,表示删除 cookie。

    Session

    session 也是一种记录客户状态的机制,不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器是时候把客户端信息以某种形式记录在服务器上,这就是 session 中查找该客户的状态。

    session 生命周期:

    session 保存在服务器端,为了获得更高的存取速度,服务器一般把 session 放在内存。每个用户都会有一个独立的 session,如果 session 内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。

    session 在用户第一次访问服务器的时候自动创建,需要注意只有访问 JSP,Servlet 等程序时才会创建 session;只要访问 HTML、IMAGE 等静态资源不会创建 session。如果尚未生成session,可以使用 request.getSession(true)强制生成 session。

    session 生成后,只要用户访问,服务器就会更新 session 的最后访问时间,并维护该 session。用户每访问服务器一次,无论是否续写 session 服务器都认为该用户的 session 活跃(active)了一次。

    Session 对应的类是 javax.servlet.http.HttpSession,每一个访问者都对应一个 session 对象,并将其状态信息保存在这个 session 对象中,session 对象的创建是在用户第一次访问服务器时产生的。


    热门面试问题:

    1、原生态 Ajax 执行流程?

    创建 XMLHttpRequest 对象;

    注册回调函数;

    设置连接信息;

    发送数据,与服务器开始交互;

    接受服务器返回数据。

    2、转发(forward)和重定向(redirect)的区别?

    forward 是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。

    redirect 就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显 redirect 无法访问到服务器保护起来资源,但是可以从一个网站 redirect 到其他网站。

    3、怎么防止表单重复提交?

    i.禁掉提交按钮。表单提交后使用 Javascript 使提交按钮 disable。

    ii.Post/Redirect/Get 模式。在提交后执行页面重定向,这就是所谓的 Post-Redirect-Get (PRG) 模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

    iii.在 session 中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在 session 中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从 session 中删除它,然后正常处理数据。

    4、web.xml 文件中可以配置哪些内容?

    web.xml 用于配置 Web 应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等。


    数据库(MySQL)

    连接查询

    分类:内连接、外连接、自然连接(略)、交叉连接(略)。

    内连接

    基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;

    从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留。

    外连接

    基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

    left join: 左外连接(左连接), 以左表为主表

    right join: 右外连接(右连接), 以右表为主表

    以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接:不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其他表的字段都置空 NULL。
    在这里插入图片描述
    左外连接在这里插入图片描述
    右外连接在这里插入图片描述

    联合查询

    基本语法:

    		Select 语句 1
    		
    		Union [union 选项]
    		
    		Select 语句 2
    		
    		……
    
    

    将多次查询(多条 select 语句), 在记录上进行拼接(字段不会增加),每一条 select 语句获取的字段数必须严格一致(但是字段类型无关)。

    其中 union 选项有 2 个。ALL:保留所有;Distinct(默认):去重。

    应用:查询同一张表,但是有不同的需求;查询多张表,多张表的结构完全一致,保存的数据也是一样的。

    在联合查询中,order by 不能直接使用。需要对查询语句使用括号才行。另外需要配合 limit 使用。

    索引

    如果说数据库表中的数据是一本书,那么索引就是书的目录。索引能够让我们快速的定位想要查询的数据。

    索引的结构:BTree 索引和 Hash 索引。

    MyISAM 和 InnoDB 存储引擎:只支持 BTREE 索引, 也就是说默认使用 BTREE,不能够更换。

    MEMORY/HEAP 存储引擎:支持 HASH 和 BTREE 索引。

    索引的分类:单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引。

    数据库引擎

    InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整

    性要求比较高(比如银行),要求实现并发控制(比如售票),那选择 InnoDB 有很大的优势。

    如果需要频繁的更新、删除操作的数据库,也可以选择 InnoDB,因为支持事务的提交(commit)

    和回滚(rollback)。

    MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,

    那么选择 MyISAM 能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使

    用。

    MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的

    读写速度,对数据的安全性要求较低,可以选择 MEMOEY。它对表的大小有要求,不能建

    立太大的表。所以,这类数据库只使用在相对较小的数据库表。

    存储过程

    SQL 语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

    存储过程是可编程的函数,在数据库中创建并保存,可以由 SQL 语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

    存储过程的优点:
    增强 SQL 语言的功能和灵活性;
    标准组件式编程;
    较快的执行速度;
    减少网络流量;
    作为一种安全机制来充分利用。


    热门面试问题:

    1、JDBC 编程的步骤?

    (1) 注册驱动;

    (2) 获取连接对象 Connection;

    (3) 创建 Statement 对象;

    (4) 运行 SQL 语句;

    (5) 处理结果;

    (6) 关闭连接释放资源。

    2、事务的 ACID 是什么?事务并发会产生哪些问题?

    ACID 表示事务的特性:原子性、一致性、隔离性和持久性。

    • 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;

    • 一致性(Consistent):事务结束后系统状态是一致的;

    • 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;

    • 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

    事务并发产生的问题:脏读、幻读、不可重复读。

    脏读(Dirty Read):A 事务读取 B 事务尚未提交的数据并在此基础上操作,而 B 事务执行回滚,那么 A 读取到的数据就是脏数据。

    幻读(Phantom Read):事务 A 重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务 B 提交的行。

    不可重复读(Unrepeatable Read):事务 A 重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务 B 修改过了。

    3、数据库性能优化有哪些方式?
    SQL 优化:
    		尽量避免使用 SELECT	*;
    		只查询一条记录时使用 limit 1;
    		使用连接查询代替子查询;
    		尽量使用一些能通过索引查询的关键字。
    表结构优化:
    
    		尽量使用数字类型字段,提高比对效率;
    		长度不变且对查询速度要求高的数据可以考虑使用 char,否则使用 varchar;表中字段过多时可以适当的进行垂直分割,将部分字段移动到另外一张表;表中数据量过大可以适当的进行水平分割,将部分数据移动到另外一张表。
    
    其它优化:
    
    		对查询频率高的字段适当的建立索引,提高效率;根据表的用途使用合适的数据库引擎;读写分离。		
    
    

    框架部分

    Spring

    Spring 的理解

    spring 是一个开源框架,Spring 为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC 和 AOP 容器框架。 Spring 主要核心是:

    (1)控制反转(IOC):传统的 java 开发模式中,当需要一个对象时,我们会自己创建一个对象,而在 Spring 开发模式中,Spring 容器使用了工厂模式为我们创建了所需要的对象,我们直接调用 Spring 为我们提供的对象即可,这就是控制反转的思想。实例化一个 java 对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法。当使用 spring 时我们不需要关心通过何种方式实例化一个对象,spring 通过控制反转机制自动为我们实例化一个对象。

    (2)依赖注入(DI):Spring 使用 Java Bean 对象的 Set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

    (3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

    在 Spring 中,所有管理的对象都是 JavaBean 对象,而 BeanFactory 和 ApplicationContext 就是 spring 框架的两个 IOC 容器,现在一般使用 ApplicationContext,其不但包含了 BeanFactory 的作用,同时还进行更多的扩展。

    Spring Bean 生命周期

    1.Spring 容器 从 XML 文件中读取 Bean 的定义,并实例化 Bean。

    2.Spring 根据 Bean 的定义填充所有的属性。

    3.如果 Bean 实现了 BeanNameAware 接口,Spring 传递 bean 的 ID 到 setBeanName 方法。

    4.如果 Bean 实现了 BeanFactoryAware 接口, Spring 传递 beanfactory 给 setBeanFactory 方法。

    5.如 果 有 任 何 与 bean 相 关 联 的 BeanPostProcessors , Spring 会 在postProcesserBeforeInitialization()方法内调用它们。

    6.如果 bean 实现 IntializingBean 了,调用它的 afterPropertySet 方法,如果 bean 声明了初始化方法,调用此初始化方法。

    7.如果有 BeanPostProcessors 和 bean 关联,这些 bean 的 postProcessAfterInitialization()

    方法将被调用。

    8.如果 bean 实现了 DisposableBean,它将调用 destroy()方法。注意:

    有两个重要的 bean 生命周期方法,第一个是 setup() , 它是在容器加载 bean 的时候被调用。第二个方法是 teardown() 它是在容器卸载类的时候被调用。

    The bean 标签有两个重要的属性 init-method 和 destroy-method。使用它们你可以自己定制初始化和注销方法。它们也有相应的注解@PostConstruct 和@PreDestroy。

    Spring 中的设计模式

    代理模式—Spring 中两种代理方式,若目标对象实现了若干接口,spring 使用 JDK 的 java.lang.reflect.Proxy 类代理,若目标对象没有实现任何接口,spring 使用 CGLIB 库生成目标对象的子类。

    单例模式—在 spring 配置文件中定义的 bean 默认为单例模式。

    模板方法模式—用来解决代码重复的问题。比如: RestTemplate, JmsTemplate, JpaTemplate。

    前端控制器模式—Srping 提供了 DispatcherServlet 来对请求进行分发。

    视图帮助(View Helper )—Spring 提供了一系列的 JSP 标签,高效宏来辅助将分散的代码整合在视图里。

    依赖注入—贯穿于 BeanFactory/ApplicationContext 接口的核心理念。

    工厂模式—在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。Spring 中使用 BeanFactory 用来创建对象的实例。

    Spring 注解

    Spring 在 2.5 版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代 XML 方式的 bean 描述,可以将 bean 描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。

    注解装配在 Spring 中是默认关闭的。所以需要在 Spring 文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。

    <beans>
    
    <context:annotation-config/>
    
    <!-- bean definitions go here -->
    
    </beans>
    

    context:annotation-config/标签配置完成以后,就可以用注解的方式在 Spring 中向属

    性、方法和构造方法中自动装配变量。

    几种比较重要的注解类型:

    1.@Required:该注解应用于设值方法。

    2.@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

    3.@Qualifier:该注解和@Autowired 注解搭配使用,用于消除特定 bean 自动装配的歧义。

    4.JSR-250 Annotations: Spring 支持基于 JSR-250 注解的以下注解,@Resource、 @PostConstruct 和 @PreDestroy。

    Spring 事务

    Spring 支持两种类型的事务管理:

    1.编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。

    2.声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和 XML 配置来管理事务。

    Spring 事务配置示例(使用 tx 标签配置的拦截器)

    <!-- 定义事务管理器(声明式的事务) -->
    
    <bean id="transactionManager"
    
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    
    <property name="sessionFactory" ref="sessionFactory" />
    
    </bean>
    
    <!-- 配置 Advice 通知 -->
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes>
    
    <tx:method name="*" propagation="REQUIRED" /> </tx:attributes>
    
    </tx:advice>
    
    <!-- 配置切点切面 -->
    
    <aop:config>
    
    <aop:pointcut id="interceptorPointCuts" expression="execution(* com.bluesky.spring.dao.*.*(..))" />
    
    <aop:advisor advice-ref="txAdvice"
    
    pointcut-ref="interceptorPointCuts" />
    
    </aop:config>
    
    

    SpringMVC

    SpringMVC 执行流程

    在这里插入图片描述
    1、用户发送请求至 DispatcherServlet(前端控制器);

    2、DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器);

    3、HandlerMapping 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;

    4、DispatcherServlet 调用 HandlerAdapter(处理器适配器);

    5、HandlerAdapter 经过适配调用具体的 Controller (处理器,也叫后端控制器);

    6、Controller 执行完成返回 ModelAndView 对象;

    7、HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet;

    8、DispatcherServlet 将 ModelAndView 传给 ViewReslover(视图解析器);

    9、ViewReslover 解析后返回具体 View;

    10、DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中);

    11、DispatcherServlet 响应用户。

    springmvc 常用注解

    @RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

    @PathVariable:用于将请求 URL 中的模板变量映射到功能处理方法的参数上,即取出 uri 模板中的变量作为参数。

    @requestParam : 主 要 用 于 在 SpringMVC 后 台 控 制 层 获 取 参 数 , 类 似 一 种 是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 铜过 boolean 设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

    @ResponseBody : 该 注 解 用 于 将 Controller 的 方 法 返 回 的 对 象 , 通 过 适 当 的HttpMessageConverter 转换为指定格式后,写入到 Response 对象的 body 数据区。使用时机:返回的数据不是 html 标签的页面,而是其他某种格式的数据时(如 json、xml 等)使用 @RequestBody : 该 注 解 常 用 来 处 理 Content-Type: 不 是 application/x-www-form-urlencoded 编码的内容,例如 application/json, application/xml 等; @RequestHeader :可以把 Request 请求 header 部分的值绑定到方法的参数上。

    @CookieValue :可以把 Request header 中关于 cookie 的值绑定到方法的参数上。

    SpringMVC 和 Struts2 对比

    机制:spring mvc 的入口是 servlet,而 struts2 是 filter(这里要指出,filter 和 servlet 是不同的。以前认为 filter 是 servlet 的一种特殊),这样就导致了二者的机制不同,这里就牵涉到 servlet 和 filter 的区别了。

    性能:spring 会稍微比 struts 快。spring mvc 是基于方法的设计,而 sturts 是基于类,每次发一次请求都会实例一个 action,每个 action 都会被注入属性,而 spring 基于方法,粒度更细,但要小心把握像在 servlet 控制数据一样。spring3 mvc 是方法级别的拦截,拦截到方法后根据参数上的注解,把 request 数据注入进去,在 spring3 mvc 中,一个方法对应一个 request 上下文。而 struts2 框架是类级别的拦截,每次来了请求就创建一个 Action,然后调用 setter getter 方法把 request 中的数据注入;struts2 实际上是通过 setter getter 方法与 request 打交道的;struts2 中,一个 Action 对象对应一个 request 上下文。

    参数传递:struts 是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

    设计思想上:struts 更加符合 oop 的编程思想,spring 就比较谨慎,在 servlet 上扩展。

    Mybatis

    Mybatis 的理解

    MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

    Mybatis 的优点:

    1、简单易学。mybatis 本身就很小且简单。没有任何第三方依赖,最简单安装只要两个 jar 加配置几个 sql 映射文件,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现;

    2、灵活。mybatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql 写在 xml 里,便于统一管理和优化。通过 sql 基本上实现不使用数据访问框架可以实现的所有功能;

    3、解除 sql 与程序代码的耦合。通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql 和代码的分离,提高了可维护性;4、提供映射标签,支持对象与数据库的 orm 字段关系映射;5、提供对象关系映射标签,支持对象关系组建维护;

    6、提供 xml 标签,支持编写动态 sql。

    Mybatis 缓存

    一级缓存:Mybatis 的一级缓存的作用域是 session,当 openSession()后,如果执行相同的SQL(相同语句和参数),Mybatis 不进行执行 SQL,而是从缓存中命中返回。

    二级缓存:Mybatis 的二级缓存的作用域是一个 mapper 的 namespace,同一个 namespace 中查询 sql 可以从缓存中命中。二级缓存是可以跨 session 的。

    SpringBoot

    SpringBoot 简介

    Spring Boot(英文中是“引导”的意思),是用来简化 Spring 应用的搭建到开发的过程。应用开箱即用,只要通过 “just run”(可能是 java -jar 或 tomcat 或 maven 插件 run 或 shell 脚本),就可以启动项目。二者,Spring Boot 只要很少的 Spring 配置文件(例如那些 xml,property)。因为“习惯优先于配置”的原则,使得 Spring Boot 在快速开发应用和微服务架构实践中得到广泛应用。

    SpringBoot 特性

    自动配置:针对很多 Spring 应用程序常见的应用功能,Spring Boot 能自动提供相关配置;起步依赖:告诉 Spring Boot 需要什么功能,它就能引入需要的库;

    命令行界面:这是 Spring Boot 的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建;

    Actuator:让你能够深入运行中的 Spring Boot 应用程序,一探究竟。

    SpringBoot 核心

    @SpringBootApplication 这个 Spring Boot 核心注解是由其它三个重要的注解组合,分别是:

    @SpringBootConfiguration 、 @EnableAutoConfiguration 和 @ComponentScan。

    @ SpringBootConfiguration

    点开查看发现里面还是应用了@Configuration。任何一个标注了@Configuration 的 Java 类定义的都是一个 JavaConfig 配置类。SpringBoot 社区推荐使用基于 JavaConfig 的配置形式,所以,这里的启动类标注了@Configuration 之后,本身其实也是一个 IoC 容器的配置类。

    @EnableAutoConfiguration

    是一个复合注解。最重要的是@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration 可以帮助 SpringBoot 应用将所有符合条件的@Configuration 配置都加载到当前 SpringBoot 使用的 IoC 容器。 @ComponentScan

    @ComponentScan 这个注解在 Spring 中很重要,它对应 XML 配置中的元素, @ComponentScan 的功能其实就是自动扫描并加载符合条件的组件(比如@Component 和 @Repository 等)或者 bean 定义,最终将这些 bean 定义加载到 IoC 容器中。

    SpringCloud

    SpringCloud 简介

    spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

    SpringCloud 核心组件

    服务注册发现 - Netflix Eureka

    配置中心 - spring cloud config

    负载均衡-Netflix Ribbon

    断路器 - Netflix Hystrix

    路由(网关) - Netflix Zuul

    微服务

    微服务是一种可以让软件职责单一、松耦合、自包含、可以独立运行和部署的架构思想。关键思想就是:拆分、单一、独立、组件化。把原本一个庞大、复杂的项目按业务边界拆分一个一个独立运行的小项目,通过接口的方式组装成一个大的项目。

    Docker

    Docker 简介

    Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

    Docker 理解

    Docker 其实和虚拟机的目的差不多,都是虚拟化技术,但是 docker 比虚拟机更加轻量级,更快,更加易于移植。

    镜像: 创建虚拟机和 docker 都必不可少的东西。创建一个虚拟机,就先得下载操作系统的 ISO 镜像文件,然后通过镜像文件安装操作系统,和实体机类似,然后能在虚拟机中去安装各种软件。

    容器: 通俗拿 VM 虚拟机和 Docker 来举例,一个容器就类似于一个虚拟机,只不过在 Docker 技术的术语上称为容器。这个容器里装的就是我们部署的应用在运行,和虚拟机一样可以开机,关机,重启。Docker 称为容器的运行,关闭,重启。而且这个容器可以打包为镜像文件,类似虚拟机快照的文件,放在其它虚拟机上又可以保持原样能运行,Docker 也是如此,把容器打包为镜像文件,然后在新的服务器安装好的 Docker 环境下导入进去,保持原来的状态能够运行。

    Redis

    Redis 简介

    Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统。支持多种数据结构,这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

    Redis 支持的数据类型

    字符串(strings)
    散列(hashes)
    列表(lists)
    集合(sets)
    有序集合(sorted sets)

    Redis 应用场景

    缓存
    计数器
    发布订阅构建消息系统
    排行榜

    Redis 持久化

    RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。 AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

    Redis 的优势

    性能极高 – Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。

    丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。

    Solr

    Solr 简介

    Solr 是一个基于 Lucene 的 Java 搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 HTTP 的管理界面。Solr 已经在众多大型的网站中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以 Solr 的基本上沿用了 Lucene 的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过对 Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如 Nutch、 Luke)也可以使用 Solr 创建的索引。

    Solr 配置

    Schema.xml:

    在下载 solr 包的安装解压目录的\solr\example\solr\collection1\conf 中找到,它就是 solr 模式关联的文件。

    fieldtype 节点主要用来定义数据类型;

    field 节点指定建立索引和查询数据的字段;

    solrQueryParser 指定搜索时多个词之间的关系,可以是 or 或 and。

    solrconfig.xml:

    配置文件主要定义了 SOLR 的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。

    datadir 节点定义了索引数据和日志文件的存放位置; lib 节点表示 solr 引用包的位置。

    倒排索引

    正排表(索引)是以文档的 ID 为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
    在这里插入图片描述
    倒排表(索引)以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的 ID 和字符在该文档中出现的位置情况。在这里插入图片描述

    RabbitMQ/ActiveMQ

    RabbitMQ 简介

    RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。

    AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

    RabbitMQ 特点

    可靠性(Reliability): 使用持久化、传输确认和发布确认机制来保证可靠性。

    灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

    高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

    多种协议(Multi-protocol):RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等。多语言客户端(Many Clients):RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby等。

    管理界面(Management UI):RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

    跟踪机制(Tracing):如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

    插件机制(Plugin System):RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

    RabbitMQ 工作模式

    简单模式:一个生产者发送消息到队列,一个消费者接收。

    工作队列模式:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列。

    发布/订阅模式:一个生产者发送的消息会被多个消费者获取,每个消费者只能从自己订阅的队列中获取。

    路由模式:生产者发布消息的时候添加路由键,消费者绑定队列到交换机时添加键值,这样就可以接收到需要接收的消息。

    通配符模式:基本思想和路由模式是一样的,只不过路由键支持模糊匹配,符号“#”匹配一个或多个词,符号“*”只匹配一个词。

    ActiveMQ 简介

    ActiveMQ 是 Apache 推出的一款开源的,完全支持 JMS1.1 和 J2EE1.4 规范的 JMS Provider 实现的消息中间件。

    ActiveMQ 工作模式

    点对点模式:一个消息只有一个消费者消费。

    发布/订阅模式:订阅一个主题的消费者只能消费自它订阅之后发布的消息。JMS 规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久订阅允许消费者消费它在未处于激活状态时发送的消息。

    MQ 对比

    在这里插入图片描述

    Dubbo

    Dubbo 简介

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。

    其核心部分包括:

    远程通讯:提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型、序列化、"请求-响应"模式的信息交换方案;

    集群容错:提供基于借口方法的透明远程过程调用,包括多协议支持、软负载均衡、失败容错、地址路由、动态配置等集群支持;

    自动发现:基于注册中心目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    Dubbo 开发流程

    第一步:要在系统中使用 dubbo 应该先搭建一个注册中心,一般推荐使用 zookeeper;第二步:有了注册中心然后是发布服务,发布服务需要使用 spring 容器和 dubbo 标签来发布服务。并且发布服务时需要指定注册中心的位置;

    第三步:服务发布之后就是调用服务。一般调用服务也是使用 spring 容器和 dubbo 标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在 action 或者 Controller 中直接调用 service 的方法即可。

    Zookeeper 注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。

    FastDFS

    FastDFS 简介

    FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

    FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

    Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

    Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内

    可以有多台 storage server,数据互为备份。

    Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
    在这里插入图片描述

    Nginx

    Nginx 简介

    Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师 Igor Sysoev 所开发,官方测试 nginx 能够支支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。

    Nginx 功能

    静态 HTTP 服务器:Nginx 是一个 HTTP 服务器,可以将服务器上的静态文件(如 HTML、图片)通过 HTTP 协议展现给客户端。

    反向代理服务器:客户端本来可以直接通过 HTTP 协议访问某网站应用服务器,但如果单台服务器承受不住压力需要使用多台服务器共同处理请求,这时可以在中间加上一个 Nginx,客户端请求 Nginx,Nginx 请求应用服务器,然后将结果返回给客户端,此时 Nginx 就是反向代理服务器。

    负载均衡:当客户端访问量很大,通过反向代理的方式,使用轮询、加权轮询和 IP Hash 的策略将请求分配给多台服务器。

    Quartz

    Quartz 简介

    Quartz 是一个任务调度框架。它具有以下特点:

    强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;

    灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升;

    作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

    Quartz 核心元素

    Scheduler:任务调度器,实际执行任务调度的控制器。在 spring 中通过 SchedulerFactoryBean 封装起来;

    Trigger :触发器,用于定义任务调度的时间规则,有 SimpleTrigger 、 CronTrigger 、

    DateIntervalTrigger 和 NthIncludedDayTrigger,其中 CronTrigger 用的比较多,在 spring 中

    封装在 CronTriggerFactoryBean 中;

    Calendar:一些日历特定时间点的集合。一个 trigger 可以包含多个 Calendar,以便排除或

    包含某些时间点;

    JobDetail:用来描述 Job 实现类及其它相关的静态信息。如 Job 名字、关联监听器等信息。在 spring 中有 JobDetailFactoryBean 和 MethodInvokingJobDetailFactoryBean 两种实现,如果任务调度只需要执行某个类的某个方法,可以通过 MethodInvokingJobDetailFactoryBean 来调用;

    Job:是一个接口,只有一个方法 void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext 类提供了调度上下文的各种信息。Job 运行时的信息保存在 JobDataMap 实例中。实现 Job 接口的任务,默认是无状态的,若要将 Job 设置成有状态的,在 quartz 中是给实现的 Job 添加@DisallowConcurrentExecution 注解,在与 spring 结合中可以在 spring 配置文件的 job detail 中配置 concurrent 参数。


    数据库笔试题

    用一条 SQL 语句查询出每门课都大于 80 分的学生姓名

    在这里插入图片描述

    # 准备数据的 sql 代码:
    
    create	table	score(id	int	primary	key	auto_increment,namevarchar(20),subject
    
    varchar(20),score int);
    
    insert into score values
    
    (null,'张三','语文',81),
    
    (null,'张三','数学',75),
    
    (null,'李四','语文',76),
    
    (null,'李四','数学',90),
    
    (null,'王五','语文',81),
    
    (null,'王五','数学',100),
    
    (null,'王五 ','英语',90);
    
    #答案:
    
    #A:select distinct name from score where name not in (select distinct name from score where score<=80)
    
    #B:select distinct name t1 from score where 80< all (select score from score where name=t1)
    
    所有球队之间的比赛组合

    一张叫 team 的表,里面只有一个字段 name,一共有 4 条纪录,分别是 a、b、c、d,对应四个球队,现在四个球队进行比赛,用一条 sql 语句显示所有可能的比赛组合。

    #答案:select a.name,b.name	from team a, team b where a.name < b.name
    
    显示文章标题,发帖人、最后回复时间

    表:id,title,postuser,postdate,parentid

    准备 sql 语句:

    drop table if exists articles;
    create table articles(id int auto_increment primary key,titlevarchar(50), postuser varchar(10), postdate datetime,parentid int referencesarticles(id)); insert into articles values
    
    (null,'第一条','张三','1998-10-10 12:32:32',null), (null,'第二条','张三','1998-10-10 12:34:32',null), (null,'第一条回复 1','李四','1998-10-10 12:35:32',1), (null,'第二条回复 1','李四','1998-10-10 12:36:32',2), (null,'第一条回复 2','王五','1998-10-10 12:37:32',1), (null,'第一条回复 3','李四','1998-10-10 12:38:32',1), (null,'第二条回复 2','李四','1998-10-10 12:39:32',2), (null,'第一条回复 4','王五','1998-10-10 12:39:40',1);
    
    #答案:
    
    select a.title,a.postuser, (select max(postdate) from articles where parentid=a.id ) reply from articles a where a.parentid is null;
    
    #注释:子查询可以用在选择列中,也可用于 where 的比较条件中,还可以用于 from 从句中。
    
    

    航空网的几个航班查询题

    在这里插入图片描述

    1、查询起飞城市是北京的所有航班,按到达城市的名字排序

    参与运算的列是我起码能够显示出来的那些列,但最终我不一定把它们显示出来。各个表组合出来的中间结果字段中必须包含所有运算的字段。

    select * from flight f,city c
    
    where f.endcityid =c.cityid and startcityid =
    
    (select c1.cityidfrom city c1 where c1.cityname = "北京")
    
    order by c.citynameasc;
    
    select flight.flightid,'北京' startcity, e.cityname from flight,city e
    
    where flight.endcityid=e.cityid and flight.startcityid=( selectcityid from city where cityname='北京');
    
    select flight.flightid,s.cityname,e.cityname from flight,city s,city e 
    
    where flight.startcityid=s.cityid and s.cityname='北京' andflight.endCityId=e.cit yID order by e.cityName desc;
    
    
    2、查询北京到上海的所有航班纪录(起飞城市,到达城市,起飞时间,航班号)
    select c1.CityName,c2.CityName,f.StartTime,f.flightID
    
    from city c1,city c2,flight f
    
    where f.StartCityID=c1.cityID
    
    and f.endCityID=c2.cityID
    
    and c1.cityName='北京'
    
    and c2.cityName='上海'
    
    3、查询具体某一天(2005-5-8)的北京到上海的的航班次数
    select count(*) from
    
    (select c1.CityName,c2.CityName,f.StartTime,f.flightID
    
    from city c1,city c2,flight f
    
    where f.StartCityID=c1.cityID
    
    and f.endCityID=c2.cityID
    
    and c1.cityName='北京'
    
    and c2.cityName='上海'
    
    and 查帮助获得的某个日期处理函数(startTime) like '2005-5-8%' mysql 中提取日期部分进行比较的示例代码如下:
    
    select * from flight wheredate_format(starttime,'%Y-%m-%d')='1998-01-02'
    

    ok,Java面试宝典就总结到这里
    一定会及时更新最新Java面试题
    要是对我的文章感兴趣的话,就快关注我吧

    下一篇:Java面试总结

    给我们一个微信勾搭的机会

    在这里插入图片描述

    展开全文
  • Java面试宝典(2019版)

    万次阅读 多人点赞 2019-05-23 09:35:07
    Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版...

    附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:

    书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈
    【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)
    【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)
    【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)
    【Web前端】从HTML到JS到AJAX到HTTP从框架到全栈帮你走更少弯路(珍藏版)   
    【python】书最全已整理好(从入门到进阶)(珍藏版)

    【机器学习】+python整理技术书(从入门到进阶已经整理好)(珍藏版)
    【C语言】推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
    【安卓】入门到进阶推荐书籍整理pdf书单整理(珍藏版)

    【架构师】之路史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

    【C++】吐血整理推荐书单从入门到进阶成神之路100+本(珍藏)

    【ios】IOS书单从入门到进阶吐血整理(珍藏版)

    -------------------------------------------------------------------------------------------------------------------------------------------

    此内容偏中高级,适合有三年经验者。

    1.       java中wait和sleep有什么区别?多线程条件下如何保证数据安全?

       答:最大区别是等待时wait会释放锁,而sleep会一直持有锁,wait通常用于线程时交,互,sleep通常被用于暂停执行。

    2.       java中volatile和synchronized有什么区别?

    1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
    2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。
    3.volatile仅能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
    4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 
    5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化。
    3.       有了解java的原子类?实现原理是什么?

             答:采用硬件提供原子操作指令实现的,即CAS。每次调用都会先判断预期的值是否符合,才进行写操作,保证数据安全。

     

    4.       spring主要使用了哪些?IOC实现原理是什么?AOP实现原理是什么?

      答:spring主要功能有IOC,AOP,MVC等,IOC实现原理:先反射生成实例,然后调用时主动注入。AOP原理:主要使用java动态代理,

    5.       mybatis有了解吗?它与hibernate有什么区别?项目中,你会选哪个?

     答:两者都是轻量级ORM框架,hibernate实现功能比较多,通过HQL操作数据库,比较简单方便,但hibernate自动生成的sql相长,不利测试和查找原因。复杂sql时,编写比较困难,同时性能也会降低。mybatis是半自动化,手动编写SQL语句,同时提供丰富的参数判断功能。sql语句较清晰,可以直接进行测试,性能也较好,操作起来非常简单。同时hibernate容易产生n+1问题。hibernate学习成本较mybatis高。国内一些大公司基本上使用mybatis

     

    6.       缓存框架有使用过哪些?memcache和redis有什么区别?项目中,怎么去选择?

            答:缓存有:ehcache,memcache和redis等

             区别:

             1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过        memcache还可用于缓存其他东西,例如图片、视频等等。

             2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的   存储。

             3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘

             4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通 过例如expire 设定,例如expire name 10

             5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都     可以一主一从

             6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)

             7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复

             8、Redis支持数据的备份,即master-slave模式的数据备份。

     

             项目使用选择:

             redis是单线程实现,若需要使用控制某些并发状态时,可以使用redis.项目中需要使用 复杂的list,set操作时,同时可以对数据进行持久化。

             当存储数据较大时,如100k以上,那memcache性能较好,在多核上,memcache较     好

    7.       说说数据库性能优化有哪些方法?

             答:使用explain进行优化,查看sql是否充分使用索引。避免使用in,用exist替代,字段值尽可能使用更小的值,任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。使用连接查询(join)代替子查询。

    在表的多列字段上建立一个索引,但只有在查询这些字段的第一个字段时,索引才会被使用。

    8.       HTTP请求方法get和post有什么区别?

                        1:Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。

                      2:Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度限制,只能                   传递大约1024字节.

                     3:Post就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get                      之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post                   的信息作为http请求的内容,而Get是在Http头部传输的。

    9.       linux命令熟悉?查看某个线程命令是什么?查看整个机器负载命令?文件内容快速查找命令是什么?

             查看线程:ps -ef|greptomcat

             查看负载:top

             文件内容查找:vi  /aa test.txt 或者先打开文件,再查找: vi test.txt   /aa

    10.  JVM内存模型是如何?垃圾回收机制有哪些?如何对JVM进行调优?

             答:由栈和堆组成,栈是运行时单位,堆内存则分为年轻代、年老代、持久代等,年轻代中的对象经过几次的回收,仍然存在则被移到年老代;持久代主要是保存class,method,filed等对象。

    sun回收机制:主要对年轻代和年老代中的存活对象进行回收,分为以下:

    年轻代串行(Serial Copying)、年轻代并行(ParNew)、年老代串行(SerialMSC),年老代并行(Parallel Mark Sweep),年老代并发(Concurrent Mark-Sweep GC,即CMS)等等,目前CMS回收算法使用最广泛。

    JVM调优主要是对堆内容和回收算法进行配置,需要对jdk产生的回收日志进行观察,同时通过工具(Jconsole,jProfile,VisualVM)对堆内存不断分析,这些优化是一个过程,需要不断地进行观察和维护。

     

          

    11.  如银行内部转账功能,如何保证数据一致性,即要么同时成功,要么同时失败?高并发时,又如何保证性能和数据正确?

           答:如果是单机内完成这些操作,那使用数据库的事务,即可轻松实现。若是分布式呢?

    12.  有了解分布式事务如何实现?

             答:分布式事务可以采用分布式锁进行实现,目前zookeeper就提供此锁;分布式锁需要牺牲一定性能去实现,若业务支付最终一致性,那此方法是最佳方案。如在京东下订单,过一会才会告诉你订单审核通过,而不是马上响应订单结果。

    13.  java抽象类和接口有什么区别?项目中怎么去使用它们?

             相同点:

             A. 两者都是抽象类,都不能实例化。

             B. interface实现类及abstractclass的子类都必须要实现已经声明的抽象方法。

           不同点:

             A. interface需要实现,要用implements,而abstractclass需要继承,要用extends。

             B. 一个类可以实现多个interface,但一个类只能继承一个abstractclass。

             C. interface强调特定功能的实现,而abstractclass强调所属关系。

             D. 尽管interface实现类及abstrctclass的子类都必须要实现相应的抽象方法,但实现的         形式不同。interface中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方         法体),实现类必须要实现。而abstractclass的子类可以有选择地实现。

            

             使用:

             abstract:在既需要统一的接口,又需要实例变量或缺省的方法的情况下,使用abstract;

             interface:使用: 类与类之前需要特定的接口进行协调,而不在乎其如何实现。 作为能          够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。需要将一组类     视为单一的类,而调用者只通过接口来与这组类发生联系。需要实现特定的多项功能,         而这些功能之间可能完全没有任何联系。

    14.  对socket熟悉?TCP通讯有几次握手?有使用过哪些socket框架?

             答:3次握手,客户端-->服务端,服务端-->客户端,客户端-->服务端,当这些过程完成之后,才真正建立起通信。java中比较有名的socket框架有:mina,netty,都是韩国小棒子写的。

    15.  了解java反射机制?反射生成类,能访问私有变量?

           答:即动态生成java的实例,可以

    16.  RPC是什么?有使用过哪些RPC框架?

           答:即远程进程调用,本地机器调用远程的服务,在项目规模大到一定程度,需要使用RPC相关框架进行服务化部署。如:hessian 、webservice等

    17.  熟悉js或css?jquery如何绑定页面某元素的点击事件?

    答:$("#btn").click(function(){

    })
     

    展开全文
  • Java 面试宝典

    2021-02-22 20:13:27
    Java 面试宝典 不定时更新 Java的面试题, 有什么好的 感谢评论告知! Java 线程 泛型 集合 SSM Mybatis mybatis中namespace的作用 Namespace是命名空间 mapper中的namespace用于绑定dao接口的,即面向接口编程。...

    Java 面试宝典

    不定时更新 Java的面试题, 有什么好的 感谢评论告知!

    • 小提示 可以看旁边的文章目录, 自问自带看看自己会不会!

    奉上本人Java学习笔记!


    Java

    线程

    泛型

    集合



    SSM

    Mybatis

    mybatis中namespace的作用

    Namespace是命名空间
    mapper中的namespace用于绑定dao接口的,即面向接口编程。namespace是映射文件唯一标识,不允许重复

    • 在大型项目中,可能存在大量的SQL语句,
    • 这时候为每个SQL语句起一个唯一的标识(ID)就变得并不容易了。
    • 为了解决这个问题,在MyBatis中,可以为每个映射文件起一个唯一的命名空间,
    • 这样定义在这个映射文件中的每个SQL语句就成了定义在这个命名空间中的一个ID。
    • 只要我们能够保证每个命名空间中这个ID是唯一的,即使在不同映射文件中的语句ID相同,也不会再产生冲突了。

    #和$的区别。

    #{} 和 ${} 都是Mybatis sql映射文件中实现,sql参数的绑定!

    #{ }
    是以一种 预编译的形式进行参数注入!自动拼接引号不会存在注入相对 ${}安全
    ${}
    以一种,字符替换 直接将参数拼接到sql 语句中,需要自己写 ’ 单引号 存在sql 注入(不安全)!

    sql 注入

    因为可以 自定义单引号:

    对于一个登录sql : select * from user where username= ${xx} and password= ${xx}

    用户最后密码输入:’ OR ‘1’='1 那么如下!无论如何用户都能登录成功了!

    select * from user where username='lalalala' and password='' or '1'='1'
    

    SpringMVC

    MVC 设计模式

    在这里插入图片描述

    MVC 工作原理:

    MVC是 一种设计模式
    1前台发送请求 ,到控制器,
    2控制器接受请求,交给模型层处理(此模型层完成业务逻辑,service,dao等)
    3模型层返回处理结果给控制器
    4控制器将结果渲染到view视图上
    5渲染好的视图通过控制器返回前台

    在这里插入图片描述


    Spring

    说一说 ioc

    在这里插入图片描述

    微服务


    SpringBoot

    Spring boot和Spring mvc的区别

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

    • Spring MVC
      提供了一种轻度耦合的方式来开发web应用
      它是Spring的一个模块,是一个web框架。
      通过Dispatcher Servlet, ModelAndView 和 View Resolver,开发web应用变得很容易。
      解决的问题: 领域是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态Web资源等等。

    • Spring Boot
      实现了自动配置,降低了项目搭建的复杂度。
      它主要是为了解决 使用Spring框架需要进行大量的配置太麻烦的问题,
      所以它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具。
      同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),
      Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box)。

    总结:
    Spring 最初利用“工厂模式”(DI)和“代理模式”(AOP)解耦应用组件。
    大家觉得挺好用,于是按照这种模式搞了一个 MVC框架(一些用Spring 解耦的组件),用开发 web 应用( SpringMVC )。
    然后发现每次开发都写很多样板代码,为了简化工作流程,于是开发出了一些“懒人整合包”(starter),这套就是 Spring Boot。

    所以,用最简练的语言概括就是:

    • Spring 是一个“引擎”;

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

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

    Springboot的核心

    • 快速创建一个独立的spring应用程序

    • 内置了tomcat, jetty ,无需发布war包,直接就可运行!

    • 提供了可选的 starter (启动器) 依赖来 简化 项目的构建配置( pom.xml )

    • 自动配置Spring 和 第三方库 (简化 配置文件, 简化Spring 以及 能够和Spring进行集成的第三方 框架的配置)

    • 没有冗余代码生成 并且不需要 XML 配置:
      1.不是说没有配置文件
      2.也可以有XML配置 @ImportResource 引入原生配置

        @ImportResource("classpath:beanConf.xml") 			 //classpath表示就是资源目录下; 这里不多解释了..
        //一般注解直接声明在:主程序类上... 方便快速加载!
      

    SpringCloud


    数据库:

    公共

    怎样测试一条sql语句的执行效率。

    • EXPLAIN 要测试执行的sql
      输入sql语句“EXPLAIN select * from users”,前面加了explain,则查询语句在执行时,会记录执行过程效率。
    • 通过慢查询日志去寻找,哪些sql执行效率
      MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog)这个日志模块所有执行引擎都可以共用

    Mysql

    组合索引怎么用的? 索引

    • 组合索引是将n个列组合成一个索引
      其应用场景为: 频繁同时使用, n列来进行查询;
    • 组合索引语法:
      create index 索引名 on 数据库名(多个列名); 多个列直接 , 逗号分隔!
    • 通过索引列进行查询 (遵循 最佳左前缀原则:
      就是, 假设创建一个索引: a b c 三列的索引,数据库的底层就会创建出 a ab abc 三种索引类型!
      如果此时, 一条sql 语句: 最左边使用了 a 和 c 列进行条件判断, 执行的时间是不一样的! a最左 会比c 快!
      因为底层针对 a 创建了一个索引,所以建议最常用的列, 创建时候在最左边声明!

    什么情况会导致组合索引失效?

    • 组合索引不使用左侧第一个字段; 最左的不一定要在最左使用!但一定要用!
      (除非查询的字段只有建立组合索引的这几个列 select 索引列1,索引列2 from ...
    • like 以%开头
    • 字符串不加引号
    • where条件有数学运算或函数
    • order by 只能使用a,才能用到索引。
    • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引 再次声明索引适合,高数据量的场景使用!

    组合索引,如果不使用左侧第一个字段,什么情况下索引会生效?

    • 如果查询的字段只有建立组合索引的这几个列 索引会生效

    事务用在哪里

    Oracle

    工具组件:

    Git

    git改变分支的指令

    # 创建分支
    git branch 分支名字 (如dev) 	# 创建(dev)分支
    # 查看分支
    git branch 					# git branch -a 查看所有分支!
    # 切换分支
    git checkout 分支名字 		# 切换到xx分支
    # 合并分支
    git merge (指定合并的分支)
    # 删除分支
    git branch -d 分支名 
    # 还可以,使用.gitignore忽略文件进行版本控制!!
    

    分支合并

    无冲突)
    # 假设现在我修改新分支上的文件
    # 然后回到主分支,主分支我并没有进行修改,只有新分支修改了,那么进行合并
    # 显然是没有冲突的,Git会直接对 master分支里的文件进行了更新
    有冲突)
    # 如果我修改新分支上的文件
    # 然后回到主分支,主分支我也进行修改,那么进行合并
    # 就会产生冲突的,Git会将都修改过的相同行代码都保留,以一种特殊格式保留;  
    并且进入 合并模型 需要将格式更改为,正常的才可以继续操作,提交!!
    

    Redis

    Nginx

    Maven

    maven是怎么进行项目管理的?

    • 通过POM (工程对象模型)
      它是使用 Maven 工作时的基本组建,是一个 xml 文件。被放在 项目工程根目录下,文件命名为 pom.xml

    • POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建和管理项目
      统一字符编码格式! JDK 环境版本!
      最主要就是统一 依赖Jar包了! pom.xml 文件中添加所需jar包的坐标, Maven会根据坐标快速找到Jar的实际位置!
      避免了直接引入使项目工厂庞大! 底层存在,索引算法可以高效快速的响应传递; 不用担心影响程序性能!

    maven是怎么管理jar包的? 接下

    • 通过项目根目录下的 pom.xml文件来管理Jar
    • Maven项目需要Jar时候就会,去pom.xml 文件中寻找对应的依赖!根据依赖就可以到对应的仓库中找到准确的Jar
      仓库流程:Maven有三个仓库 本地(本地电脑)——私服(公司内部)——远程(官方提供需要联网下载)
      而且:如果是远程下载的, 第一次下载时候,就会在本地 和 私服中进行了备份 下次就不用在远程下载了! 私服获取,也会在本地留取备份!

    接上怎么体现出来的?

    • 可以是在Maven 的setting 文件中,得知本地仓库的安装位置 文件默认的位置在:用户目录下 .m2文件夹!
      可以通过查看 pom.xml文件来,获取具体的文件夹, 找到具体的依赖!
    • 不联网/联网: 来测试能不能下载Jar…

    设计模式:

    … … … … … … … … … … … … … … … … … … … … … … … … … … … 🧐

    展开全文
  • java面试宝典

    2020-12-24 21:32:38
    1.Java 1.java基础 2.集合 3.多线程 4.JVM 5.JUC 6.新特性 2.网络 3.数据结构 4.并发编程 5.数据库 1.Mysql 2.Redis 6.框架 1.Spring 2.SpringMVC 3.MyBatis 4.Springboot 5.SpringCloud 6.Netty...

    1.Java

    1.java基础

    2.集合

    3.多线程

    4.JVM

    5.JUC

    6.新特性

    2.网络

    3.数据结构

    4.并发编程

    5.数据库

    1.Mysql

    2.Redis

    6.框架

    1.Spring

    2.SpringMVC

    3.MyBatis

    4.Springboot

    5.SpringCloud

    6.Netty

    7.Dubbo

    8.Zookeeper

    9.Nginx

    10.Docker

    11.Linux

    7.分布式

    1.分布式缓存

    2.分布式事务

    3.分布式锁

    4.分布式会话

    8.消息中间件

    1.消息队列

    2.Kafka

    3.RabbitMQ

    4.RocketMQ

    9.搜索引擎

    1.Elasticsearch

    2.Kibana

    10.微服务

    11.高并发

    12.高可用

    13.设计模式

    14.分库分表

    15.调优

    1.Mysql调优

    2.Tomcat调优

    3.JVM调优

    16.场景设计

    1.秒杀系统

    17.大数据

    1.Hbase

    2.Hadoop

    3.Spark

    18.算法

    1.海量数据处理

    19.生产实践

    20.系统安全

     

     

     

     

    展开全文
  • java 面试宝典

    2019-03-31 01:30:03
    NULL 博文链接:https://dengminghua1016.iteye.com/blog/1346768
  • JAVA面试宝典

    2020-08-14 22:40:30
    Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法。 1、一个".java"源文件中是否可以包括多个类(不是内部类...
  • Java面试宝典2017版

    万次阅读 多人点赞 2017-06-19 08:53:30
    Java基础部分.................................................................................................. 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?...................
  • Java面试宝典大全

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,842
精华内容 1,536
关键字:

java面试宝典

java 订阅