java面试,看这一篇就够了

本文涵盖了Java面试的多个重要方面,包括Java基础知识(如HashMap的原理和优化)、JVM知识、ORM框架、MySQL数据库、Java Web技术以及线程安全等。深入探讨了HashMap的大小为何是2的幂次、线程安全问题、ArrayList原理、数据连接池、分布式系统概念,以及JVM的垃圾回收算法和各种收集器。此外,还讨论了Spring中autowire和resource的区别、消息队列的作用、Tomcat服务器的实现和分布式问题。内容全面,是准备Java面试的理想资料。
摘要由CSDN通过智能技术生成

Java基础知识

  1. Java的hashmap的原理,Hashmap中jdk1.8之后做了哪些优化

通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load_Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

  1. Hashmap为什么大小是2的幂次

得到 hash 值之后,再与数组的长度-1(length-1)进行一次与运算得到index值,如果数组的长度是 2 的倍数,那么length-1 的二进制一定是 …00001111…这种形式,也就是前面一定都是 0,后面全是1,那么再与 hash 值进行与运算的时候,结果一定是在原来数组大小的范围内,比如默认数组大小16-1=15 的二进制为: 00000000 00000000 00000000 00001111,某 key 的hash 值为:11010010 00000001 10010000 00100100,那么与上面做与运算的时候,值会对后面的四位进行运算,肯定会落在0~15 的范围内,假如不是 2 的倍数,那么 length-1 的二进制后面就不可能全是 1,做与运算的时候就会造成空间浪费

  1. Hashmap的线程安全性?什么是线程安全的?如何实现线程安全

在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

  1. Arraylist的原理

基于数组实现的,是一个动态数组,其容量能自动增长

ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。

  1. object类你知道的方法

protected Object clone() 创建并返回此对象的一个副本。

boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。

protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

Class

Java web知识

  1. 数据连接池

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

  1. Forward和redirect的区别

!!!这里用“1”表示forward,用“2”表示redirect。

区别:

地址栏:
1. 为服务器的直接跳转,客户端浏览器并不知道,地址栏内容不变(服务器内部的动作)
2. 为客户端浏览器根据URL地址重新向服务器请求,地址栏变(有可能是请求的URI地址发生变化)

数据共享:
1. 共享浏览器传来的request
2. 全新的request

运用的地方:
1. 用户登录后根据角色跳转页面
2. 在用户注销后跳转主页或其他页面

效率:
1比2少了一次服务器请求,效率高一些

  1. 线程池的使用时的注意事项

减少了创建和销毁的次数,每个工作线程都可以一直被重用,能执行多个任务。

可以根据系统的承载能力,方便的调整线程池中线程的数目,防止因为消耗过量的系统资源而导致系统崩溃。

  1. Spring中autowire和resourse关键字的区别

@Autowired和@Inject
默认 autowired by type
可以 通过@Qualifier 显式指定 autowired by qualifier name。
@Inject 没有required属性,其他的和autowired一样

@Resource
默认 autowired by field name
如果 autowired by field name失败,会退化为 autowired by type
可以 通过@Qualifier 显式指定 autowired by qualifier name
如果 autowired by qualifier name失败,会退化为 autowired by field name。但是这时候如果 autowired by field name失败,就不会再退化为autowired by type了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值