2017JAVA面试总结

2017-03-30  本文已影响134人  琴声悠扬TODO

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 :底层用数组, 如果数据多为取数据,遍历数据就用

LinkedList: 底层用链表实现,如果数据多为添加、删除、更改就采用

Stack: 先进后出

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有哪些标签

3. JSP有哪些内置对象

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:

MyiSam:

4. MySQL数据库跟Oracle数据库有什么区别?

  1. Oracle是大型数据库,MySQL是中小型数据库。
  2. Oracle支持大并发,在访问量
  3. MySQL有AUTO_INCREAMENT,Oracle没有这个属性,但是有ROWNUM
  4. Oracle是提供了非常丰富的功能,而MySQL只提供了基本的关系型数据库的功

5. Oracle中函数与过程的区别?还有包

函数

过程

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

网络

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

图片来源网络

操作系统

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

BLOG

上一篇 下一篇

猜你喜欢

热点阅读