第一阶段面试题
一、JAVA基础
1. 列出JAVA中所有基本数据类型,并说明这些数据类型占用的字节数?
答案:
java的原始数据类型,也可以叫java的基本数据类型,一共就8个,分别是:byte、short、int、long、boolean、char、float、double
byte 1个字节
boolean 1个字节
char 2个字节
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节
2. continue和 break有什么区别?
答案:
break和continue都是用来控制循环结构的。
- break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
- continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
- 区别:continue只终止本次循环,break则完全终止循环
- break还可以用在 switch case 语句中,用于中断 switch case 语句。
3. i++和++i的区别?
- i++ 理解为:先用i值后加1, 比如int j=i++; 如果i的初值是1,那么表达式i++的整体值就是1,然后,i的值就变成了2,最后执行赋值运算,将i++整体的值1,赋值给j,j为1。
- ++i 理解为:先加1后用i值,比如int j=++i;如果i的初值是1,首先i增加1为2,然后用i的值2最为++i整体表达式的值,最后进行赋值运算,将++i表达式的值2赋值给j,j为2。
注意:这两个表达式在计算时,=号赋值计算,都是最后发生的,是非常常见的考点。
4. & 和 && 的区别?
答案:
- &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
- &不会发生短路现象,&&会有短路现象
5. 数组有没有length()这个方法?String有没有length()这个方法?
答案:
- 数组没有length()这个方法,有length的属性。String有length()这个方法。
二、OOP
1. 面向对象的特征有哪些方面?
答案:三大特性是:封装,继承,多态
- 所谓封装,也就是把客观事物抽象封装成类。封装是面向对象的特征之一。
- 简单的说,一个类就是一个封装了数据以及操作这些数据的算法。
- 对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
- 所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。
- 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。
- 子类是对父类功能的扩展
- 实际开发中父类往往是从子类泛化而来,父类中的属性和方法是从子类中抽象来的。
- 所谓多态就是指一个父类具体子类实例的相同方法执行出不同表现。
- 多态机制使具有不同对象可以共享相同的外部接口方法。
- 这意味着,可以通过相同的方式调用具体对象功能不同方法。
2. 静态变量和实例变量的区别?
答案:
- 在语法定义上的区别:
- 静态变量前要加 static 关键字,而实例变量前则不加。
- 在程序运行时的区别:
- 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
- 静态变量不属于某个实例对象,而是属于类,所以也称为类变量。
- 实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
3. Overload(重载)和Override(重写)的区别?
答案:
- 重写必须继承,重载不用。
- 重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
- 重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
- 重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
4. 多态的表现形式有哪些?
答案:重写和重载,向上造型。
5. abstract class 和 interface 有什么区别?
答案:
- 含有abstract修饰符的class即为抽象类,abstract类不能创建实例对象。
- abstract class类中定义抽象方法必须在具体子类中实现。
- 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
- 接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
6.接口是否可以继承接口?抽象类是否可以实现(implements)接口? 抽象类是否可以继承具体类?
答案:
- 接口可以继承接口,可以继承多个接口
- 抽象类可以实现接口,可以实现多个接口
- 抽象类可以继承具体类,但只能继承一个类
8.GC是什么?GC的作用
答案:
- GC是垃圾收集的意思
- Java提供的GC功能可以自动监测回收不被引用的对象,释放其占用的内存,
- 垃圾收集器会自动进行管理。
- 如果要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),这些方法会通知GC尽快进行内存垃圾回收。
- 在对象使用以后要及时释放其引用,有利于垃圾回收,可以有效的防止内存泄露。
三、JAVASE
1.说出ArrayList,LinkedList的储存性能和特性?
答案:
- ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。
- LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.
2.HashMap 和 Hashtable 的区别
答案:
- 历史原因:Hashtable 是陈旧API,HashMap 是Java 1.2 引进的Map 接口的一个实现
- 同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,不是同步的。由于同步检查所以Hashtable性能稍慢。
- 值:HashMap 可以插入一个null的key-value
3.List、Map、Set三个接口,存取元素时,各有什么特点?
答案:
- List特点:元素有顺序,元素可重复
- Set特点:元素无顺序,元素不可重复(注意:元素虽然无顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
- Map特点:元素按键值对存储,无顺序
4.队列和栈是什么,列出它们的区别?
答案:
- 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
- 栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
- 队列先进先出(FIFO),栈先进后出(FILO)。
5.String与StringBuffer的区别,StringBuffer和StringBuilder的区别是什么?
答案:
- String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。
- 由于字符串链接会自动创建StringBuilder对象,为了避免复杂字符串拼接时候大量创建StringBuilder对象,可以利用StringBuilder优化字符串链接操作。
- StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
标签: String StringBuffer StringBuilder
6.String类能不能被继承,为什么?
答案:
不能被继承,因为String类是final类,final修饰的类是不能被继承
8."=="和"equals"的区别
答案:
==
是值比较,对于引用类型变量==
是判断引用的值是否是同一个对象地址值,如果是相同对象其内容也一定是相同的
- equals方法判断的是对象的内容是否相同,由于其默认方法采用的
==
进行引用比较,所以需要重写为按照对象内容比较是否相同。
9.HashSet 和 HashMap 区别?
答案:
- HashMap :实现Map接口;使用hash算法,里面的数据是无序的;并且存储的是键值对;
- HashSet :实现了Set接口;内部封装了HashMap,故也是无序的;HashSet本质就是HashMap,数据存储到HashSet的Key部分,Value部分被屏蔽不使用了。
10.描述栈,队列中元素的出入顺序。
答案:
- 栈的数据结构是,先进后出(FILO),也可以说是后进先出
- 队列的数据结构是,先进先出(FIFO)
11.Comparable和Comparator接口是干什么的?列出它们的区别。
答案:
- Comparable接口
- 实现Comparable接口类表示这个类型的对象可以进行比较大小的。 这种可以比较大小的对象可以进行自然排序。
- Comparator接口
- 比较器用于实现对象任意属性进行比较大小。
- 在排序时候可以通过指定属性比较器实现任意属性排序。
- 在排序时候Comparable接口用于进行自然排序,而Comparator接口进行自定义排序,自定义排序更加灵活方便而常用。
- 设计上Comparable不推荐使用,因为对程序本身具有侵入性。
12.Java中异常处理机制?
答案:
- Java异常是一个消息传播机制,如果不被处理将继续传播并且打断当前程序的执行。
- Java使用面向对象的方式来传播异常消息,发生的每个异常被封装到一个异常对象,该对象中包含有异常的信息。
- Java中使用try catch finally 语法捕获处理异常消息。
13.创建线程有几种不同的方式?
答案:
在应用开发中有三种方式可以用来创建线程:
- 继承Thread类,并且创建对象。
- 实现Runnable接口,将Runnable接口的具体对象作为参数创建Thread对象。
- 另外也可以使用Executer创建并重用线程
###14.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
答案:
可以进入其他非synchronized的方法,synchronized的方法不可以的!
- Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor)
- 当一个线程访问对象的synchronized方法时,将在对象上锁,方法不能并发执行。
- 此时其他任何线程都得阻塞等待到当前线程方法执行结束后,才能有机会执行方法。
- 也就是说线程排到一个接着一个执行 synchronized的方法。
16.请描述TCP。
答案:
TCP是传送控制协议
- 是面向连接的可靠数据传输协议,TCP会确保数据会可靠的传输到对方.
- 使用步骤:先建立可靠连接—利用连接中的双向通讯流传输数据-----通讯结束以后,需要关闭连接.
- java利用Socket和ServerSocketAPI封装了TCP通讯过程,利用这两个类即可实现TCP通讯。
- HTTP通讯的底层是TCP协议。
17.java中多线程是什么?
答案:
- Java中并发运行多个流程的能力。每一个流程称为一个线程。
- Java的Thread API封装了线程控制过程。
- 创建线程对象后调用start方法就可以将线程提交到操作系统执行。
- 线程最终是由操作系统调度执行的。
18.线程进程的基本概念、线程的基本状态以及状态之间的关系
答案:
- 一个线程是进程的一个顺序执行流程。一个进程中的全部线程共享同一个堆空间。线程本身有一个供程序执行时的栈,一个进程中可以包含多个线程。
- 新建、就绪、运行状态、阻塞状态、死亡状态
- 新建状态:利用NEW运算创建了线程对象,此时线程状态为新建状态,调用了新建状态线程的start()方法,将线程提交给操作系统,准备执行,线程将进入到就绪状态。
- 就绪状态:由操作系统调度的一个线程,没有被系统分配到处理器上执行,一旦处理器有空闲,操作系统会将它放入处理器中执行,此时线程从就绪状态切换到运行时状态。
- 运行状态:线程正在运行的过程中,碰到调用Sleep()方法,或者等待IO完成,或等待其他同步方法完成时,线程将会从运行状态,进入到阻塞状态。
- 死亡状态:线程一旦脱离阻塞状态时,将重新回到就绪状态,重新向下执行,最终进入到死亡状态。一旦线程对象是死亡状态,就只能被GC回收,不能再被调用。
19.XML解析技术有哪些?它们的区别是什么?
答案:
常见的有SAX,DOM,DOM4J
- SAX:SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。
- DOM:DOM的利用SAX进行读取的,读取以后缓存到内存中成为DOM对象,处理大型文件时内存耗用较高。
- DOM4J:由于DOM API使用过于繁琐,JAVA的开源组织开发了DOM4J,底层封装了DOM,提供JAVA Bean风格的API,使用非常简洁。
20.什么是节点流,什么是过滤流,并且说出常用的节点流和过滤流?
答案:
- 节点流:有明确的数据源,从数据源读取基础的字节数据,或向数据源写入字节数据。
- 过滤流:依赖于其他流,不能单独使用,并且都提供了高级功能,使用起来更加方便。
- FileInputStream FileOutputStram
- BufferedInputStream BufferedOutputStream
- ObjectInputStream ObjectOutputStream
21.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法?
答案:
- BufferedReader只能连接在其他字符流上,所以属于字符流,其底层需要依赖于其他的字符流,或者字节流。
- BufferedReader提供了字符缓冲功能,能够一定程度上的提升IO性能。
- 提供了经典的方法readLine()方法,可以从目标流中,读取一行文本。
22.字符流和字节流的区别?并且他们的父类叫什么?
答案:
- JAVA中最基本的流是字节流,任何流的底层都是字节流。
- 字符流是以字符为单位进行读写的流,大部分的实现类是高级流,其底层一定基于字节流,字符流在字节流基础之上,扩展了字符编码解码功能。
- 字节流的抽象父类:InputStream OutputStream
- 字符流的抽象父类:Reader Writer
23.什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?
答案:
- 对象序列化,将对象中的数据编码为字节序列的过程。
- 反序列化;将对象的编码字节重新反向解码为对象的过程。
- JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定。
- 被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。
- 为了保持序列化过程的稳定,建议在类中添加序列化版本号。
- 不想让字段放在硬盘上就加transient
24.简述HashMap的工作原理?
答案:
- HashMap是面向查询优化的数据结构,查询性能优异。
- 在其内部利用数组存储数据。
- 插入数据时,先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查是否以存在重复的Key,如果不重复直接存储到数组中,如果重复就作为链表存储到散列桶中。
- 插入的数据和数组容量的比值大于加载因子则进行数组扩容,并重新散列,默认的加载因子为“0.75”。
- 查询时,先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查到Key的位置,如果找到返回Key对应的Value,否则返回Null。
- 由于利用Key的HashCode直接计算出数据的存储位置,由于直接确定数据的存储位置,相对于其他查找方式,查询效率非常高。
25.什么是反射机制?
Java 动态执行机制,可以实现动态执行功能:
- 反射提供了在运行时判断任意一个对象所属的类型,并可以检查解析类型的内部结构。
- 反射可以动态加载类型,并能够动态创建对象
- 反射可以动态访问对象的属性。
- 反射可以动态执行对象的方法。
- 利用反射API还可以动态的访问,不可见的属性和方法
26.哪里用到反射机制?
- JDBC中,利用反射动态加载了数据库驱动程序。
- Web服务器中利用反射调用了Sevlet的服务方法。
- Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
- 很多框架都用到反射机制,注入属性,调用方法,如Hibernate、Struts2、Spring。
27.反射机制的优缺点?
- 优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
- 缺点:对性能有影响,这类操作总是慢于直接执行java代码。
28.私有方法是否可以被访问?
一般情况是不可以被访问的,但是利用反射可以强行读取私有方法和属性.
第二阶段面试题
一、Web前端阶段
1. HTML是什么意思?
答案:
- 超文本标记语言
2. 什么是HTML5?
答案:
- HTML5是最新的HTML标准。
- HTML5 文档定义为:
- 新增多媒体标签: video audio
- 新标签 canvas header nav footer 等
3. 前端页面有哪三层构成,分别是什么?作用是什么?
答案:
- 结构层 Html 用于定义网页布局和显示内容
- 表示层 CSS 对html进行美化和修饰
- 行为层 js 对html和css动态交互和控制
4. CSS引入的方式有哪些?
答案:
- 内联 内部 外链
5. $(this)
和 this
关键字在 jQuery 中有何不同?
答案:
$(this)
返回值为当前 jQuery 对象,可以利用这个特点,实现连续的调用方法。
this
代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的执行方法的当前对象,this不能调用 jQuery 方法
6. jQuery中 append() 和 appendTo() 方法的区别是什么?
答案:
- 都被用来向元素内部追加内容。
- append():向每个匹配的元素内部追加内容。
- appendTo():把所有匹配的元素追加到另一个指定的元素元素集合中。
7. 请描述$("#p")
,$(".p")
,("p")
分别选择到什么对象集合?
答案:
$("#p")
————#id id选择器, 选择id
为p
唯一的元素
$(".p")
————.class 类选择器, 选择class
包含 p
的一组元素
$("p")
————elelment 元素选择器, 选择全部的
元素, 是一组元素
8. JavaScript window.onload 事件和 jQuery ready 函数有何不同?
答案:
window.onload
要等待 DOM 被创建,还要等到包括大型图片、音频、视频在内的所有外部资源都完全加载。
- jQuery
$(document).ready()
函数只需对 DOM 树的等待,而无需对图像或外部资源加载的等待,从而执行起来更快。
- 使用 jQuery
$(document).ready()
的另一个优势是你可以在网页里多次使用它,浏览器会按它们在 HTML 页面里出现的顺序执行它们
9. jQuery 里的 each() 是什么函数?你是如何使用它的?
答案:
- each() 函数就像是 Java 里的一个 Iterator,它允许你遍历一个元素集合。
- 可以遍历数组或者一组jquery选择的 dom 对象。
二、数据库阶段
1. 怎么优化数据库的查询?
答案:
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 应尽量避免在 where 子句中使用!=或<>操作符。
- 应尽量避免在 where 子句中对字段进行 null 值判断。
- 应尽量避免在 where 子句中使用 or 来连接条件。
- 下面的查询也将导致全表扫描:“select id from t where name like ‘%abc%’” 若要提高效率,可以考虑全文检索。
- in 和 not in 也要慎用,否则会导致全表扫描,很多时候用 exists 代替 in 是一个好的选择。
- 应尽量避免在 where 子句中对字段进行表达式操作。
- 应尽量避免在where子句中对字段进行函数操作。
2. 在数据库中条件查询速度很慢的时候,如何优化?
答案:
- 建索引
- 减少表之间的关联
- 优化sql,尽量让sql利用索引定位数据,不要让sql做全表查询
- 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
- 利用分页查询减少返回的数据量
3. 数据库中事务是什么,有哪些特性?
答案:
- 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序单元(unit)。
- 事务通常由SQL语言或编程语言发起并控制
- 特性:
- 事务是恢复和并发控制的基本单位。
- 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
4. sql语句关键词的执行顺序。
答案:
- FROM 子句, 组装来自不同数据源的数据
- WHERE 子句, 基于指定的条件对记录进行筛选
- GROUP BY 子句, 将数据划分为多个分组
- 使用聚合函数进行计算
- 使用 HAVING 子句筛选分组
- 计算所有的表达式
- 使用 ORDER BY 对结果集进行排序
5. 数据库有哪几种约束类型?
答案:
- 五种
- 主键约束 PRIMARY KEY
- 外键约束 FOREIGN KEY
- 唯一约束 UNIQUE
- 检查约束 CHECK
- 非空约束 NOT NULL
6. 简述数据库执行计划?
答案:
- SQL语句发送到数据库后需要翻译为执行计划,SQL语句到功能是利用执行计划执行实现的。
- 数据库在执行完全一样的SQL语句时候会重用相同的执行计划。
- 有 ? 参数的SQL语言会重用相同的执行计划。
7.数据库建立索引常用的原则是什么?什么情况下不适合建立索引?
答案:
- 在大数据量的表上建立索引才有意义
- 在where子句或是连接条件上经常引用的列上建立索引
- 很少或从不引用的字段和逻辑型的字段,如男或女(是或否)等不要建立索引
三、JDBC阶段
1. 数据连接池的工作机制是什么? 有什么优点?
答案:
- J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
- 客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
- 如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
- 当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
- 当链接数量达到连接池最大值时候,池驱动程序将不再创建新连接,只能等等连接空闲以后重用已有的连接。
优点:连接少的时候可以服用
2. 写出JDBC连接数据库的6个步骤?
答案:
- 注册驱动
- 获取连接
- 创建一个Statement语句对象
- 执行SQL语句
- 处理结果集
- 关闭资源
3. JDBC中的Statement 和PreparedStatement的区别?
答案:
- PreparedStatement 继承于 Statement
- Statement 一般用于执行固定的没有参数的SQL
- PreparedStatement 一般用于执行有?参数预编译的SQL语句。
- PreparedStatement支持?操作参数,相对于Statement更加灵活。
- PreparedStatement可以防止SQL注入,安全性高于Statement。
4. 表与表之间有哪些关联关系?
答案:
- 一对一(实际上是特殊的一对多)
- 一对多
- 多对多,需要中间关系表
5. JDBC中大数据量的分页解决方法?
答案:
- 利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。
第三阶段面试题
一、SSM
100万条数据如何插入到数据库?
首先考虑内存的开销以及耗时
1.最土的做法是循环100万次插入数据(耗时太多)
2.利用批量插入,封装多条SQL语句,进行插入,至于封装多少条要拿捏好,一次性封装太多会耗内存(会导致内存崩溃),可以封装个5000条,然后循环200百次。
1. JDBC 跟 Mybatis的区别?
答案:
- Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
- Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
- MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
- JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。
2. 简述一下事务以及事务的特性?
答案:
- 事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
- 事务具有4个特性,缺一不可,即:ACID(原子性、一致性、隔离性和持久性)
- 原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
- 一致性:事务执行时,是从一个一致状态变成另一个一致状态。
- 隔离性:一个事务的执行,不受其他事务(进程)的干扰。
- 持久性:事务一旦提交,对数据库的改变是持久的。
3. 简述Spring事务配置过程?
答案:
- Spring提供了多种事务管理器,将事务的具体工作委托给底层的持久化机制来实现(一般是数据库)。
- Spring为不同的事务提供了一致的编程模型。
- 具体使用时,可以选择使用声明式或者编程式事务。
4. 简述Spring中BeanFactory和ApplicationContext作用?
答案:
- ApplicationContext 是 BeanFactory接口的子接口
- BeanFactory 采用的是延迟加载,第一次getBean的时候才会初始化Bean
- ApplicationContext是对BeanFactory的扩展,提供了更多的功能
- 国际化处理
- 事件传递
- Bean自动装配
- 各种不同应用层的Context实现
- 结论:开发中尽量使用ApplicationContext 就可以了
5. Spring框架的优点都有什么?
答案:
- 简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
- 解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。
- 支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。
- 集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。
- 轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
6. 构造器注入和 setter 依赖注入,那种方式更好?
答案:
- 每种方式都有它的缺点和优点。
- 构造器注入保证所有的注入都被初始化,但是 setter 注入提供更好的灵活性来设置可选依赖。
- 如果使用 XML 来描述依赖,Setter 注入的可读写会更强。
- 经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
7. 依赖注入和工厂模式之间有什么不同?
答案:
- 虽然两种模式都是将对象的创建从应用的逻辑中分离,但是依赖注入比工厂模式更清晰。
- 通过依赖注入,你的类就是 POJO,它只知道依赖而不关心它们怎么获取。
- 使用工厂模式,你的类需要通过工厂来获取
8. 列出IOC的3种主要注入方式?
答案:
- 构造方法注入;
- setter属性注入;
- 接口注入。
9. 简述Spring中常用的几种Advice注解?
答案:
- @Before:在方法执行前处理
- @AfterReturning:在方法正常执行后处理
- @AfterThrowing:在方法执行期间抛出异常时处理
- @After:在方法执行前后无论是否有异常也处理
- @Around:在方法前后进行处理
10. 什么是Spring 的AOP,AOP的工作原理是什么?
答案:
- 面向切面编程简称AOP
- Spring AOP 是使用动态代理在运行期间植入增强的功能代码。
- Spring的一个关键的组件就是AOP,其中最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上。
- 允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强
11. 什么是IOC/DI,实现原理是什么?
答案:
- IOC Inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
- DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
12. 简述Spring中常用注解?
答案:
- @Component :标准一个普通的spring Bean类。
- @Repository:标注一个DAO组件类。
- @Service:标注一个业务逻辑组件类。
- @Controller:标注一个控制器组件类。
- @Autowired:注入组件(默认根据类型注入)
- @Resource:注入组件(默认根据名称注入)
- @Value:注入组件(基本值注入)
13. 简述SpringMVC的请求流程?
答案:
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
14. 简述什么是MVC?
答案:
- MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
- 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
- View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
15. 简单的说一下spring的生命周期?
答案:
- 实例化BeanFactoryPostProcessor实现类
- 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
- 实例化BeanPostProcessor实现类
- 实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
- 执行Bean的构造器
- 执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
- 为Bean注入属性
- 调用BeanNameAware的setBeanName方法
- 调用BeanFactoryAware的setBeanFactory方法
- 执行BeanPostProcessor的postProcessBeforeInitialization方法
- 调用InitializingBean的afterPropertiesSet方法
- 调用的init-method属性指定的初始化方法
- 执行BeanPostProcessor的postProcessAfterInitialization方法
- 执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
- 容器初始化成功,执行正常调用后,下面销毁容器
- 调用DiposibleBean的destory方法
- 调用的destroy-method属性指定的初始化方法
16. BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
答案:
- ApplicationContext 接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
- ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现
- 开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
17. Spring里面applicationContext.xml文件能不能改成其他文件名?
答案:
- ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
- 缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。
- 你可以通过定义一个元素名字为"contextConfigLocation"来改变Spring配置文件的位置。
18. SpringMVC如何解决线程安全性问题?
答案:
- SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。
- 因此尽量避免在Controller中使用实例变量
- 使用ThreadLocal变量。
19. 什么是事务传播?
答案:
- 事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
20. 介绍一下Spring的事物管理
答案:
- 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
- 开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
- spring提供了几个关于事务处理的类:
- TransactionDefinition //事务属性定义
- TranscationStatus //代表了当前的事务,可以提交,回滚。
- PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
21. 解释一下Spring AOP里面的几个名词
答案:
- 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
- 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点 总是 代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
- 通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
- 切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。
- 引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
- 目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
- AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
- 织入(Weaving):把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其他纯Java AOP框架一样,在运行时完成织入。
22. SpringMVC如何实现文件上载步骤?
- RFC1867 规定了HTTP文件上载协议
- 客户端
- form标签中使用属性 ENCTYPE=“multipart/form-data” METHOD=POST
- 使用 input type=file 标签选择文件
- 服务器端
- 导入commons-fileupload 组件
- 配置文件上载处理器
- 在控制器方法声明MultipartFile 类型变量接收上载文件。
23. SpringMVC如何实现Excel文件下载?
- 利用 Apache POI API生成Excel
- 在控制器中设置 ContentType 为Excel文件类型
- 在控制器中设置 Content-Disposition 设定下载文件名
二、AJAX
1. 什么是Ajax?
答案:
- Ajax的全称是Asychronous JavaScript And XML(异步JavaScript和XML);
- 是一种用来改善用户体验的技术,其实质是利用浏览器内置的一种特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。
2. 请谈一下Ajax的优点?
答案:
- 通过异步模式,提升了用户体验
- 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
- Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
- Ajax可以实现动态不刷新(局部刷新)
3. 简要描述Ajax应用的工作流程。
答案:
- 在基于Ajax的Web程序中,用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为,并转化为对服务器的请求。
- 同时它接收服务器端的返回信息,经过处理后显示给用户。
- 由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。
4. Ajax包括哪些关键技术?
答案:
- JavaScript脚本语言;
- 可扩展标记语言(XML);
- 文档对象模型(DOM);
- 级联样式表(CSS);
- XMLHttpRequest对象。
5. 常用的Ajax框架有哪些?
答案:
- WebORB for Java,Echo 2
- DWR,SWATO
- The AJAX JSP Tag Library
- The Ajax-JSF
6. Ajax的核心对象是什么?
答案:
- Ajax的核心对象是XMLHttpRequest对象。
7. 请写出创建XMLHttpRequest对象的javascript函数?
答案:
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
三、Spring Boot
1.什么是 Spring Boot?
答案:
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
2.为什么要用 Spring Boot?
答案:
Spring Boot 优点非常多,如:
- 独立运行
- 简化配置
- 自动配置
- 无代码生成和XML配置
- 应用监控
- 上手容易
- …
- Spring Boot 集这么多优点于一身,还有理由不使用它呢?
3.Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
答案:
Spring Boot 的核心配置文件是 application
和 bootstrap
配置文件。
application
配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap
配置文件有以下几个应用场景。
- 使用 Spring Cloud Config 配置中心时,这时需要在
bootstrap
配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性;
- 一些加密/解密的场景;
4.Spring Boot 的配置文件有哪几种格式?它们有什么区别?
答案:
.properties
和 .yml
,它们的区别主要是书写格式不同。
另外,.yml
格式不支持 @PropertySource
注解导入配置。
5.Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
答案:
启动类上面的注解是@SpringBootApplication
,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
@SpringBootConfiguration
:组合了 @Configuration
注解,实现配置文件的功能。
@EnableAutoConfiguration
:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
。
@ComponentScan
:Spring组件扫描。
6.开启 Spring Boot 特性有哪几种方式?
答案:
- 继承
spring-boot-starter-parent
项目
- 导入
spring-boot-dependencies
项目依赖
7.Spring Boot 需要独立的容器运行吗?
答案:
可以不需要,内置了 Tomcat / Jetty 等容器。
8.运行 Spring Boot 有哪几种方式?
答案:
- 打包用命令或者放到容器中运行
- 用 Maven / Gradle 插件运行
- 直接执行 main 方法运行
9.Spring Boot 自动配置原理是什么?
答案:
注解 @EnableAutoConfiguration
, @Configuration
, @ConditionalOnClass
就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
10.你如何理解 Spring Boot 中的 Starters?
答案:
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。
11.如何在 Spring Boot 启动的时候运行一些特定的代码?
答案:
可以实现接口 ApplicationRunner
或者 CommandLineRunner
,这两个接口实现方式一样,它们都只提供了一个 run 方法。
12.Spring Boot 有哪几种读取配置的方式?
答案:
Spring Boot 可以通过 @PropertySource
,@Value
,@Environment
,@ConfigurationProperties
来绑定变量
13.Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
答案:
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
14.SpringBoot 实现热部署有哪几种方式?
答案:
主要有两种方式:
- Spring Loaded
- Spring-boot-devtools
15.你如何理解 Spring Boot 配置加载顺序?
答案:
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
- properties文件;
- YAML文件;
- 系统环境变量;
- 命令行参数;
- 等等……
16.Spring Boot 如何定义多套不同环境配置?
答案:
提供多套配置文件,如:
applcation.properties
application-dev.properties
application-test.properties
application-prod.properties
运行时指定具体的配置文件
17.Spring Boot 可以兼容老 Spring 项目吗,如何做?
答案:
可以兼容,使用 @ImportResource
注解导入老 Spring 项目配置文件。
18.保护 Spring Boot 应用有哪些方法?
答案:
- 在生产中使用HTTPS
- 使用Snyk检查你的依赖关系
- 升级到最新版本
- 启用CSRF保护
- 使用内容安全策略防止XSS攻击
- …
19.Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
答案:
- 配置变更
- JDK 版本升级
- 第三方类库升级
- 响应式 Spring 编程支持
- HTTP/2 支持
- 配置属性绑定
- 更多改进与加强…
四、综合题目
1. 常用的设计模式有哪些,简单描述下其应用场景?
答案:
- 单例模式。
- 单例模式是一种常用的软件设计模式。
- 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
- 应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
- 工厂模式。
- 工厂模式主要是为创建对象提供了接口。
- 应用场景如下:
- 在编码时不能预见需要创建哪种类的实例。
- 系统不应依赖于产品类实例如何被创建、组合和表达的细节。
- 策略模式。
- 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
- 应用场景如下。
- 一件事情,有很多方案可以实现。
- 我可以在任何时候,决定采用哪一种实现。
- 未来可能增加更多的方案。
- 策略模式让方案的变化不会影响到使用方案的客户。
- 观察者模式。
- 观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
- 应用场景如下:
- 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
- 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
- 迭代器模式。
- 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 应用场景如下:
- 当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍 历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
- 模板方法模式。
- 模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
- 应用场景如下:
- 对于一些功能,在不同的对象身上展示不同的作用,但是功能的框架是一样的。