HashMap和HashTable的异同
相同:底层都是数组+链表实现的,都是键值对映射,key-value
区别:
- 产生时间不同:HashTable在java发布之初就存在,HashMap产生于JDK1.2,现在HashTable已基本废弃不用
- 继承的父类不同:HashTable继承自Dictionary类(已废弃),HashMap继承自AbstractMap类
- 提供的方法不同:HashTable比HashMap多提供了elments() 和contains() 两个方法
- null值问题:HashTable既不支持Null key也不支持Null value;HashMap中,null可以作为键值,但这样的键只有一个;也可以作为value值
- 线程安全性不同:HashTable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用HashTable,不需要自己为它的方法实现同步。HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。(ConcurrentHashMap是线程安全的,且效率比HashTable要高,因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。)
- 效率不同:HashMap的效率会比HashTable要好很多。
- 遍历方式不同:Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
- 初始容量不同:HashTable初始为11,HashMap初始为16(创建时,如果给定了容量初始值,那么HashTable会直接使用给定的大小,而HashMap会将其扩充为2的幂次方大小)
- 扩容方式不同:HashTable是2n+1,HashMap是2n(n为上一次的容量),也就是HashMap大小一定是2的幂
- 计算哈希值的方法不同:HashTable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。
ArrayList和LinkedList的异同
相同:都是实现了List接口的容器类,用于存储一系列的对象引用,都可以对元素的增删改查进行操作。
区别:
- ArrayList是基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList效率优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList一般优于ArrayList,因为ArrayList要移动数据。
- 随机查找指定节点,ArrayList速度要快于LinkedList。
SpringMVC的生存周期
- 发起请求到前端控制器(DispatcherServlet)
- 前端控制器请求HandlerMapping(处理器映射器)查找 Handler,可以根据xml配置、注解进行查找
- 处理器映射器HandlerMapping向前端控制器返回Handler
- 前端控制器调用处理器适配器去执行Handler
- 处理器适配器去执行Handler
- Handler执行完成给适配器返回ModelAndView
- 处理器适配器向前端控制器返回ModelAndView(ModelAndView是springMVC框架的一个底层对象,包括 Model和view)
- 前端控制器请求视图解析器去进行视图解析
- 视图解析器向前端控制器返回View
- 前端控制器进行视图渲染, 视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 前端控制器向用户响应结果