JAVA面试解析(有赞二面)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 引言说在前面的话:本文适合人群:急等着换工作的人我承认刷面试题很有用的,纵观几年来的JAVA面试题,你会发现每家都差不多。比如,你仔细观察,你会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构,GC算法等!因此,如果是为了面试,完全是有套路可以准备的!记住,基础再好,也架不住面试官天马行空的问,所以刷面试题还是很有必要的!本文不适合人群:专攻JAVA某方面技术的人因为这类人专攻JAVA某块技术,知识容易出现死角。

引言

说在前面的话:

本文适合人群:急等着换工作的人

我承认刷面试题很有用的,纵观几年来的JAVA面试题,你会发现每家都差不多。比如,你仔细观察,你会发现,HashMap的出现几率未免也太高了吧!连考察的知识点都一样,什么hash碰撞啊,并发问题啊!再比如JVM,无外乎考内存结构,GC算法等!因此,如果是为了面试,完全是有套路可以准备的!记住,基础再好,也架不住面试官天马行空的问,所以刷面试题还是很有必要的!

本文不适合人群:专攻JAVA某方面技术的人

因为这类人专攻JAVA某块技术,知识容易出现死角。贸然阅读本文,发现自己一堆题目都不会,会觉得有一种挫败感,发现自己连校招生都不如。然而,会点面试题不算什么,毕竟Homebrew作者也出现过解不出面试题,被Google拒绝,缘由就是,因为他不会翻转二叉树。难道你能说Homebrew的作者水平有问题!

正文

1、HashMap,源码级别的问了,包括为什么线程不安全

评注:这问题一面的时候问过了,嗯,说明大家以后面试,不管是几面,复习过的知识点还是要复习,毕竟一面的面试官只会告诉二面的面试官印象,不会具体聊问了啥问题!比如,我和二面面试官说,这个候选人基础还不错,那二面面试官就会觉得:"咦,这个人基础不错,我试试是不是真的是这样!"所以难免会出现一样的题目!

另外,此题不好答。因为是关于源码级别的问,需要复习的知识点很多。大家关注一下我,我会出一篇对HashMap能问的知识点总结。比如jdk1.7和jdk1.8的hashmap结构区别、hashmap并发问题,哈希冲突的常见解决手段等!

回答: 略去。

2、死锁

评注:这问题一面的时候问过了,嗯,凸显!

回答: 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。

产生死锁的原因主要是:

因为系统资源不足。

进程运行推进的顺序不合适。

资源分配不当等。

3、Synchronized 和 ReentrantLock 锁机制,怎么判断重入锁的,会不会是死锁?

评注:并发基础问题,懂并发编程的,应该都会。

回答:

先答区别:

API方面:synchronized既可以修饰方法,也可以修饰代码块。ReentrantLock只能在方法体中使用。

公平锁:synchronized的锁是非公平锁,ReentrantLock默认情况下也是非公平锁,但可以通过带布尔值的构造函数要求使用公平锁。

等待可中断:假如业务代码中有两个线程,Thread1 Thread2。假设 Thread1 获取了对象object的锁,Thread2将等待Thread1释放object的锁。

使用synchronized。如果Thread1不释放,Thread2将一直等待,不能被中断。synchronized也可以说是Java提供的原子性内置锁机制。内部锁扮演了互斥锁(mutual exclusion lock ,mutex)的角色,一个线程引用锁的时候,别的线程阻塞等待。

使用ReentrantLock。如果Thread1不释放,Thread2等待了很长时间以后,可以中断等待,转而去做别的事情。

至于判断重入锁,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。

4、进程和线程的区别?

评注:操作系统的题目,很常规!

回答:

进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。

线程是一种轻量级的进程,与进程相比,线程给操作系统带来侧创建、维护、和管理的负担要轻,意味着线程的代价或开销比较小。

5、进程之间如何保证同步?

评注:操作系统老题了,四种方法!

回答:上网给大家找了一张图!

img_93dc3ce5798cfc890abc4b3530657e41.jpe

6、分布式锁

评注:此题问的没头没尾的,分布式锁可以问的点很多,比如实现方式啊?性能差距啊?

回答:这题如果要详答,看我的另一篇文章《分布式之抉择分布式锁》

分布式锁有三种实现方式:数据库、缓存、Zookeeper,这里我直接罗列一下各种锁的对比吧

从理解的难易程度角度(从低到高)

数据库 > 缓存 > Zookeeper

从实现的复杂性角度(从低到高)

Zookeeper >= 缓存 > 数据库

从性能角度(从高到低)

缓存 > Zookeeper >= 数据库

从可靠性角度(从高到低)

Zookeeper > 缓存 > 数据库

7、对象 GC

评注:一面问过,把一面的回答贴过来!

回答:

这个算法的基本思路是通过一些列称为“GC Roots”的对象作为起始点,从这些点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明对象需要被回收.

如图:

img_78fdac9ca4d12089c00618575df809cd.jpe

上图中o3,o4对象没有任何GC Roots可达到,所有这两个对象不可用了,需要被GC回收

Java可作为GC Roots的对象包括下面几种:

虚拟机栈中引用的对象

方法区中类静态属性引用的对象

方法区中产量引用的对象

本地方法栈中JNI引用的对象

8、垃圾回收算法

评注:一面问过,把一面的回答贴过来!

回答:

标记-清除算法、标记整理算法、复制算法、分代收集算法

9、JVM 参数

评注:这个回答还是略去吧,这个问题范围太大,我不知道该怎么答。

回答:略去。

10、OOM 出现的有哪些场景?为什么会发生?

评注:常规题,只是情况太多了!

回答:

OOM for Heap (java.lang.OutOfMemoryError: Java heap space):heap的最大值不满足需要,将设置heap的最大值调高即可。

OOM for StackOverflowError (Exception in thread "main" java.lang.StackOverflowError):如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。

OOM for GC (java.lang.OutOfMemoryError: GC overhead limit exceeded):此OOM是由于JVM在GC时,对象过多,导致内存溢出。

OOM for native thread created (java.lang.OutOfMemoryError: unable to create new native thread):这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。

OOM for allocate huge array (Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit):此类信息表明应用程序试图分配一个大于堆大小的数组。例如,如果应用程序new一个数组对象,大小为512M,但是最大堆大小为256M,因此OutOfMemoryError会抛出,因为数组的大小超过虚拟机的限制。

OOM for small swap (Exception in thread "main": java.lang.OutOfMemoryError: request bytes for . Out of swap space? ):抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。

OOM for exhausted native memory (java.lang.OutOfMemoryErr java.io.FileInputStream.readBytes(Native Method)):由于Native memory被耗尽导致的。

11、JVM 内存结构说下吧

评注:常规题,学过JVM的都会!

回答:来一张图就好了。

有5大内存区域,按照是否被线程所共享可分为两部分,一部分是线程独占区域,包括Java栈,本地方法栈和程序计数器。还有一部分是被线程所共享的,包括方法区和堆。注意了,下一题就是问的是堆和栈的共享问题!

如下图所示

img_9f5d77aac21a20d036d955cd55f33987.jpe

12、堆和栈的共享问题?

评注:常规题,大家应该都答的上来,属应届生常见问题!

回答:

栈内存的一个特点是数据共享,比如你线程中执行下面两句话

inti =1;

intj =1;

如下图所示

img_2faabaf4b0ed0545f6507a44a6735657.png

前面定义了i=1,i和1都在栈内存内,如果再定义一个j=1,此时将j放入栈内存,然后查找栈内存中是否有1,如果有则j指向1。

堆内存没有数据共享的特点,比如你线程中执行了下面两句话

Strings =newString("Hello World");

Stringw =newString("Hello World");

此时如下图所示

img_3cddfaddcf60b5cf6e4124e97a5faac2.jpe

13、有比较过 Http 和 RPC 吗?

评注:此题我按我的理解来答。我不确定对不对,因此我觉得http和rpc没啥可比性,不是一个级别的概念。

回答:

只要是远程调用都可以叫RPC,和是不是通过http没什么关系。

那么,调用过程,也就是通信过程之间需要协议,可以是HTTP协议、dubbo协议等、其他协议等。

14、HttpClient 你说说里面的具体实现吧?(涉及了哪些东西)

评注:此题只能回答一个大概,我找了一个架构图来进行说明

回答:

如下图所示

img_8fa16397a7a5993974e9918d065a913f.jpe

Httpclient将对接的服务器或者集群(相同域名)称为route,并为每个route建立若干连接,并池化在连接池里。Client通过tcp/ip协议发送请求以及接受应答,在发送请求前和接收应答后都会经由interceptor进行链式处理,在httpclient里这些interceptor被称为HttpProcessor,负责处理诸如设置报文头,报文体,编码格式等以及解析报文头,报文体,解码格式等http规范报文格式范畴内的事情。

15、那要你设计一个高性能的 Http ,你会怎么设计?

评注:此题,作者漏了最重要的主语。。。Http什么?Http服务器么?HTTP接口?此题范围太大,都可以单独写文章了。可以关注作者,后面写。

回答:略去

欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

相关文章
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
3天前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
6天前
|
数据采集 存储 Web App开发
Java爬虫:深入解析商品详情的利器
在数字化时代,信息处理能力成为企业竞争的关键。本文探讨如何利用Java编写高效、准确的商品详情爬虫,涵盖爬虫技术概述、Java爬虫优势、开发步骤、法律法规遵守及数据处理分析等内容,助力电商领域市场趋势把握与决策支持。
|
11天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
12天前
|
Java 测试技术 API
Java 反射机制:深入解析与应用实践
《Java反射机制:深入解析与应用实践》全面解析Java反射API,探讨其内部运作原理、应用场景及最佳实践,帮助开发者掌握利用反射增强程序灵活性与可扩展性的技巧。
|
17天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
25 4
|
16天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
50 2
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
20天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
22天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
44 4

推荐镜像

更多