集合是用来代替数组完成数组做不到的工作的,用过数组的都知道,数组有着很明显的短板,数据类型的限制,定长的不灵活性等,因此几乎被集合完全取代。
通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。它比数组功能要强大的多,灵活性也更高。但我们要注意:
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类一共分为map、set以及list:
- map是键值对
- set是集合
- List是列表
其中set和List有一个共同的父类即Collections
map可细分为TreeMap和HashMap;
set可细分为TreeSet和HashSet;
List可细分为ArrayList和LinkedList;
注意:Collection和Collections只差了个s,但两者是不同的,Collections是集合类,有Set和List两个子类;而Collection是一个接口,Set和List实现了Collection接口,而Map则实现了Map接口。
关系图如下:
-List
- ArrayList
ArrayList是用数组的顺序存储存储数据的。
- 优点:在存储的同时赋予了数据下标值,我们可以直接通过下标值获取到数据,查询数据非常方便。
- 缺点:在添加数据的时候需要断开集合进行添加,之后对断点后的数据进行后移,要花费比较多的时间。
- LinkedList
LinkedList是用链表的方式存储数据的。
- 优点:在添加数据的时候只需要将要断点位置前一个数据指针指向新数据,再将新数据的指针指向断点位置的后一个数据,非常快速,不用进行移位。
- 缺点:由于LinkedList是用指针方式连接的,没有赋予下标值,于是在LinkedList中查询数据时,需要遍历列表,对列表数据一个个赋予下标,然后才能得到数据,费时费力。
总结:在List中
对于需要频繁添加数据的程序则使用LinkedList;
对于需要频繁查询数据的程序则使用ArrayList;
-Set
- TreeSet
树状集合,可以有序的存放数据,声明方式:
Set<E> set = new TreeSet<E>();
在使用TreeSet集合时,要注意以下几点:
- 要想指定排序的顺序和依据,被排序的对象需要实现Comparable接口;
- 树集合不能添加重复的元素;
- 树集合不能保存null值(添加时会调用Comparable方法,值不能为null);
- HashSet
散列集合,在添加和查找元素的时候用的是哈希算法,高效快速。
相应的,它的声明方式为:
Set<E> set = new HashSet<E>();
在使用HashSet集合的时候,要注意以下几点:
- HashSet存储的对象,应该重写HashCode()和equals()两个方法;
- 当一个值添加到HashSet中的时候,不要修改能改变HashCode的元素;
- 不能添加重复的元素;
-Map
Map是一种键值对,用key对应value存储数据
- TreeMap
散列值键值对,速度更快(常用) - HashMap
树状键值对,存放有序