1.ArrayList和Vector的区别
- 相同点:
都实现了List接口;
元素都是有序可重复的; - 不同点
ArrayList线程不安全,Vector线程安全;
当存储进他们的元素个数超过容量时,ArrayList增长为原来的1.5倍,Vector增长为原来的2倍。
2.ArrayList、Vector和LinkedList的存储性能和特性
- ArrayList和Vector使用数组存储数据,可以随机存取,但插入数据时需要移动元素,所以索引数据快 插入数据慢;
- Vector使用了synchronized方法,线程安全,通常性能比ArrayList差;
- LinkedList使用双向循环链表存储数据,在索引数据时需要前后遍历,但插入数据速度更快。
3.HashMap的数据结构
HashMap在jdk1.8以前实际上是一个数组和链表的结合体,jak1.8之后是数组、链表和红黑树。
首先计算key的哈希值来确定元素放入数组的位置,当多个元素的哈希值相同时,就把该元素添加到相同哈希值元素的后面,形成链表,如果某一条链表的长度超过8时,链表就转换为红黑树,以此来提高查找效率。
4.List、Map、Set三个接口,存取元素时,各有什么特点
List和Set都是单列元素的集合,有相同的父接口Collection。
- List存储有序、可重复,可以使用add()方法插入数据,每调用一次add()方法时,这个对象就会被插入到集合一次,并不是把对象本身存储进了集合中,而是集合中用一个索引变量指向这个对象。List可以使用Iterator接口取得所有元素,再逐一遍历各个元素,也可以调用ge(index i)。
- Set存储无序、不可重复。Set集合的add()方法有一个Boolean类型的返回值,当集合中没有某个元素时,可成功加入并返回true,当集合中含有与某元素equals相等的元素时,无法加入并返回false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
- Map与Set和List不同,它是双列的集合。在存储时,使用put(),要存储一对键值对,不能存储重复的key,这个重复也是使用equals比较。取元素时,根据key获得相应的value值。
5.比较 HashSet、LinkedHashSet 和 TreeSet
- HashSet 是 Set 接⼝的主要实现类 , HashSet 的底层是 HashMap ,线程不安全的,可以存储 null 值;
- LinkedHashSet 是 HashSet 的⼦类,能够按照添加的顺序遍历;
- TreeSet 底层使⽤红⿊树,能够按照添加元素的顺序进⾏遍历,排序的⽅式有⾃然排序和定制排序。
6.如何选用集合
- 如果需要根据键值来获取元素值时,选择使用Map接口下的集合,如果需要排序,选择TreeMap,不需要排序选择HashMap,需要保证线程安全选择ConcurrentHashMap;
- 如果只是存放元素值,选择使用Collection接口下的集合,如需要保证元素唯一,选择Set接口下的TreeSet 或 HashSet,不需要就选择实现 List 接⼝的比如 ArrayList 或LinkedList,然后再根据实现这些接⼝的集合的特点来选用。