面试技能四
最后更新于: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吗
';