zoukankan      html  css  js  c++  java
  • Java基础面试题面经整理(持续更新)

    前提

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

    正文

    1、equals 和 == 的区别?

    最直接,我们点开equals的源码

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

    我们可以发现equals也是用的== 来比较的,但是为什么还要说它们之间的区别呢?因为equals的方法可以根据我们的需要重写。==如果比较的是两个值类型的话,那么就是比较它们之间是否相等,如果是引用类型的话,那么就是比较它们之间的地址了。

    2、为什么重写equals一定要重写hashcode?

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

    3、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。

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

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

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

    二者都有共同的父类——Throwable!

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

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

    6、++和--操作是否为原子操作,为什么?

    不是原子性操作。原子性的意思是操作不可分割,但是我们的++和--确实可以分为三个步骤(读写改)

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

    所以再多线程情况下,就会导致我们的自增或者自减不准确!

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

    封装、继承、多态

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

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

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

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

    (待补充)

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

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

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

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

    10、String/StringBuffer/StringBuilder的区别?

    String:不可变字符序列

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

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

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

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

    12、谈谈static,final关键字?

    final

    • 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

    • 当final修饰一个变量的时,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

    static

    • 被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类

    • 被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类

    被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,换言之,一处变、处处变。

    引出问题

    这里引出一个问题,被final修饰的对象,变量存放在哪里,被static修饰的对象,变量存放在哪里,同时被两个关键字修饰存放在哪里?

    这里给上一个参考答案

    13、谈谈volatile、synchronized关键字?

    谈到这两个关键字需要了解到JMM和内存模型,可以看看我的另一篇博客。(点击跳转

    14、谈谈深拷贝和浅拷贝?

    浅拷贝: 只复制当前对象的基本数据类型及引用变量,没有复制引用变量指向的实际对象。修改克隆对象可能影响原对象,不安全。

    深拷贝: 完全拷贝基本数据类型和引用数据类型,安全。

    15、Java线程和系统线程的区别?

    简单总结,系统线程主要实现在三个方面:

    • 实现在用户空间下:操作系统对线程的存在一无所知,操作系统只能看到进程,而不能看到线程。所有的线程都是在用户空间实现。在操作系统看来,每一个进程只有一个线程。
    • 实现在操作系统内核中:内核线程就是直接由操作系统内核(Kernel)支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。通俗的讲就是,程序员直接使用操作系统中已经实现的线程,而线程的创建、销毁、调度和维护,都是靠操作系统(准确的说是内核)来实现,程序员只需要使用系统调用,而不需要自己设计线程的调度算法和线程对CPU资源的抢占使用。

    Java线程在JDK1.2之前,是基于称为“绿色线程”(Green Threads)的用户线程实现的,而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。

    参考资料

    16、进程和线程的区别?

    进程和线程的主要区别在于它们是不同的操作系统资源管理方式。

    • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响。

    • 线程只是一个进程中的不同执行路径,有自己的堆栈和局部变量,但线程之间没有单独的地址空间。

    一个线程死亡就等于整个进程死亡,所以多进程的程序要比多线程的程序健壮。但是,在进程切换时,耗费资源较大,效率较低。因此,对于一些要求同时进行并且又要共享某些变量的并发操作,只能用多线程,而不能用多进程。

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

    同步和异步是通信机制,阻塞和非阻塞是调用状态。

    以IO为例:

    同步 IO 是用户线程发起 IO 请求后需要等待或轮询内核 IO 操作完成后才能继续执行。异步 IO 是用户线程发起 IO 请求后可以继续执行,当内核 IO 操作完成后会通知用户线程,或调用用户线程注册的回调函数。

    阻塞 IO 是 IO 操作需要彻底完成后才能返回用户空间 。非阻塞 IO 是 IO 操作调用后立即返回一个状态值,无需等 IO 操作彻底完成。

    通俗概念可以参考这一篇理解简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞

    18、各大排序的算法的复杂度和稳定性?

    19、Java的基本数据类型

    JVM 没有 boolean 赋值的专用字节码指令,boolean f = false 就是使用 ICONST_0 即常数 0 赋值。单个 boolean 变量用 int 代替,boolean 数组会编码成 byte 数组。

    数据类型 内存大小 默认值 取值范围
    byte 1 B (byte)0 -128 ~ 127
    short 2 B (short)0 -215 ~ 215-1
    int 4B 0 -231 ~ 231-1
    long 8B 0L -263 ~ 263-1
    float 4B 0.0F ±3.4E+38(有效位数 6~7 位)
    double 8B 0.0D ±1.7E+308(有效位数 15 位)
    char 英文 1B,中文 UTF-8 占 3B,GBK 占 2B。 'u0000' 'u0000' ~ 'uFFFF'
    boolean 单个变量 4B / 数组 1B false true、false

    20、自动装箱/拆箱是什么?

    每个基本数据类型都对应一个包装类,除了 int 和 char 对应 Integer 和 Character 外,其余基本数据类型的包装类都是首字母大写即可。

    自动装箱: 将基本数据类型包装为一个包装类对象,例如向一个泛型为 Integer 的集合添加 int 元素。

    自动拆箱: 将一个包装类对象转换为一个基本数据类型,例如将一个包装类对象赋值给一个基本数据类型的变量。

    比较两个包装类数值要用 equals ,而不能用 ==

  • 相关阅读:
    pandas-06 Series和Dataframe的排序操作
    java架构之路-(面试篇)JVM虚拟机面试大全
    java架构之路-(spring源码篇)springIOC容器源码解析(上)
    java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(下)注解配置,统一错误处理和拦截器
    java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程
    java架构之路-(分布式zookeeper)zookeeper集群配置和选举机制详解
    java架构之路-(分布式zookeeper)初识zookeeper安装与参数详解
    java架构之路-(mysql底层原理)Mysql事务隔离与MVCC
    java架构之路-(设计模式)五种创建型模式之单例模式
    java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
  • 原文地址:https://www.cnblogs.com/CryFace/p/13432810.html
Copyright © 2011-2022 走看看