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 的使用场景?
合适读多写少的场景。