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,可以调用业务逻辑。
    java 面试相关
    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内存模型