1. java.lang.Object
1.1 Map
Map主要是用来存储键值对,Key值唯一,Value值不唯一,主要包括HashMap和TreeMap,二者区别如下:
-
数据结构:
HashMap是基于hash表实现的,默认无序
TreeMap是基于红黑树实现的,默认有序 -
比较:
HashMap继承AbstractMap类,通过覆盖hashCode()和equals()方法实现
TreeMap继承SortedMap类,通过实现Comparable接口的CompareTo()方法实现对两个键值对的比较 -
调优:
HashMap可以通过调整初始容量和负载因子来优化对HashMap空间的使用
TreeMap总是处于平衡状态,无法进行调优 -
适用场景:
HashMap在插入、删除、定位元素时所用时间短,多数情况下考虑使用
Tree适用于按自然顺序或者自定义顺序遍历Key的情况 -
相同点:均线程不安全
1.2 Collection
1.2.1 Set
Set相比于List的最大特点是元素唯一,主要包括HashSet和TreeSet,二者区别如下:
-
数据结构:
HashSet是基于hash表实现的,默认无序
TreeSet是基于红黑树实现的,默认有序 -
比较:
HashSet通过重写hashCode()和equals()函数实现
TreeSet通过实现Compareable接口的comareto()方法实现 -
null值:
HashSet可以存放null值,但只能存放一个
TreeSet不可以存放null值 -
性能:
HashSet的查找性能更好,在大多数情况下被使用
TreeSet胜在可以自动排序,使用较少 -
相同点:均线程不安全
1.2.2 List
List容器可以存放重复的元素,同时可以存放null值,默认无序,一般在使用堆栈、队列时使用,主要包括ArrayList、LinkedList和Vector
ArrayList和LinkedList比较:
-
数据结构:
ArrayList是基于动态数组实现的
LinkedList是基于双向循环链表实现的 -
时间:
ArrayList支持随机访问某一位置的元素,查找所用时间短,但是如果要增加或者删除元素就要涉及到元素的移动,花费时间较长
LinkedList如果要查找某一位置的元素需要从头向后遍历查找,消耗时间长,但反之,增加和删除元素用到的时间短 -
空间:
ArrayList起始容量是10,每次扩容增加到原来的1.5倍。对空间的的浪费主要体现在列表后边会事先预留一些空间
LinkedList对空间的浪费主要体现在记录一个元素的同时还要记录它的前一个元素和后一个元素 -
性能:
ArrayList适用于在后边添加数据且需要随机访问数据的情况
LinkedList适用于在前边或者中间添加数据且顺序访问数据的情况 -
相同点:均线程不安全
ArrayList和Vector的比较:
- 相同点:都是动态数组的数据结构
- 性能:
ArrayList是线程异步的,线程不安全但性能高
Vector是线程同步的,线程安全但性能低 - 扩容:
ArrayList每次扩容容量是之前的1.5倍,在数据量小的时候可以节约空间
Vector每次扩容容量是之前的2倍,在数据量大的时候性能更好