个人技术分享网站

Java面试题及答案整理汇总,2021最新版

Java面试题以及答案整理【最新版】Java面试题大全(2021版),发现网上很多Java面试题都没有答案,所以花了很长时间搜集Java面试题及答案整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈

其实,博主还整理了,更多大厂面试题,直接下载吧

下载链接:高清172份,累计 7701 页大厂面试题 PDF

1、使用sql写出一个分页程序?

Select top 3 * from tb_name where id not in (select top 3 id from tb_name)

2、HashMap是怎么解决哈希冲突的?

在解决这个问题之前,我们首先需要知道什么是哈希冲突,而在了解哈希冲突之前我们还要知道什么是哈希才行;

什么是哈希?

Hash,一般翻译为“散列”,也有直接音译为“哈希”的, Hash就是指使用哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值,这个较小的二进制值叫做哈希值。

什么是哈希冲突?

当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)

HashMap的数据结构

在Java中,保存数据有两种比较简单的数据结构:数组和链表

1、 数组的特点是:寻址容易,插入和删除困难;

2、 链表的特点是:寻址困难,但插入和删除容易;

3、 所以我们将数组和链表结合在一起,发挥两者各自的优势,就可以使用俩种方式:链地址法和开放地址法可以解决哈希冲突:

1、 链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;

2、 开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。

但相比于hashCode返回的int类型,我们HashMap初始的容量大小DEFAULT_INITIAL_CAPACITY = 1 << 4(即2的四次方16)要远小于int类型的范围,所以我们如果只是单纯的用hashCode取余来获取对应的bucket这将会大大增加哈希碰撞的概率,并且最坏情况下还会将HashMap变成一个单链表,所以我们还需要对hashCode作一定的优化

hash()函数

上面提到的问题,主要是因为如果使用hashCode取余,那么相当于参与运算的只有hashCode的低位,高位是没有起到任何作用的,所以我们的思路就是让hashCode取值出的高位也参与运算,进一步降低hash碰撞的概率,使得数据分布更平均,我们把这样的操作称为扰动,在JDK 1.8中的hash()函数如下:

static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);// 与自己右移16位进行异或运算(高低位异或)
}

这比在JDK 1.7中,更为简洁,相比在1.7中的4次位运算,5次异或运算(9次扰动),在1.8中,只进行了1次位运算和1次异或运算(2次扰动)

简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的:

1、 链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位;

2、 开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位。

3、GC 是什么? 为什么要有 GC

GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

4、调优命令有哪些?

Sun JDK监控和故障处理命令有jps jstat jmap jhat jstack jinfo

1、 jps,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

2、 jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

3、 jmap,JVM Memory Map命令用于生成heap dump文件

4、 jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看

5、 jstack,用于生成Java虚拟机当前时刻的线程快照。

6、 jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数

5、在Java中定义一个不做事且没有参数的构造方法的作用

Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

6、怎么打破双亲委派模型?

打破双亲委派机制则不仅要继承ClassLoader类,还要重写loadClass和findClass方法。

7、如果你提交任务时,线程池队列已满,这时会发生什么

这里区分一下:

1、 如果使用的是无界队列LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为LinkedBlockingQueue可以近乎认为是一个无穷大的队列,可以无限存放任务

2、 如果使用的是有界队列比如ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,会根据maximumPoolSize的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy

8、请解释什么是Tomcat Coyote ?

Tom coyote是基于HTTP / 1.1规范的HTTP连接器,通过监听TCP / IP端口并将请求发送回请求客户端,向Tomcat引擎接收和传输web请求。

9、Javascript中常用的事件有哪些?

2、 Onsubmit:提交

3、 Onblur:失去焦点

4、 Onclick:单击

5、 Onload:加载页面

6、 Onchange:内容改变

7、 onMouseMove:鼠标移动

8、 onMouseOver:鼠标经过

9、 onMouseOut:鼠标移出

10、 onselect:下拉选项被选中

10、CopyOnWriteArrayList 的使用场景?

合适读多写少的场景。

11、创建线程的四种方式

12、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的

13、生产上如何配置垃圾收集器的?

14、永久代

15、四种构建线程池的区别及特点?

16、什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

17、什么是ThreadLocal变量?

18、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?

19、说几个常见的编译时异常类?

20、JAVA为什么需要接口?

21、你都用过G1垃圾回收器的哪几个重要参数?

22、Java 中怎么创建 ByteBuffer?

23、说一下 runnable 和 callable 有什么区别

24、阻塞队列和非阻塞队列区别

25、Java中是如何支持正则表达式操作的?

26、Java 中会存在内存泄漏?简述一下

27、接口和抽象类有什么区别?

28、在Java中,如何跳出当前的多重嵌套循环?

29、GC的回收流程是怎样的?

30、我们能创建一个包含可变对象的不可变对象吗?

31、什么时候使用组合模式?

32、React有哪些优化性能是手段?

33、程序计数器(线程私有)

34、运行时常量池的作用是什么?

35、继承和组合之间有什么不同?

36、Java中你怎样唤醒一个阻塞的线程?

37、Statement与preparedStatement区别

38、常见的计算机网络协议有那些?

39、CMS分为哪几个阶段?

40、Super与this表示什么?

41、被引用的对象就一定能存活吗?

42、你所知道的web服务器有哪些?

43、什么是方法重载?

44、在多线程环境下,SimpleDateFormat 是线程安全的吗?

全部答案,整理好了,直接下载吧

下载链接:高清172份,累计 7701 页大厂面试题 PDF

赞(1) 打赏
未经允许不得转载:搜云库 » Java面试题及答案整理汇总,2021最新版

一个专注于Java技术系列文章的技术分享网站

联系我们联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏