集合的面试题:
1、说说你了解的集合:
集合分为两大类:
- Conllection集合(单例集合)
- List集合 (里面的元素可以重复)
- ArrayList集合 :底层是数组存储,特点是查询快,增删慢
- LinkedList集合 :底层是链表存储,特点是增删快,查询慢
- Set集合 (里面的元素不可重复)
- HashSet:
- LinkedHashSet
- TreeSet
- Map集合 (双列集合)
- HashMap集合
- LinkedHashMap集合
- TreeMap集合
- HashTable集合
2、说说对ArrayList的理解
ArrayList集合是List的一个实现类,它的底层是通过数组来实现的,而数组是通过索引来进行查询的,查询的速度是比较快的,所以,ArrayList集合的查询的速度也是很快的,查询的时间复杂度是O(1)。增加删除的话是很慢的,相比另外的一个集合来说。这个集合是线程不安全的。因为在它的add()方法里,会去检查数组的第容量是否够用,不够用的话是在创建于一个新的数组,再把数组里面的内容保存到新的数里面,在把引用的数组地址赋值给新数组,到达数组扩容的问题,它的add() 操作不是原子性操作
注意: 原子(atom)本意是“不能被进一步分割的最小粒子”,
原子操作(atomic operation)意为”不可被中断的一个或一系列操作”
3、说说对LinkedList的理解
LinkedList也是List的一个实现类,它的底层是双链表结构,其内部有一个next指针指向下一个元素,一个prev指针指向上一个元素,因为是双链表结构,所以他的增减删除快,查询慢。它是线程不安全的,它的添加操作也不是原子性操作,
4、说说对Vector的理解
Vector也是List集合的一个实现类,它的底层是数组,底层和ArrayList集合差不多,也就是ArrayList加上(synchironized)锁之后的,所以它是线程安全的,但是,它的使用率却是很少的,主要的原因是他的效率很低,没有ArrayList高。
5、说说List和Set的区别
List和Set的区别:List的存储是是按照存入的顺序来的,而Set的存储顺序是按照哈希值来进行存入的;
List是能存储重复的元素的,而Set不能存储重复的元素
6、说说对HashSet的理解
HashSet是Set的一个实现类,底层实现的是HashMap的key,他的初始容量是16,负载因子是0.75,如果进行扩容的话是扩到原来的2倍。HashSet的存储元素的顺序并不是按照存入的顺序,是按照元素的哈希值的大小来进行存储的。它不能存储相同的元素,是通过它的HashCode()方法和equals()方法俩进行比较两个元素是否为同一元素。
7、LinkedHashSet的理解
LinkedHashSet是对基础的HashSet集合进行加上双链表,使得它的存取有序
8、说说TreeSet的理解
TreeSet是使用二叉树的原理对 add 的对象按照指定的顺序进行排序(升序、降序),每添加一个元素都会进行排序,将元素插入到二叉树的指定的位置
9、聊聊HashMap的理解(重点)
在JDK1.7以前,它的底层是数组+链表实现的
在JDK1.8之后,它的底层是数组+链表+红黑树实现的,先是使用数组的结构来进行存储,在遇见相同的哈希值的元素之后,判断是否为同一个元素,不是同一个元素后,会在数组的那个位置衍生一个链表,在这个条链子上存储到8个元素之后,还有相同的哈希值的元素时候就使用红黑树来进行存储元素了,
它不能保证元素的存取顺序是一致的
线程不是安全的
10、LinkeHashMap的理解
LinkeHashMap解决了HashMap的存取元素不是一致的,他的内部添加了一条链表,保证了存取的顺序一致
11、如果想保证HashMap的线程安全,该咋办?
可以通过HashTable来保证它的线程安全,该类的出现主要是解决这个问题,解决的办法是直接使用synchironized锁机制,所以效率不是很高,所以使用的很少,也不推荐,
在JDK10.0时候,解决办法是使用并发包里面的一个类,ConcurrentHashMap,这个类是java.util.concurrent包里面的一个类,是它的一个扩展,也解决了线程不安全问题
12、Conllection和Conllections的比较
Conllection是一个集合接口,是集合里面的顶级接口,他既同==提供了集合的公共的基础操作集合的方法,它的继承接口有List和Set两个接口,
Conllections是一个集合的工具类,提供一系列的静态的方法,用于对集合里面的元素进行排序、搜索、以及线程安全等各种操作
13、ArrayList和LinkedList的比较
ArrayList集合的底层数据结构是数组,它支持数组的随机访问。时间复杂度O(1)
LinkedList的底层数据结构是双链表,不支持随机访问,使用下标访问下一个元素。时间复杂度O(n)
14、ArrayList和Vector的比较
Vector使用了synchironzied来保证线程是同步的,是线程安全, 每一次进行扩容是扩展1倍
ArrayList不是线程安全的,而且它每一次扩容只是扩展0.5倍
15、HashMap和HashTable的比较
HashMap允许空键值,而HashTable不允许,HashMap是线程不安全的(效率高),HashTable是线程安全的(效率不高)