目录
3.ArrayList、LinkedList、Vector的区别
1.Java常见的集合框架
2.list、set、map的区别
List
和Set
存储单列数据,Map存储
键值对;List
中存储的数据是有顺序的,并且值允许重复;Set
中存储的数据是无顺序的,并且不允许重复(Set
集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。Map
中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
3.ArrayList、LinkedList、Vector的区别
ArrayList是动态数组Array的数据结构,便于set和get
LinkedList是链表的数据结构,便于添加和删除
Vector与ArrayList基本相同,但是Vectro是线程安全的,在使用效率上不如ArrayList。
4.Map实现类介绍:
HashMap:基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null键;
HashTable:线程安全,低效,不支持 null 值和 null 键;
LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序;
SortMap 接口:TreeMap,能够把它保存的记录根据键排序,默认是键值的升序排序
5.Set实现类介绍:
HashSet:底层是由 Hash Map 实现,不允许集合中有重复的值,使用该方式时需要重写 equals()和 hash Code()方法;
LinkedHashSet:继承于 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMap
6.关于HashMap的常见面试题:
6.1 HashMap与HashTable的区别?
HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的;
HashMap允许K/V都为null;后者K/V都不允许为null;
HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类;
6.2 HashMap的扩容操作是怎么实现的?
resize()方法。
6.3 HashMap是怎么解决哈希冲突的?
1.开放定址法:开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
2.链地址法:将哈希表的每个单元作为链表的头结点,所有哈希地址为i的元素构成一个同义词链表。即发生冲突时就把该关键字链在以该单元为头结点的链表的尾部。
3.再哈希法:当哈希地址发生冲突用其他的函数计算另一个哈希函数地址,直到冲突不再产生为止。
4.建立公共溢出区:将哈希表分为基本表和溢出表两部分,发生冲突的元素都放入溢出表中。
6.4 HashMap 的数据结构?
Jdk1.8之前是数组+链表
Jdk1.8之后是数组+链表+红黑树