Java常用的集合框架以及区别
今天去一家公司面试时,面试官问了我一个关于常用集合框架的问题,我个人认为我当时是没有回答好的,所以晚上回来时查阅了一些资料,下面是我总结的内容:
Map接口和Collection接口是所有集合框架的父接口。
HashMap、Hashtable、ConcurrentHashMap的区别
三者在数据存储层面的机制原理基本一致。
HashMap不是线程安全的,多线程环境下除了不能保证数据一致性以外,还有可能在rehash阶段引发Entry链表成环,导致死循环,允许null作为key;
Hashtable使用了synchronized关键字,是线程安全的,能绝对保证数据的一致性,但是性能存在问题,并发线程越多,性能越差,不允许null作为key;
ConcurrentHashMap也是线程安全的,使用分离锁和volatile等方法,极大地提高了读写性能,同时也能保证在对大多数
情况下的数据一致性,在一个线程向Map中加入Entry的操作没有完全之前,其他线程有可能读不到新加入的Entry。
HashMap的底层实现
在java8之前使用的是数组+链表实现,在java8使用了数组+链表+红黑树实现。
List和Set的区别
List:有序的,可以包含重复元素;
Set:无序的,不可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复;
ArrayList和LinList的区别:
ArrayList:底层采用数组存储,一次适合查询,不适合增删;
LinkList:底层采用双向链表,适合增删,不适合查询。