2017JAVA面试总结
这里是总结我这个月到2017的面试情况。
概率高
1. 代码的加载顺序
static
: 肯定要加载的,从父类开始,只到运行就会加载。无论有没有用到都会运行
class PLoad {
{
System.out.println("PLoad class");
}
static {
System.out.println("PLoad static");
}
public PLoad() {
System.out.println("PLoad Construtor");
}
}
public class MethodLoad extends PLoad {
{
System.out.println("MethodLoad class");
}
static {
System.out.println("MethodLoad static ");
}
public MethodLoad() {
System.out.println("MethodLoad Construtor");
}
public static void main(String[] args) {
//分情况
}
}
1).创建父类
main()方法
public static void main(String[] args) {
PLoad pLoad = new PLoad();
}
输出结果
PLoad static
MethodLoad static
PLoad class
PLoad Construtor
2). 创建子类
main()方法
public static void main(String[] args) {
MethodLoad pLoad = new MethodLoad();
}
输出结果
PLoad static
MethodLoad static
PLoad class
PLoad Construtor
MethodLoad class
MethodLoad Construtor
2. ArrayList、LinkedList、Vector、Stack
ArrayList、Vector
:底层用数组, 如果数据多为取数据,遍历数据就用
-
ArrayList
: 线程不安全,适用于单线程,效率更高 -
Vector
: 线程安全,一般用于多线程,效率比 ArrayList 低 - 时间复杂度
- 取、遍历:O(1)
- 插入或者删除:O(N)
LinkedList
: 底层用链表实现,如果数据多为添加、删除、更改就采用
- 时间复杂度
- 取、遍历:O(N)
- 插入或者删除:O(1)
Stack
: 先进后出
- FIFO
3.线程的创建方式?
- 继承Thread
- 实现Runnable
- 一般来说这种比较好
- 从
线程池
中取
4. 什么是线程池?为什么要使用线程池?线程池的原理和作用?
对象的创建和销毁比较耗时间,所以就通过池的技术,使得线程对象一早被创建好,用完就入回线程池,省时间.
**在什么情况下使用线程池? **
- 单个任务处理的时间比较短
- 将需处理的任务的数量大
**使用线程池的好处: **
- 减少在创建和销毁线程上所花的时间以及系统资源的开销
- 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
JAVA
1. i++,++i 问题
public class ChangeI {
public static void main(String[] args) {
int i = 0;
fun(i);
i = i++;
System.out.println(i); //0
}
static void fun(int i) {
i++;
}
}
2. String,StringBuffer,StringBuilder区别、应用场景
String
: String 是不可变的对象,每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。经常改变内容的字符串最好不要用 String。
StringBuffer
: 字符串缓冲,字符串的字符追加或插入到字符串缓冲区中,线程安全,多线程使用
StringBuilder
: 字符串缓冲,字符串的字符追加或插入到字符串缓冲区中,线程不安全,单线程使用,效率更高
3. 什么是数组、链表?原理、时间复杂度、什么时候用?
4. 单例模式有哪几种?为什么要用?
- 资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
- 控制资源的情况下,方便资源之间的互相通信。如线程池等。
- 能避免实例重复创建、较节约内存
- 应用于避免存在多个实例引起程序逻辑错误的场合
5. volatile 关键字的作用?
6. HashMap ,HashSet 底层结构和其原理
7.HashMap与HashSet区别、HashMap与TreeMap区别
8.ConcurrentHashMap 是做什么的?为什么要用这个而不是HashMap?
并发的HashMap
9. Overload、Override、Hide的区别?
10. 接口,抽象类的区别
- 抽象类可以有构造方法,接口中不能有构造方法。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量。
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 一个类可以实现多个接口,但只能继承一个抽象类。
11. try-catch-finally, return 顺序
//result = 2
static int post() {
int i = 0;
try {
int j = 1 / 0;
return ++i;
} catch (Exception e) {
return ++i;
} finally {
return ++i;
}
}
12. Object的hash()、equal()重写
13. Java的NIO跟BIO是什么? 有什么用?
Java Web
1. 什么是 J2EE?
J2EE是一套不同于传统开发的技术构造,包涵了很多组件,用来简化开发和部署,提高可移植性、安全性。
2. JSTL有哪些标签
- c
- fmt
3. JSP有哪些内置对象
-
request
: 客户端请求,来自POST、GET请求的参数都通过它 -
response
: 响应客户端请求 -
session
: 客户端与服务器的一次会话,从客户端连接到服务器开始,到断开连接结束 -
out
: 向客户端输出内容 -
page
: JSP页面本身,当前页面 -
application
: 用于用户间数据共享,全局唯一,从服务器启动到关闭 -
exception
: 服务器的异常信息 -
pageContext
: JSP页面内的所有对象和名字空间的访问 -
config
: Servlet配置信息
4.MVC、SpringMVC的了解,使用Spring的原因?
5.用到哪些Spring的技术
6.AOP是做什么的?怎么理解切入点?你在哪些在地方用到了AOP?通知Advice等
7.AOP怎么实现日志监控的?
8.Hibernate怎么样批量插入,你这样做的优点和缺点是什么?
对于这个问题,如果数据量很大,用Hibernate框架插入不仅慢,而且还可能内存不够.所以我还是直接使用JDBC直接操作数据库了.
优点: 快
缺点:麻烦,要用SQL.
Configuration configure = new Configuration().configure();
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session= sessionFactory.openSession();
Transaction tran= session.beginTransaction();
session.setCacheMode(CacheMode.IGNORE);
PreparedStatement stmt;
try {
stmt = session.connection()
.prepareStatement("INSERT INTO EVENTS(EVENT_DATE, title) VALUES(?,?)");
for (int i = 0; i < 200000; i++) {
stmt.setTimestamp(1, new Timestamp(new Date().getTime()));
stmt.setString(2, "Title["+i+"]");
stmt.addBatch();
}
stmt.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
tran.rollback();
}
tran.commit();
session.close();
9.Hibernate的一级缓存和二级缓存的区别?
- 作用域不同
一级缓存
: session(线程)缓存,只能在当前session前用,同一个session里缓存才起作用。当这个session关闭后这个缓存就不存在了
二级缓存
:SessionFactory(进程或集群)缓存,同一个SessionFactory生产出来的session都有效。单例的形式存在,所以在整个应用程序的生命周期里,sessionfactory会一直存在。既二级缓存也一直存在直到关闭应用程序。
使用情况
很少被修改的数据
不是很重要的数据,允许出现偶尔并发的数据
不会被并发访问的数据
二级缓存分为4种
- 类缓存
- 集合缓存
- 查询缓存
- 时间戳缓存
10.Mybatis的#和$的区别
JAVA 内存
1.内存模型,堆、栈、静态方法区
2. 什么是垃圾回收?回收什么对象?什么时候回收?回收算法是什么?
算法
1. 手写快速排序法
/**
* 递归与分冶
*/
private void quickSort(int[] arr, int left, int right) {
if (left < right) {
int pos = findQuickSortPosition(arr, left, right);
quickSort(arr, left, pos - 1);
quickSort(arr, pos + 1, right);
}
}
private int findQuickSortPosition(int[] arr, int left, int right) {
int tem = arr[left];
while (left < right) {
while (left < right && arr[right] >= tem)
right--;
arr[left] = arr[right];
while (left < right && arr[left] <= tem)
left++;
arr[right] = arr[left];
}
arr[left] = tem;
return left;
}
2.数据结构有哪些?
- 数组
- 链表
- 队列
- 栈
- 树
- 图
3.图的最短路径怎么算?
4. 树有什么特点?平衡二叉树的特点是什么?
数据库
1.什么是事务?
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元
2. MySQL事务跟Oracle事物有什么区别?
Oracle事务
: 隐式开启事务
MySQL事物
: 必须显式开启,要用 start transaction
开启
3. MySQL的存储引擎有哪些?它们的区别是什么?
innoDB:
- 支持数据库事务和外键等
- 不扶持FULLTEXT类型
- 不保存表的具体行数
- 写、修改、删除 操作多时用
MyiSam:
- 不支持数据库事务
- 支持FULLTEXT类型
- 保存表的具体行数,用的时候直接读就可以
- 强调性能,速度更快
- 读,查询 操作多用
4. MySQL数据库跟Oracle数据库有什么区别?
- Oracle是大型数据库,MySQL是中小型数据库。
- Oracle支持大并发,在访问量
- MySQL有
AUTO_INCREAMENT
,Oracle没有这个属性,但是有ROWNUM
- Oracle是提供了非常丰富的功能,而MySQL只提供了基本的关系型数据库的功
5. Oracle中函数与过程的区别?还有包
函数
:
- 只有一个返回值
- 可在SQL语句中直接调用
过程
:
- 没有返回值,通过参数指定返回值,in, out , inout,类型,out类型相当于返回值,可以有多个
- 不能在SQL运行,只能通过 call 命令调用
包
:
- 包可以封装
过程
和函数
,包类似JAVA中实现接口的类。
6.Oracle的热备份与冷备份,有多少种备份模式?
JavaScript
1. JavaScript怎么体现封装、多态、继承
封装 : 闭包就是函数里面包函数,由于prototype是通过函数名,指到其他内存空间独立的函数体,因此没法取得闭包的作用域变量。
多态 : JS 天生支持多态
继承: 原型,功能是将对象的属性延续下去通过call()
方法
2. Jquery 有哪些选择器
1. $("*"),所有元素
2. $("#abc"),ID选择器
3. $(".abc"),类选择器
4. $("p"),标签名选择器,所有的p
3. 画表格
<table>
<tr>
<td rowspan=2 colspan=4></td>
</tr>
</table>
4. ajax请求网络数据
ajax请求网络很少用,下面写一种我常用的JavaScript网络请求
fetch('http://localhost/?id=1')
.then(function(res){
return res.json();
})
.then(function(res){
console.log(res);
})
.catch(function(err){
console.log(err);
});