集合类存放于Java.util包中,主要有3种:set(集)、list和map(映射)。
1.Collection:Collection是集合List、Set、Queue的最基本的接口。
2.Iterator:迭代器,可以通过迭代器遍历集合中的数据
3.Map:是映射表的基础接口
一、Collection接口
1.List
1.1ArrayList:排列有序,可重复;底层使用数组;速度快增删慢;线程不安全;当容量不够使,ArrayList是当前容量*1.5+1
1.2Vector:排列有序,可重复;底层使用数组
速度快,增删慢;线程安全效率低;容量不够时Vector默认扩展已被容量
1.3LinkedList:排列有序,可重复;底层使用双向循环链表数据结构:查询速度慢,增删快;线程不安全
2.Set
2.1HashSet:排列无序,不可重复;底层使用Hash表现;存取速度快;内部是HashMap
2.2TreeSet:排列无序,不可重复;底层使用二叉树实现;排序存储;内部是TreeMap的SortedSet
2.3LinkedHashSet:采用hash存储,并用双向链表记录插入顺序;内不是LinkedHashMap
3.Map
HashMap:键不可重复,只可以重复;底层哈希表;线程不安全;允许key值为null,value也可以为null
hashtable:键不可以重复,值可以重复;底层哈希表;线程安全;key、value也可以为null
treeMap:键不可重复,值可重复;底层二叉树。
二、分析
1.List
Java的List是非常常用的数据类型。List是有序的Collection。Java List一共有三个实现类
1.1ArrayList
ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。素组的缺点是每个元素之间不能有间隔。注:当数组大小不满足时需要增加存储能力,就要将已经有数据的数组赋值到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合碎甲查找和遍历,不适合插入和删除。
2.Set
Set注重独一无二的性质,该体系集合用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。对象的相等性本质是对象hashCode值(java是依据对象的内存地址计算出的次序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法。
2.1HashSet
哈希表存放的是哈希值。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同)而是按照哈希值来存的所以数据也是按照哈希值取得。元素的哈希值是通过元素的hashcode方法获取的,HashSet首先判断两个元素的值,如果哈希值一样,介质会比较equals方法如果我去了上结果为true,HashSet就视为同一个元素。如果equals为false就不是同一个元素。
哈希值相同equals为false的元素是怎样存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。形成一个链表。
HashSet通过hashCode值来确定元素在内存中的位置。一个hashCode位置上可以存放多个元素。
2.2TreeSet
TreeSet()是使用二叉树的原理对新add()的对象按照指定顺序排序(升序、降序),每赠加一个对象都会进行排序,将对象插入到二叉指定的位置。
Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自定义的类必须实现Comparable接口,并且重写comparaTo()函数或者使用匿名内部类实现自定义比较器Comparator ,才可以正常使用。
TreeSet<Person> treeSet = new TreeSet<>(new Comparator<Person>() {//降序
@Override
public int compare(Person o1, Person o2) {
int result = o2.getAge() - o1.getAge();
//ctrl + d ---> 复制当前行!!!!!!!
result = result == 0 ? o2.getHeight() - o1.getHeight() : result;
result = result == 0 ? o2.getName().compareTo( o1.getName()) : result;
return result;
}
});
3.Map
3.1HashMap(数组+链表+红黑树)
HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序趋势不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导师数据的不一致。如果需要满足线程安全,可以使用Collections的synchronizedMap方法使HashMap安排具有线程安全的能力,或者使用ConcurrentHashMap。
3.2TreeMap
TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,
也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
如果使用排序的映射,建议使用TreeMap
当key为自定义类时,key必须实现Comparable接口或者在构造TreeMap时传入自动以的Comparator,否则会在运行时抛出ClassCastException类型的异常