Java研发工程师的面试宝典

2017/8/26 posted in  Java  

Java基础

面向对象和面向过程的区别?

面向过程

  • 定义:
  • 优点:性能比面向对象高,因为类调用时需要实例化
  • 缺点:没有面向对象易维护,易复用,易扩展

面向对象

  • 定义:面向对象程序设计是种具有对象概念的程序编程范型,同时也是一种程序开发的抽象方针。它可能包含数据、属性、代码与方法。对象则指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。

Java的四个基本特性?

  • 抽象:就是把现实生活中的某一类东西提取出来,用程序代码进行表示,通常叫做类或者接口。抽象包括于两个方面:一个是数据抽象,一个是过程抽象。数据抽象也就是对象的属性,过程抽象是对象的行为特征。
  • 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行隐藏。封装也分为属性的封装和方法的封装。
  • 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
  • 多态:允许不同的子类对象对同一消息做出响应。即父类引用指向子类对象。

重载(Overload)和重写(Override)的区别?

  • 重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
  • 重写:发生在父子继承关系中,方法名和参数列表必须相同,返回值可以小于等于父类定义的返回值,抛出异常小于等于父类,访问修饰符大于等于父类。

构造器Constructor是否可被重写

不可以。构造器不能被重写,且不能用static修饰,只能添加private、protected、public在三个权限修饰符,且不能有返回语句。

访问控制符private、default、protected、public的区别

  • private修饰的方法和属性只能在本类中被访问
  • default修饰的方法和属性在同包下可访问
  • protected修饰的方法和属性在同包和子类中可访问
  • public修饰的方法和属性是公开的

是否可以继承String类?为什么?

不能。String类是final关键字修饰的,所以不可继承。

String、StringBuilder、StringBuffer的区别?

  • 可变性:
    • 不可变对象:String
    • 可变对象:StringBuilder、StringBuffer
  • 线程安全性:
    • 线程安全的:StringBuffer
    • 线程不安全:StringBuilder

hashCode()和equals()的关系

如果两个对象equals()的返回值为true,那么他们应该有同样的hashCode值。反之,若两个对象由相同的hashCode他们可能不相等(equals()返回false)。

抽象类和接口的区别

  • 语法层次:抽象类和接口的定义方式有区别
  • 抽象层次:抽象类是对对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。抽象类是自底向上抽象而来的,接口是自顶向下设计出来的。
  • 跨域不同:抽象类所体现的是一种继承关系,想要使得继承关系合理,父类和子类之间必须存在“is-a”的关系,即父类和子类在概念本质上应该是相同的。对于接口来说,并不要求接口的实现者和接口定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已,表达“like-a”关系。

Java中的基本类型?自动装箱与拆箱?

  • Java中的基本类型有8种:byte、short、int、long、float、double、boolean、char;
  • 对应的包装类类别:Byte、Short、Integer、Long、Float、Double、Boolean、Character
  • 装箱:将基本应用类型用它们对应的引用类型包装起来;
  • 拆箱:将包装类型转换为基本类型;
  • Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提升了效率。由编译器来完成,编译器在编译期间根据语法决定是否进行装箱和拆箱操作。

什么是泛型?为什么要使用泛型?什么是类型擦除?

  • 泛型即参数化类型。创建集合时就指定集合元素的类型,确保该集合只能保存其指定的类型元素,避免使用强制类型转换。
  • Java编译器生成的字节码是不包含泛型信息的,泛型类型信息将在编译处理时被擦除,这个过程被称为类型擦除。类型擦除的主要过程如下:
    1. 将所有的泛型参数用其最左边(最顶级的父类型)类型替换。
    2. 移除所有的泛型信息。

Java中的集合类及关系图

  • List和Set继承自Collection接口
    • Set无序、不允许重复元素。HashSet和TreeSet是两个主要的实现类;
    • List有序,运行重复元素。ArrayList和LinkedList是两个主要的实现类;
  • Map也属于集合系统,但是没有实现Collection接口。Map主要表示Key对Value的映射集合。Key值不可重复,但是Vaule可以重复。HashMap和TreeMap是两个主要的实现类。

HashMap的实现原理?

待填坑

Hashtable的实现原理?

待填坑

HashMap和Hashtable的区别?

Hashtable如何实现线程安全?

ArrayList和Vector的区别?

ArrayList和LinkedList的区别和使用场景?

区别

  • ArrayList基于数组实现,可以简单的认为ArrayList是一个大小可变的数组,随着越来越多的元素被添加到ArrayList中,其规模动态增加。
  • LinkedList基于双向链表实现,相较于ArrayList,元素增删的速度较快,但是随机访问的速度较慢,且LinkedList实现了Queue接口,还可以作为队列使用。

使用场景

  • LinkedList适用于频繁增删的场景
  • ArrayList适用于检索频繁的场景

Collection和Collections的区别?

  • java.util.Collection是一个集合接口。他提供了对集合对象进行基本操作的通用接口方法,在Java类库中很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
  • java.util.Collections是一个包装类。它包含各种有关机和操作的静态方法,此类不能实例化,就像一个工作类,服务于Java的集合框架

ConcurrentHashMap的实现原理

Java的异常机制?Error、Exception的区别?

在Java中,所有的异常都有一个共同的祖先Throwable。Throwable指定代码中可用异常传播机制通过Java应用程序传输的任何问题的共性。Throwable有两个重要的子类:

  • Error:一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、内存空间不足、方法调用栈溢出。对于这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误建议程序终止。
  • Exception:表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能的处理异常,使程序恢复运行,而不会随意终止。

Unchecked Exception和Checked Exception?

  • Unchecked Exception
    • 指的是程序的瑕疵或逻辑错误,并在运行时无法恢复
    • 包括Error和RuntimeException及其子类
    • 语法上不需要声明抛出异常
  • Checked Exception
    • 代表程序不能直接控制的无效界外情况(如用户输入、数据库问题、网络异常、文件丢失等)
    • 除了Error和RuntimeException及其子类之外
    • 需要使用try-catch处理或throws声明抛出异常

JavaEE

Servlet生命周期和各个方法?

Servlet的生命周期

Servlet的生命周期分为四个部分,分别是:加载->实例化->服务->销毁

主要方法

  • init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行,负责初始化Servlet对象。可以通过配置服务器配置,以在服务器启动或在客户机首次访问Servlet时装入Servlet对象。无论有多少客户机访问Servlet,都不会重复执行init()方法。
  • service():Servlet的核心方法,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的service()方法就要调用,而且传递给这个方法一个ServletRequest对象和一个ServletResponse对象作为参数。
  • destory():仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其它的线程,因此需要确认在调用destory()方法时,这些线程已经终止或者完成。

Servlet中如何定义Filter?