Map集合和Collection集合类总结
Java的数组有很多弊端:长度固定,不可增删,只能存储同一种数据类型,数组内元素的内存空间是连续分配的,对内存要求高。 而Java中的集合弥补了这一点,在Java中的集合可以分为两大类Collection
和map
, 对此基于我们不同的需求可以产生不同的实现。
Collection(单列集合)
List
- List接口是一个有序集合,允许有相同的元素
ArrayList
- Arraylist是最常用的实现类,拥有线性结构,本质上就是一个数组,通过动态扩容实现添加元素(创建一个1.5x的空间,把原先的所有元素拷贝过去)
LinkedList
- LinkedList底层为链表,特点是分配内存空间不是必须连续的、插入,删除操作也很快,只要修改前后指针,时间复杂度为O(1)
ArrayList和LinkedList区别
- ArrayList是实现基于动态数组的数据结构,而LinkedList是基于链表的数据结构
- 对于随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList需要移动指针
- 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList需要移动数据
Set
没有顺序,不能包含重复元素
HashSet
- HashSet中不能包含重复元素,可以有NULL元素,存入的元素是无序的
- HashSet底层结构是哈希表,确认唯一性的两个方法是 HashCode()/equals()方法
- 添加删除时间复杂度都是O(1)
- 非线性安全
LinkedHashSet
- LinkedHashSet中不能包含重复元素,可以有NULL元素,存入的元素是按照放入顺序排列
- 底层结构是哈希表和链表,链表保证了数据存储和取出一致,哈希表保证了元素的唯一性
- 添加删除时间复杂度都是O(1)
- 非线性安全
Map(key-value集合)
- Map即为映射,不能有重复的key,可以有重复的value(例如ID和name)
HashMap
- HashMap 是一个散列表,它存储的内容是键值对(key-value)映射
- HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口
- HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的
TreeMap
- TreeMap 是一个有序的key-value集合,它是通过红黑树实现的
- TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合
- TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合
- TreeMap 实现了Cloneable接口,意味着它能被克隆
- TreeMap 实现了java.io.Serializable接口,意味着它支持序列化
- TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n)