面试技能四

最后更新于:2022-04-01 21:06:33

## 1. ArrayList 和 LinkedList 的使用如何选择? 很多人回答二者不同的时候会认为ArrayList不像链表那样可以灵活的增加元素或者删除元素,但二者都提供了下面的方法可以灵活增加元素: ~~~ public void add(int index, E element) ~~~ 另外LinkedList还提供了offer方法可以在前后增加元素 ~~~ public boolean offerFirst(E e) public boolean offerLast(E e) ~~~ 如果要是从尾部删除元素,那么LinkedList将是不错的选择,因为下面的方法是它独有的。 ~~~ public E removeLast() //Retrieves and removes the last element of this list, or returns null if this list is empty. public E pollLast() ~~~ ## 2. 为什么重写类的equals方法,还要同时重写hashcode方法? 保证两个等价对象得到相同的hashcode ## 3. SerialVersionUID的作用 在运行时判断类的SerialVersionUID验证版本的一致性 ## 4. java的 check 和 uncheck 异常的区别是什么? check exception是exception的子类,这类异常必须通过try-catch进行处理,否则无法编译通过,而uncheck exception是runtime exception的子类,这类异常可以不捕获,直接向外抛出,让外界处理。 ## 5. 简要介绍jvm的垃圾回收机制 1)标记清除:遍历对象图标记可到达的对象,然后扫描堆栈,发现未标记的对象并释放内存; 2)分代回收:将内存区域分为新生代和旧生代,使用复制算法扫描出存活对象并复制到新的未使用的空间中,指针保存在最后一个分配对象所处的位置,当新生代满了之后,就全部转移到旧生代,清空新生代区域,继续装载,直至最后内存溢出。 ## 6. jvm内存模型 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/3749df38a0a7892d1ff08c3c57024371_480x341.jpg) 1)方法区:虚拟机加载的类信息、常量、静态变量,所有线程共享该内存区域 2)虚拟机栈:方法执行时都会创建一个栈帧,用于存储局部变量表包括方法参数、操作栈和方法出口等信息 3)本地方法栈:为Native方法服务 4)堆:被所有线程所共享,存储了所有new的对象 5)程序计数器:选取下一条需要执行的字节码指令,分支、循环、异常处理都需要它完成 ## 7. 如何理解面向对象的开闭原则 一个软件实体如类、模块和函数应该对扩展开发,对修改关闭。 ## 8. 简单介绍JS的事件冒泡 事件冒泡指的是子级元素先触发,父级元素后触发,事件捕获与之相反。W3C标准同时支持两种方式,任何事件发生,从顶层元素开始事件捕获直达事件发生的源元素,然后从事件源向上冒泡。可以通过addEventListener()对元素进行监听,最后一个参数为true是事件捕获。 ## 9. 介绍利用log4j配置日志 ## 10. 如何基于spring配置数据库事务 ## 11. 介绍使用的数据库连接池配置 ## 12. 抽象类可以在spring中定义成一个bean吗
';