Java 高级开发工程/技术经理 高频面试(找工作版)

刷高频面试题
摘要由CSDN通过智能技术生成

文章目录

1. Java 基础

1.1 Java语言的三大特性是什么?

在这里插入图片描述

1.2 重载与重写的区别

> 这里是引用

1.3 接口和抽象类的区别是什么?

接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。

接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。

抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实现,否则也是抽象类。

相同点:
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点:
(1)接口只有定义,不能有方法的实现,但java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。

(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。

1.4 说一下final关键字的作用

final关键字可以修饰类、方法和属性。

当final修饰类的时候,表明这个类不能被继承。final 类中的所有成员方法都会被隐式地指定为 final 方法。

当final修饰方法的时候,表明这个方法不能被重写。

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

1.5 说一下String,StringBuilder和StringBuffer的区别

在这里插入图片描述

1.6 说一下Java中的==与eaquels的区别

在这里插入图片描述

1.7 Java访问修饰符有哪些?都有什么区别?

Java中的修饰符有public private protected

1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。

追问:怎么获取private修饰的变量
回答:private通过反射获取,可以设置setAccessable为true实现

1.8 Object 中有哪些方法?其中clone(),怎么实现一个对象的克隆,Java如何实现深度克隆?

在这里插入图片描述

1.9 BIO、NIO、AIO

在这里插入图片描述

1.9.1 NIO

在这里插入图片描述

在这里插入图片描述

1.9.2 NIO 和 BIO 对比

在这里插入图片描述

1.10 集合

1.10.1 Java中的集合框架有哪些?

Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。

Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、TreeMap、LinkedHashMap 等等。

在这里插入图片描述

1.10.2 ArrayList和LinkedList的底层实现和区别?

ArrayList底层使用的是 Object数组;LinkedList底层使用的是 双向链表 数据结构。

ArrayList:增删慢、查询快,线程不安全,对元素必须连续存储。

LinkedList:增删快,查询慢,线程不安全。

1.10.2.1 说说ArrayList的扩容机制?

通过阅读ArrayList的源码我们可以发现当以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。当插入的元素个数大于当前容量时,就需要进行扩容了, ArrayList 每次扩容之后容量都会变为原来的 1.5 倍左右。

1.10.3 HashMap的底层实现原理

HashMap 底层实现原理

1.10.4 Java中线程安全的集合有哪些?

在这里插入图片描述

1.10.5 说一下ConcurrentHashMap的底层实现,它为什么是线程安全的?

ConcurrentHashMap是如何保证线程安全的?

1.10.6 HashMap和Hashtable的区别

在这里插入图片描述

1.10.7 HashMap和TreeMap的区别?

在这里插入图片描述

1.10.8 HashMap和ConcurrentHashMap的区别

参考链接

1.11 Java多线程与并发编程高频问题

在这里插入图片描述

1.11.1 说说什么是线程安全?如何实现线程安全?

什么是线程安全?

1.11.2 Synchronized和ReentLock的区别是什么?

在这里插入图片描述

1.11.3 Synchronized和volatile的区别

在这里插入图片描述
Volatile关键字的作用

1.11.4 synchronize锁的作用范围

在这里插入图片描述

1.11.5 Java中线程的状态有哪些?线程间的通信方式有哪些?

在这里插入图片描述
在这里插入图片描述

1.11.6 sleep后进入什么状态,wait后进入什么状态?

sleep后进入Time waiting超时等待状态,wait后进入等待waiting状态。

1.11.7 sleep和wait的区别?

在这里插入图片描述

1.11.8 start方法和run方法有什么区别?

在这里插入图片描述

1.11.9 什么是乐观锁,什么是悲观锁?

在这里插入图片描述

面试必备之乐观锁与悲观锁

1.11.10 Java中创建线程的方式有哪些?

在这里插入图片描述

1.11.11 ThreadPoolExecutor 线程池的参数、工作原理?

在这里插入图片描述

1.11.13 ThreaLocal知道吗?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.11.14 Runnable接口和Callable接口的区别

Callable和Runnable的区别(面试常考),看完就懂

1.11.15 synchronized、Lock、ReentrantLock、ReadWriteLock

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值