1.集合下面分为哪些?常用的集合都有哪些?
集合如上图集合架构图所示,常用的集合有:
- List
- LinkedList
- ArrayList
- Vector
- Set
- HashSet
- TreeSet
- Map
- HashTable
- HashMap
- TreeMap
2.List和Set的区别
List是有序的并且元素可以重复存在,Set是无序的,元素是唯一的,基于以上区别,所以list可以根据索引操作数据,而Set不能根据索引获取元素。
3.ArrayList和LinkList的区别?
ArrayList的数据结构用的是数组,LinkList底层的数据结构是链表,在对数据进行get 和 set操作的时候,ArrayList要优于LinkList,因为链表是单线的需要指针的移动,
对于添加和删除操作add和remove,LinkedList要比ArrayList快(数据量大的时候),因为ArrayList要移动数据。
4.hashMap的底层原理
hashMap底层用的是数组加链表加红黑树,当要put进一个值的时候,会对这个值进行一个hash值转换,然后再对hash值进行取模或者位运算得出新的hash值,根据该hash值在数组找找到对应的位置,如果该位置没有值,就直接存入数组对应位置中,如果有值,会使用equals进行一个比较,当equals比较相同的时候,会覆盖数组上该位置的值,如果equals比较不相同的时候,会放入该数组位置对应的链表中,1.8之前是从链表的头部进行插入,1.8之后改为了在链表的尾部进行插入,这样做的目的是防止在rehash时形成环形链表,更加稳定,当数组长度大于64或者链表长度大于8的时候,链表会转换成红黑树,目的时增加查询效率,链表长度小于6时会由红河树转换成链表。
5.有哪些集合是安全的呢?
hashTable vector
因为这两个集合底层都加了synchonized进行修饰,都是同步的,所以是线程安全的
6.hashMap和hashTable的区别
首先,继承方式不同, Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable 线程安全,因为它每个方法中都加入了Synchronize,hashMap线程不安全。
Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。 Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。
7.在要求集合安全的情况下,应该选择哪个集合进行使用