Java集合主要分为三种类型:Set(集)、List(列表)和Map(映射)。
1:集合和组数的区别
数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。所有的JAVA集合都位于java.util包中。 JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
几乎所有的集合都是基于数组来实现的。因为集合是对数组做的封装,所以数组永远比任何一个集合要快。但任何一个集合,比数组提供的功能要多。
2集合(Collection:List、Set,Map:HashMap、TreeMap)
具体实现
3.1、Collection接口
Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection。
3.1.1、Collection接口的方法:
boolean add(Object o) :向集合中加入一个对象的引用
void clear():删除集合中所有的对象,即不再持有这些对象的引用
boolean isEmpty():判断集合是否为空
boolean contains(Object o) :判断集合中是否持有特定对象的引用
Iterartor iterator() :返回一个Iterator对象,可以用来遍历集合中的元素
boolean remove(Object o) :从集合中删除一个对象的引用
int size() :返回集合中元素的数目
Object[] toArray():返回一个数组,该数组中包括集合中的所有元素
注意:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。
Iterator接口声明了如下方法:
hasNext():判断集合中元素是否遍历完毕,如果没有,就返回true
next() :返回下一个元素
remove():从集合中删除上一个有next()方法返回的元素
集合框架底层数据结构总结
Collection
1. List ( 有序、可重复)
- Arraylist:底层数据结构 Object数组 ,查询快,增删慢。线程不安全。效率高
- Vector: Object数组 线程安全。效率低
- LinkedList: 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)
查询慢,增删快。线程不安全,效率高。
2. Set
- HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
- LinkedHashSet(唯一、有序): LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的
- TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)
Map
- HashMap:无序 不是同步的、线程不安全。HashMap效率较高, HashMap允许null值(key和value都允许)。 JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间
- LinkedHashMap:有序 LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。详细可以查看:《LinkedHashMap 源码详细分析(JDK1.8)》
- Hashtable:无序 同步。线程安全。效率低 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的