2017JAVA面试总结

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.线程的创建方式?

  1. 继承Thread
  2. 实现Runnable
    1. 一般来说这种比较好
  3. 线程池中取

4. 什么是线程池?为什么要使用线程池?线程池的原理和作用?

对象的创建和销毁比较耗时间,所以就通过池的技术,使得线程对象一早被创建好,用完就入回线程池,省时间.

**在什么情况下使用线程池? **

  1. 单个任务处理的时间比较短
  2. 将需处理的任务的数量大

**使用线程池的好处: **

  1. 减少在创建和销毁线程上所花的时间以及系统资源的开销
  2. 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

线程池原理

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. 接口,抽象类的区别

  1. 抽象类可以有构造方法,接口中不能有构造方法。
  2. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
  3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
  4. 一个类可以实现多个接口,但只能继承一个抽象类。

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的一级缓存和二级缓存的区别?

  1. 作用域不同
    一级缓存: 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数据库有什么区别?

  1. Oracle是大型数据库,MySQL是中小型数据库。
  2. Oracle支持大并发,在访问量
  3. MySQL有AUTO_INCREAMENT,Oracle没有这个属性,但是有ROWNUM
  4. 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. 画表格

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);
});

网络

1. TCP/UDP区别,TCP/IP的3次握手,4次分手

2017JAVA面试总结_第1张图片
图片来源网络

操作系统

1. 什么是线程?什么是进程?

BLOG

你可能感兴趣的:(2017JAVA面试总结)