Java集合框架
集合与数组的区别
- 集合长度可变,数组长度不可变 集合中存储的为引用对象,
- 数组中可以存储引用对象,也可以存储基本类型
- 集合中存储的内容可以不是同一类型,数组中存储的内容必须是同一类型
List接口
List的特点是元素可重复,有序(数据add的顺序)
ArrayList
- 底层实现为动态数组,线程不安全;
- 获取数据时(get方法)快,直接根据索引找到数据;
- 插入删除数据慢,因为需要挪动数组中的元素;
- List长度可变,是通过数组扩容实现的,数组的扩容是通过数组拷贝实现的,因此初始化list时可指定大小,避免频繁扩容消耗性能
LinkedList
- 底层为双向链表,线程不安全;
- 获取数据时慢,因为需要通过链表一步步遍历到指定位置;
- 插入删除数据快,因为只需要维护链表的前后关系;
Vector(据说已弃用)
- 底层实现为数组,线程安全;
Set接口
Set的特点是无序,去重复。
HashSet
使用Hash链表、数组存储数据,线程不安全;
LinkedHashSet
采用链表、Hash表共同实现,线程不安全;
TreeSet
底层为二叉树,元素好排序,线程安全;
Map接口
- 它是key-value键值对,一个map不能包含重复的key,且每个key只能映射一个value;
- Map接口提供了三个集合视图:key的集合,value的集合,key-value的集合;
- Map内元素的顺序取决于Iterator的具体实现逻辑,获取集合内的元素实际上是获取一个迭代器,实现对其中元素的遍历;
- Map接口的具体实现中存在三种Map结构,其中HashMap和TreeMap都允许存在null值,而HashTable的key不允许为空,但是HashMap不能保证遍历元素的顺序,TreeMap能够保证遍历元素的顺序;
HashMap
- 允许key和value为null;
- 基于数组+链表的结构实现;
- 线程不安全
Hashtable
- key和value都不能是null值;
- 线程安全的;
TreeMap
- 是基于红黑树的一种提供顺序访问的Map;
- 当未实现 Comparator 接口时,key 不可以为null,否则抛 NullPointerException 异常;
- 当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException
异常。如果针对null情况实现了,可以存入,但是却不能正常使用get()访问,只能通过遍历去访问 - 非线程安全的