2021 java高级面试题收集及答案

以下问题是个人面试时收集,答案纯属个人见解,如有错误请不吝赐教,感激不尽。

这里写目录标题

  • 2021 java高级面试题收集及答案
  • 一级目录
    • 二级目录
      • 三级目录
        • 1. 抽象类能使用 final 修饰吗
        • 2.java 中的 Math.round(-1.5) 等于多少?
        • 3.String str="i"与 String str=new String(“i”)一样吗?
        • 4.BIO、NIO、AIO 有什么区别?
        • 5.Files的常用方法都有哪些?
        • 6.java 容器都有哪些?
        • 7.Collection 和 Collections 有什么区别?
        • 8.HashMap 和 Hashtable 有什么区别?
        • 9.如何决定使用 HashMap 还是 TreeMap?
        • 10.内存泄露和内存溢出的区别
        • 11.mysql数据库中mysiam和innodb索引的区别
        • 12.Redis高并发场景热点缓存如何重建
        • 13.高并发场景缓存穿透&失效&雪崩如何解决
        • 15.超大并发的分布式锁架构该如何设计
        • 16.Redis缓存与数据库双写不一致如何解决
        • 17.线程池
        • 18.常用的几种线程池
      • 未完待续。。。

一级目录

二级目录

三级目录

1. 抽象类能使用 final 修饰吗
final修饰的类不能被继承,没有子类。如果类中有抽象的方法也是没有意义的。abstract类为抽象类。
即该类只关心子类具有的功能,而不是功能的具体实现。如果 用final修饰方法,那么该方法则不能再被重写。
final 是不能修饰abstract所修饰的方法的。综上,抽象类不能用fiinal修饰。
2.java 中的 Math.round(-1.5) 等于多少?
Math.round()是四舍五入Math.round(-1.4) = -1
Math.round(-1.5) = -1
Math.round(-1.6) = -2Math.round(1.4) = 1
Math.round(1.5) = 2
3.String str="i"与 String str=new String(“i”)一样吗?
String str = "i" 是创建了一个引用变量,指向 “i”在内存中的地址
String str=new String(“i”) ,new String(“i”) 创建了一个对象并在内存中声明了内存空间,并创建了一个引用变量,指向 “i”在内存中的地址
4.BIO、NIO、AIO 有什么区别?
参考文章:https://blog.csdn.net/dreamer23/article/details/80903978
5.Files的常用方法都有哪些?
Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件。
6.java 容器都有哪些?
参考文章: https://blog.csdn.net/qq_35771266/article/details/97156939
7.Collection 和 Collections 有什么区别?
Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
8.HashMap 和 Hashtable 有什么区别?
参考文章: https://www.cnblogs.com/heyonggang/p/9112731.html
衍生问题: jdk1.7和jdk1.8中,hashMap的实现有什么不同:https://yuanrengu.com/2020/ba184259.html
9.如何决定使用 HashMap 还是 TreeMap?
TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。
HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。
10.内存泄露和内存溢出的区别
1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。
11.mysql数据库中mysiam和innodb索引的区别
主键索引(聚集索引):MYSIAM:叶子节点存储的是主键和数据存储位置Innodb:叶子节点存储主键和数据行
非聚集索引(辅助索引):MYSIAM:叶子节点存储索引和数据在内存中的地址Innodb:叶子节点存储索引和主键
参考文章: https://blog.csdn.net/u010922732/article/details/82994253
12.Redis高并发场景热点缓存如何重建
参考文章:https://blog.csdn.net/weixin_39569894/article/details/111616142, 写的非常详细,且附带解决方案
13.高并发场景缓存穿透&失效&雪崩如何解决
1 缓存失效引起这个原因的主要因素是高并发下,一般设定一个缓存的过期时间时,并发很高时可能会出在某一个时间同时生成很多的缓存,并且过期时间在同一时刻,这个时候就可能引发——当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。处理方法: 将缓存失效时间分散开,不要所以缓存时间长度都设置成特定时长;比如在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。 缓存失效时产生的雪崩效应,将所有请求全部放在数据库上,这样很容易就达到数据库的瓶颈,导致服务无法正常提供。尽量避免这种场景的发生。2 缓存穿透出现场景:指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。当在流量较大时,出现这样的情况,一直请求DB,很容易导致服务挂掉。处理方法:方法1.在封装的缓存SET和GET部分增加个步骤,如果查询一个KEY不存在,就已这个KEY为前缀设定一个标识KEY;以后再查询该KEY的时候,先查询标识KEY,如果标识KEY存在,就返回一个协定好的非false或者NULL值,然后APP做相应的处理,这样缓存层就不会被穿透。当然这个验证KEY的失效时间不能太长,当db有值时,利用消息服务清除缓存空数据。方法2.如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,一般只有几分钟。方法3.采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。3 缓存并发出现场景:当网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。处理方法:对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。4 缓存雪崩出现场景:由于缓存层承载着大量请求,有效的保护了存储层,但是如果缓存层由于某些原因整体不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。 缓存雪崩的英文原意是 stampeding herd(奔逃的野牛),指的是缓存层宕掉后,流量会像奔逃的野牛一样,打向后端存储。处理方法:缓存高可用,Redis Sentinel 和 Redis Cluster 实现参考文章:http://mp.weixin.qq.com/s/jy1q3OnbANEmQR750f0S6Q
https://mp.weixin.qq.com/s/TBCEwLVAXdsTszRVpXhVug
15.超大并发的分布式锁架构该如何设计
参考文章:https://zhuanlan.zhihu.com/p/110436094
16.Redis缓存与数据库双写不一致如何解决
参考文章:https://blog.csdn.net/lzhcoder/article/details/79469123
17.线程池
多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。
线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,
大量的线程回收也会给GC带来很大的压力。为了避免重复的创建线程,线程池的出现可以让线程进行复用。通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,
并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。java中创建线程池的方式一般有两种:通过Executors工厂方法创建
通过new ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
BlockingQueue<Runnable> workQueue)自定义创建
下面解释下创建线程的核心参数:corePoolSize :线程池的核心池大小,在创建线程池之后,线程池默认没有任何线程。当有任务过来的时候才会去创建创建线程执行任务。换个说法,线程池创建之后,线程池中的线程数为0,
当任务过来就会创建一个线程去执行,直到线程数达到corePoolSize 之后,就会被到达的任务放在队列中。(注意是到达的任务)。
换句更精炼的话:corePoolSize 表示允许线程池中允许同时运行的最大线程数。如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。maximumPoolSize :线程池允许的最大线程数,他表示最大能创建多少个线程。maximumPoolSize肯定是大于等于corePoolSize。keepAliveTime :表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,
直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,
如果一个线程空闲的时间达到keepAliveTime,则会终止,直到
线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0Unit:keepAliveTime 的单位。workQueue :一个阻塞队列,用来存储等待执行的任务,当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待。
通过workQueue,线程池实现了阻塞功能threadFactory :线程工厂,用来创建线程。handler :表示当拒绝处理任务时的策略。
18.常用的几种线程池

1 newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。这种类型的线程池特点是:工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。
终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪。

2.newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。
但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

3.newSingleThreadExecutor

创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO,优先级)执行。
如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

4.newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

未完待续。。。

java高级面试题收集及答案相关推荐

  1. JAVA高级面试题汇总及答案

    JAVA高级面试题汇总及答案 1.hashaMap原理源码 2.synchronize关键字1.6之后的优化,(偏向轻量级锁,重量级锁) 3.双亲委派是什么 4.类加载过程中可以动态改字节码吗? 5. ...

  2. Java 高级 面试题 及 参考答案

    一.面试题基础总结 1. JVM结构原理.GC工作机制详解 答:具体参照:JVM结构.GC工作机制详解     ,说到GC,记住两点:1.GC是负责回收所有无任何引用对象的内存空间. 注意:垃圾回收回 ...

  3. Java经典面试题整理及答案详解(八)

    简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...

  4. Java经典面试题整理及答案详解(三)

    简介: 以下是某同学面试时,面试官问到的问题,关于面试题答案可以参考以下内容- 上一篇:Java经典面试题整理及答案详解(二) Java面试真题第三弹接住!相信通过前两节的学习,大家对于Java多少有 ...

  5. android中 cdf文件的作用是什么意思,行情艰难,Android初中高级面试题,附详细答案...

    原标题:行情艰难,Android初中高级面试题,附详细答案 作者:夜猫少年 链接:https://juejin.im/post/5c8211fee51d453a136e36b0 Activity篇 1 ...

  6. 2023最新ChatGPT整理的40道Java高级面试题

    2023 年最火的就是 ChatGPT 了,很多同事使用他完成一些代码上的智能提示,也有人使用它发了财<「用ChatGPT年入百万!」各博主发布生财之道,网友:答辩搬运工>.<&qu ...

  7. 【JAVA】2022年JAVA高级面试题汇总

    一.参考资料 不容错过的Java高级面试题_帝都的雁的博客-CSDN博客_java高级面试题 java面试题汇总(上)_Oliverfly1的博客-CSDN博客_java面试题 史上最全的中高级 JA ...

  8. 阿里巴巴java方向笔试题 带详细答案

    阿里巴巴java方向笔试题 带详细答案 1,下列说法正确的是() A.一个文件里可以同时存在两个public修饰的类 B.构造函数可以被重写(override) C.子类不能访问父类非public和p ...

  9. java设计模式面试题大全含答案

    java设计模式面试题大全含答案 1.23种经典设计模式都有哪些,如何分类? 2.j2ee常用的设计模式?说明工厂模式. 3.Spring 框架中都用到了哪些设计模式? 4.<java面试宝典& ...

最新文章

  1. 火狐的萤火虫JavaScript,HTML,CSS调试捕获器
  2. hdu 1850 基础尼姆博奕
  3. purdue university some course and papers
  4. Linux 之五 最新 2021 一图看尽 Linux 发行版
  5. 【vijos】【二叉树】FBI树
  6. 远程桌面mstsc命令参数的使用
  7. C++ STL学习笔记
  8. vue 集成 sweetalert2 前端校验
  9. composer笔记
  10. 京东app html源码_哔哩哔哩源码泄露,看不懂怎么办?
  11. Python - Flask 框架返回的中文是Unicode 编码,如何解决
  12. jmeter安装插件的方法
  13. [Jetty] jetty 内存调优
  14. atv320说明书_ATV320U30N4B 施耐德 ATV320通用变频器 说明书
  15. 数据分析 - pandas(7)
  16. 用FPGA产生正弦信号
  17. java file.io的各种使用
  18. 2010.4.24更新 windows 7 x86/x64 应用全面导航(菜鸟老鸟全兼容)
  19. C#dataGridView 知识(示例代码)以及相关的经验技巧
  20. HDU6760 Math is Simple 数学变形+莫比乌斯反演

热门文章

  1. 无线充电模组开发的原理和优势
  2. 仿写 QQ 和 微信 联系人列表:
  3. 飞桨常规赛:PALM眼底彩照中黄斑中央凹定位
  4. matlab极性rz编码,单极性归零(RZ)波形及其Matlab仿真
  5. 计算机网络八:网线种类(同轴电缆、双绞线、光缆)
  6. Jquery (前端)
  7. 医疗信息季节:第二十三届中国国际医疗仪器设备展览会暨研讨会 思考
  8. 为什么要读原版书籍(各个帖子的整合)
  9. 2015年春运火车票购票指南、放假指南
  10. 多个网站共用一个服务器权重,一个服务器多个站点会不会分散权重