Java基础面试题面经整理(持续更新)

前提

临近秋招,本博文主要整理最近各大企业面经里的那些Java基础面试题,并经过对比整合给出一份参考答案。并没有按照特定顺序,仅仅是提供了复习了以后测试掌握。文章的答案不必定绝对正确,若是有错误的地方还望指出!html

一、equals 和 == 的区别?

最直接,咱们点开equals的源码java

public boolean equals(Object obj) {
        return (this == obj);
    }

咱们能够发现equals也是用的== 来比较的,可是为何还要说它们之间的区别呢?由于equals的方法能够根据咱们的须要重写。==若是比较的是两个值类型的话,那么就是比较它们之间是否相等,若是是引用类型的话,那么就是比较它们之间的地址了。面试

二、为何重写equals必定要重写hashcode?

默认的hashcode方法是根据对象的内存地址经哈希算法获得的,若是不重写的话,那么在两个相同的对象在使用equals方法的时候就有可能不一样。这在咱们的map中的话,若是以对象为key的话,就会致使咱们逻辑上的key相同却有着不一样的值!算法

三、Integer与int的==比较是怎么样的?

首先看一下下面的比较编程

public static void main(String[] args) {
        Integer a = 3;
        int b = 3;
        Integer c = Integer.valueOf(3);
        Integer d = new Integer(3);
        System.out.println(a == b);   //输出true
        System.out.println(b == c);   //输出true
        System.out.println(b == d);   //输出true
        System.out.println(a == c);   //输出true
        System.out.println(c == d);   //输出false
    }

咱们的Integer在int比较的时候,会自动拆箱,再作值比较,因此返回true;安全

Integer之间的比较的话,除了new Integer()以外,其余比较都是同一段地址,而new的新对象则不是,因此返回的false。多线程

四、接口和抽象类的区别?

  • 接口中的全部方法都是抽象的,而抽象类能够有抽象的和非抽象的
  • 类能够实现不少个接口,但只能继承一个抽象类
  • 类能够不实现抽象类和接口声明的全部方法,可是该类必须声明成抽象的
  • 接口的成员方法默认是public,而抽象类的成员能够是private,protected,public
  • JDK1.8开始,接口中能够包含default方法(能够进行实现),可是抽象类没有。

五、Java的异常处理机制,Error和Exception的区别?

两者都有共同的父类——Throwable!app

Error:表示程序发生错误,是程序没法处理的,不可恢复的,如OutOfMemoryError异步

Exception: 表示程序可处理的异常,又分为CheckedException(受检异常)、UncheckedException(非受检异常),受检异常发生在编译期,必需要使用try...catch 或者 throws捕获或者抛出异常,不然编译不经过(如IOException之类,多线程之类的);非受检异常发生在运行期,具备不肯定性,主要由程序的逻辑问题引发的,在程序设计的时候要认真考虑,尽可能处理异常。(如NullPointException 参数值为null(空指针),IndexOutOfBoundsException 下标参数值越界)函数式编程

六、++和--操做是否为原子操做,为何?

不是原子性操做。原子性的意思是操做不可分割,可是咱们的++和--确实能够分为三个步骤(读写改)

  1. 从栈读取咱们的值
  2. 进行加1的操做
  3. 将咱们的值压回栈

因此再多线程状况下,就会致使咱们的自增或者自减不许确!

七、面向对象的三大特性是什么?请简单介绍一下!

封装、继承、多态

封装: 所谓封装,也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操做这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据能够是私有的,不能被外界访问。经过这种方式,对象对内部数据提供了不一样级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

继承: 所谓继承是指可让某个类型的对象得到另外一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可使用现有类的全部功能,并在无需从新编写原来的类的状况下对这些功能进行扩展。 经过继承建立的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从通常到特殊的过程。要实现继承,能够经过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、可是子类必须提供实现的能力;

多态: 所谓多态就是指一个类实例的相同方法在不一样情形有不一样表现形式。多态机制使具备不一样内部结构的对象能够共享相同的外部接口。这意味着,虽然针对不一样对象的具体操做不一样,但经过一个公共的类,它们(那些操做)能够经过相同的方式予以调用。

八、Java中是如何具体实现多态的?

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

面向对象方法中,把数据和数据操做放在一块儿,组成对象;对同类的对象抽 象出其共性组成类;类经过简单的接口与外界发生联系,对象和对象之间经过消 息进行通讯。而面向过程方法是以过程为中心的开发方法,它自顶向下顺序进行, 程序结构按照功能划分红若干个基本模块,这些模块造成树状结构。

(过程)优势:性能比面向对象高,由于类调用时须要实例化,开销比较大,比较消耗源;好比嵌入式开发、Linux/Unix等通常采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展。

(对象)优势:易维护、易复用、易扩展,因为面向对象有封装、继承、多态性的特性,能够设计出低耦合的系统。缺点:性能比面向过程低。

十、String/StringBuffer/StringBuilder的区别?

String:不可变字符序列

StringBuffer:可变字符序列、效率低、线程安全(使用Synchronized修饰)

StringBuilder:可变字符序列、效率高、线程不安全

字符串直接相加本质也是转换成StringBuilder调用append,可是由于会产生大量的StringBuilder对象因此不如直接new一个StringBuilder来用效率高!

十一、什么是面向函数式编程?

十二、谈谈static,final关键字?

1三、谈谈volatile、synchronized关键字?

谈到这两个关键字须要了解到JMM和内存模型,能够看看个人另外一篇博客。(点击跳转

1四、谈谈深拷贝和浅拷贝?

1五、Java线程和系统线程的区别?

1六、开多个Java进程和多个线程的区别?

1七、什么是同步与异步,阻塞与非阻塞?

1八、多进程之间如何进行通讯?


待更新

相关文章
相关标签/搜索