java中级面试题及答案_Java中级面试题

java中级面试题及答案_Java中级面试题一、Java笔试题基础1.Java中的异常有哪几类?分别怎么使用?检出异常,非检出异常。检出异常需要try…catch才能编译通过。非检出异常不用try…catch也能编译通过。RuntimeException是非检出异常,不需要try…catch也能编译通过。IoException,SQLException等等其他所有异常都是检出异常,必须要try…catach才能编译通过。2.常用的集合类有哪些?比如List如何排序?分两种,一种实现Set接口,一种是实现List接口的。Set:Tre

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、Java笔试题基础

1. Java中的异常有哪几类?分别怎么使用?

检出异常,非检出异常。检出异常需要try…catch才能编译通过。非检出异常不用try…catch也能编译通过。

RuntimeException是非检出异常,不需要try…catch也能编译通过。

IoException,SQLException等等其他所有异常都是检出异常,必须要try…catach才能编译通过。

2. 常用的集合类有哪些?比如List如何排序?

分两种,一种实现Set接口,一种是实现List接口的。

Set:TreeSet,HashSet.

List:ArrayList,LinkedList,Vector(线程安全)。

JDK7以前用collections.sort(list,Comparator).

JDK8直接用List.sort(Comparator).

4. ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和各自适应的场景是什么?

ArrayList,是数组结构:少用与中间的增删。多用于查询,修改。每次增删元素顺序都会操作每个元素。

LinkedList,是链表结构:多用于中间,开头增删。少用查询,修改。查询时会遍历大量元素。

5. 内存溢出是怎么回事?

对象有被指向的引用,但是再也用不到它就是内存溢出了。

GC机制:复制回收,标记清除,引用计数(如果有循环引用后,会影响垃圾回收,所以JVM虚拟机没有采用此方法进行垃圾回收)。

6. ClassLoader有什么用?

类加载器:所有类都需要Classloader来加载。

BoostrapClassLoader,加载系统(java包下)的类,SystemClassLoader,加载系统扩展类(少用),AppClassloader应用类加载器,还有针对每个项目的类加载器。

7. ==和equals的区别?

==判断对象物理地址。

equals判断对象Value是否相等。

8. hashCode方法的作用?

在hashMap中使用,把一个对象变成一个整型。hashCode规范,如果两个对象的equals返回true,那他们的hashCode必须相等,但是hashCode相等,不一定equals不一定相等。

9. Object类中有哪些方法?列举3个以上。

构造方法,toString(),equals,hashCode,getClass,finalize,clone,三个wait(),notify,notifyAll.

10. NIO是什么?适用于何种场景?

NIO是newIO,接口都是异步的,非阻塞的。

12. HashMap数据结构、扩展策略,Hash冲突攻击如何防范,如何实现线程安全的HashMap?

JDK7以前:数组里面存linkedList,hash冲突,升级到JDK8。

JDK8,数组里面加集合,如果对象hashCode相同,不可比较时就是linkedList,可比较就会用TreeSet进行排序处理(红黑树先访问小的)。hash冲突不用防范。如果对象不可比较且hash冲突,我们可适当实现可比较接口。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

线程安全:ConcurrentHashMap(系统自带的线程安全的HashMap),Map synchronizedMap = Collections.synchronizedMap(new HashMap<>()); synchronizedMap 为线程安全的Map.

16. Java中一个字符占多少个字节,扩展再问int, long, double占多少字节

一个字符两个字节,int 4 , long double 8

17. 创建一个类的实例都有哪些办法?

new ,反射。

18. final/finally/finalize的区别?

final是类,变量,方法的修饰。类被修饰后不能再被继承。变量和方法被修饰不能再被修改

finally是try…catch后执行的finally,

finalize,在Object中的方法名,在此对象被回收前会执行这个方法。(当使用文件流时,如果对象被回收,没有关闭流,在底层就会实现内存泄露)

19. LinkingBlockingQueue与ArrayBlockingQueue的区别,他们的适用场景?

LinkingBlockQueue 链表实现的阻塞队列,适合一个一个放,一个一个取。

ArrayBlocakingQueue数组实现的阻塞队列,适合三个放,多个放,只适合多个取,不适合单个取。

20. Session/Cookie的区别?

Session存在服务器端。

Cookie存在客户端(浏览器上)。

21. String/StringBuffer/StringBuilder的区别,扩展再问他们的实现?

String 值不可变

StringBuffer 值可变,线程安全

StringBuilder 值可变,线程不安全

22. Servlet的生命周期?

初始化,服务处理(接收请求,处理请求,返回结果),销毁。

23. 如何用Java分配一段连续的1G的内存空间?需要注意些什么?

ByteBuffer.allocateDirect(102410241024);

25. Java里面用对象作为Key需要注意些什么? 如何实现hashcode?

对象放进去了hash值不能变。hashCode的值尽量不等。

二、JAVA笔试题JVM

1. JVM堆的基本结构。

2. JVM的垃圾算法有哪几种?CMS收集算法的流程?

3. JVM有哪些常用启动参数可以调整?

4. 如何查看JVM的内存使用情况?

5. Java程序是否会内存溢出?

6. 你常用的JVM配置和调优参数都有哪些?分别什么作用?

7. Java内存分代模型,GC算法,JVM常见的启动参数;

8. CMS算法的过程,CMS回收过程中JVM是否需要暂停(这块回答较好,也可以只是看毕玄的Java分布式开发或网上文章的学习, 可以结合JVM启动参数常见配置,jstat等命令,看下动手能力,意愿;以及实际线上问题排查)

9. 什么情况下会出现OOM(堆内存,永久区,堆外区,方法栈)

10. Java内存结构(堆结构,新生代[S0/S1/Elden],年老代,持久代)

11. 常用的GC策略,什么时候会触发YGC,什么时候触发FGC

三、数据结构与算法基础

1. 说一下几种常见的排序算法和分别的复杂度。

2. 什么是跳表?

3. 如何确认一个链表有环?进一步,确认环的位置。

4. 如何遍历一棵二叉树?

5. 倒排一个LinkedList。

6. HashSet的实现方式

四、多线程/并发

1. Java中常见的锁

互斥锁,读写锁,信号量

互斥锁,读写只能一个线程

读写锁,写只能一个线程,读可以多个线程

信号量,如停车场,能允许一定量的线程,满了则不能再进入,需要等别的线程释放资源。

2. 原子Atomic类,如何保证原子性,CAS硬件指令

在atomic类底层使用CAS硬件指令,来保证atomic的原子性。CAS在硬件级别实现了原子操作。

3. volatile,可见性问题的原因,硬件架构,L3 Cache,QPI,乐观锁

volatile:易变的。被修饰的变量在多线程中被改变时,别的线程能知道。

4. 如何实现一个线程安全的数据结构

new 一个volatile 的Atomatic变量,或者使用concurrent类型的集合,ConcurrentHashMap之类的。

5. 如何避免死锁

如果有两个锁的时候,如果先锁住第一个参数,再锁住第二个参数,这种情况就会产生死锁。

比如,第一个参数是A,第二个参数是B,如果第一个参数先锁,第二个参数后锁。在刚好锁住第一个参数,第二次请求来了,刚好两个参数颠倒了就会锁住第二个参数,那就会造成死锁。

解决死锁:在需要锁住多个参数的时候,先把参数按固定的顺序排序,然后在对排序后的参数加锁,这样就有效的避免死锁。

6. 如何解决ABA问题

ABA问题:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化。

用另一个标识判断某值是否有改变过。

7. Synchronized关键字的作用?

对Synchronized()括号内的对象加互斥锁,不影响父类或者子类的访问。

8. Volatile关键字的作用?

可见的,当其中一个线程改变了volatile的变量时,别的使用这个变量的线程都能读取到最新值。

image.png

但是,这个并不能解决并发问题。比如第一个线程读取到值是3,第二个线程也读取了3,然后第一个线程+1放入了write区,第二个线程+1也放到了write区,那么两个线程的值都是4,期望值是5,这时候还是会造成并发问题。

9. Java内存模型是怎样的?

image.png

1``. 方法区:

a. 方法区是各线程共享内存的区域。

b. 它存放类的信息、``static``变量、常量(常量池包含于方法区)、即时编译器编译后的代码数据。

c. 它属于非堆部分。

2``. 堆(先进先出):

a. 堆是内存最大的一块区域,堆是各线程共享内存的区域。

b. 堆中存放被创建的实例对象、数组。

c. 堆是GC管理的主要区域。

3``. 栈(先进后出):

a. 栈是线程私有的,它的生命周期与线程相同。线程生命周期(创建,就绪,运行,阻塞,死亡)

b. 栈是java方法执行的内存模型:

每个方法执行时会在栈中创建一个栈帧(stack frame),用于存放 局部变量表、操作栈、动态链接、方法出口等信息。方法从执行开始就完成了 压栈 到 弹栈 的过程。

局部变量表中存放了基本数据类型(``int``,``short``,``long``,``char``,``byte``,``float``,``double``,``boolean``,其中``long``、``double  两个``64``位长度的类型会占用两个局部变量空间、其他的只占一个)、对象引用(并非本身,引用指向堆中的对象地址)、方法返回类型。

局部变量表所需控件在编译时就已经确定了,因此方法运行期间不会改变其内存大小。

4``. 本地方法栈:

a. 与java虚拟机栈功能类似,区别在于服务对象不同,该栈服务于jvm使用的``native``方法。

5``. 程序计数器:

a. 每条线程执行时都有自己的程序计数器,互不影响。

b. 程序计数器指向该计数器的拥有者(线程)下一步执行的位置。

10. HashMap在多线程环境下使用需要注意什么?为什么?

在多线程环境下,需要使用ConcurrentHashMap,因为HashMap是线程不安全的,如果多线程操作,会造成不可预期的结果。

11. Java程序中启动一个线程是用run()还是start()?

start()是重新开启一个线程运行。 如果是run(),那就相当于在当前线程运行,并不会新创建一个线程运行。

12. 什么是守护线程?有什么用?

守护线程是运行在后端的线程,当系统停止运行,守护线程也就停止了。

进行内存回收,垃圾清理等工作

13. 什么是死锁?如何避免

原因:

(1) 因为系统资源不足。

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

(3) 资源分配不当等。

死锁必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

image.png

A线程锁住的资源被B线程锁住了,然后B线程需要的资源被A线程锁住了,这时候就会造成死锁。

避免这种死锁的方法,当需要锁住多个资源的时候,那就先对资源进行排序,然后再加锁,就会有效的防止死锁。

还有饥饿锁,当优先级高的不断获得资源,优先级低的一直获取不到资源,也会造成死锁。

谦让锁,当几个线程共同获取资源,就会线程先停止,让别的线程先执行。如果每个线程都这样,那就会一起谦让,也会造成死锁。

14. 线程和进程的差别是什么?

线程是进程的实现,进程是线程的体现。进程是独立的,线程运行在进程内。进程内可以有多个线程同时运行着。

线程是在代码层面上,进程是在服务器CPU内存上。

16. ConcurrentHashMap的实现原理是?

对大数组的每个值进行分离加锁,实现了锁分离。

17. sleep和wait区别

sleep是占用着cpu阻塞,wait是不占用cpu阻塞。

18. notify和notifyAll区别

通知处在等待该对象的线程

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。

notify是通知其中一个线程,而不会通知别的线程。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182889.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月12日 上午9:16
下一篇 2022年10月12日 上午9:36


相关推荐

  • 重写finalize方法_Java的finalize方法干什么

    重写finalize方法_Java的finalize方法干什么Finalize方法在未能调用Dispose方法的情况下充当防护措施来清理资源。您应该只实现Finalize方法来清理非托管资源。Object.Finalize方法的范围是受保护的。当在类中重写该方法时,您应该保持这个有限的范围。您无法从C#或C++编程语言的托管扩展中调用或重写Object.Finalize方法。C#和托管扩展提供析构函数作为编写终止代码的机制。在

    2026年1月21日
    3
  • linux经典教程_三阶魔方初级入门教程详细图解

    linux经典教程_三阶魔方初级入门教程详细图解一、Linux常用命令1.文件处理命令1.1目录处理命令1.2文件处理命令1.3链接命令2.权限管理命令2.1权限管理命令chmod2.2其他权限管理命令3.文件搜索命令3.1文件搜索命令find3.2其他文件搜索命令4.帮助命令4.1帮助命令5.用户管理命令5.1用户管理命令6.压缩解压命令6.1压缩解压命令7.网络命令7.1网络命令8.关机重启命令8.1关机重启命令二、文本编辑器-Vim…

    2022年10月13日
    4
  • C++RAII机制

    C++RAII机制什么是 RAII RAII 是 ResourceAcqu wiki 上面翻译成 资源获取就是初始化 的简称 是 C 语言的一种管理资源 避免泄漏的惯用法 利用的就是 C 构造的对象最终会被销毁的原则 RAII 的做法是使用一个对象 在其构造时获取对应的资源 在对象生命期内控制对资源的访问 使之始终保持有效 最后在对象析构的时候 释放构造时获取的资源

    2026年3月19日
    3
  • python中pygame怎么安_Python中pygame安装方法图文详解

    python中pygame怎么安_Python中pygame安装方法图文详解本文实例讲述了Python中pygame安装方法。分享给大家供大家参考,具体如下:这里主要描述一下我们怎样来安装pygame可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用,或者怎样安装,在百度/google上面搜索了一番后,发现没有一篇详细描述pygame的安装过程的文章。如果你是其中的一员,那么这篇教程可能会帮助到你。当然,在学习pygame的时候,需要你要有一定的py…

    2022年5月12日
    52
  • Linux 镜像文件ISO下载地址、centos网络配置:[通俗易懂]

    Linux 镜像文件ISO下载地址、centos网络配置:[通俗易懂]Linux镜像文件ISO下载地址:http://archive.kernel.org/centos-vault/6.1/isos/x86_64/选择:CentOS-6.1-x86_64-bin-DVD1.iso下载就OK,下载后可以在虚拟机上进行运行。…

    2022年8月24日
    24
  • 【STM32F407的DSP教程】第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)「建议收藏」

    【STM32F407的DSP教程】第48章 STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)「建议收藏」完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第48章STM32F407的中值滤波器实现,适合噪声和脉冲过滤(支持逐个数据的实时滤波)本章节讲解中值滤波器实现,适用于噪声和脉冲的过滤。目录48.1初学者重要提示48.2中值滤波器介绍48.3中值滤波器原理48.4Matlab中值滤波器实现48.5中值滤波器设计48.5.1函数MidFilter…

    2025年9月16日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号