Java基础知识
- 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),则使用红黑树来替换链表,从而提高速度。
- 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,做与运算的时候就会造成空间浪费
- Hashmap的线程安全性?什么是线程安全的?如何实现线程安全
在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
- Arraylist的原理
基于数组实现的,是一个动态数组,其容量能自动增长
ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。
- object类你知道的方法
protected Object clone() 创建并返回此对象的一个副本。
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。Class
Java web知识
- 数据连接池
数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
- Forward和redirect的区别
!!!这里用“1”表示forward,用“2”表示redirect。
区别:
地址栏:
1. 为服务器的直接跳转,客户端浏览器并不知道,地址栏内容不变(服务器内部的动作)
2. 为客户端浏览器根据URL地址重新向服务器请求,地址栏变(有可能是请求的URI地址发生变化)数据共享:
1. 共享浏览器传来的request
2. 全新的request运用的地方:
1. 用户登录后根据角色跳转页面
2. 在用户注销后跳转主页或其他页面效率:
1比2少了一次服务器请求,效率高一些
- 线程池的使用时的注意事项
减少了创建和销毁的次数,每个工作线程都可以一直被重用,能执行多个任务。
可以根据系统的承载能力,方便的调整线程池中线程的数目,防止因为消耗过量的系统资源而导致系统崩溃。
- 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了。