java 面试相关
集合
- Collection
-
List 集合元素有序并且集合元素可以重复
- ArrayList 数据结构为数组,所以有索引,默认长度0,添加一个元素之后扩容10 扩容是1.5倍
- LinkedList 数据是双向链表,所以没有索引
- Vector 线程安全的
-
Set 仅接收一次,不可重复,并做内部排序
- HashSet 使用hash表(数组)存储元素
- LinkedHashSet 链表维护元素的插入次序
- TreeSet 底层实现为二叉树,元素排好序
-
HashSet的实现:基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,基本上都是直接调用底层HashMap的相关方法来完成
- Map
- TreeMap 红黑树对所有的key进行排序
- LinkedHashMap 双向链表和哈希表实现
- ConcurrentHashMap
- HashMap 可以存储Key为null的值,线程不安全,但是效率高
- Hashtable 不可以存储Key为null的值,线程安全,但是效率低
HashMap底层原理:
属性 | 介绍 |
---|---|
DEFAULT_INITIAL_CAPACITY = 1 << 4 | 初始化数组长度16 |
MAXIMUM_CAPACITY = 1 << 30 | hashmap的数组最大容量 |
DEFAULT_LOAD_FACTOR = 0.75f | 数组个数大于75%扩容 |
TREEIFY_THRESHOLD = 8 | 1.8以后加入的,当链表的长度大于8并且数组的长度大于64,链表调整红黑树 |
UNTREEIFY_THRESHOLD = 6 | 元素个数小于6就调成链表 |
HashMap 刚创建时,table时null,为了节约空间,当添加第一元素时,table容量调整16
当元素的个数大于阈值(16*0.75=12)时,会进行扩容,扩容后的大小时原来的2倍,目的是减少调整元素的个数,
1.8以后当链表的长度大于8并且数组的长度大于64,链表就会调整为红黑树,目的提高执行效率,链表长度小于6时,调整成链表,1.8以前插入时都是从链表头插入,1.8以后都是插入到链表最后,实际上是一个“数组+链表+红黑树”的数据结构
过滤器和拦截器的区别:
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
- 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
jdk1.8特性 - HashMap在1.8版本,当链表长度大于8时就会采取红黑树的结构存储。
- ConcurrentHashMap 1.7隔离级别时锁分段机制,1.8采取了cas算法, - - Jdk1.8没有永久区,取而代之的是MetaSpace元空间,用的是物理内存。
- Lambda表达式
- map.entrySet() 可以同时获取key,value
equals 和 hashCode区别
- equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
- hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
个人理解:2个不同的值通过哈希计算,可能会在同一个位置,如果要运用上,在写判断的时候先用hashCode判断,如果相等在用equal判断,因为hashCode要比equal快,为什么会快
Jvm内存模型