一、Java集合分类
Java结合在包java.util中,主要分为,set(集)、list(列表,包含Queue)、Map(映射)
其中、set、list、queue的基本接口是Collection,Map是映射表的基础接口。
Iterator是迭代器,可以通过集合的迭代器,遍历集合中的数据。
- list集合包括ArrayList、Vector、LinkedList。
- set集合包括HashSet、TreeSet、LinkedHashSet。
- Queue——两端出入的list,可以用数组和链表来实现。
二、list集合
有序的Collection。
2.1 ArrayList
最常用的list集合,底层实现为数组,可实现list元素的快速访问。
缺点:当list大小不满足,需要增加存储空间时,需要将整个数组移动到新的存储空间;另由于数组不能有空隙,所以插入或者删除list中间一个位置时,需要移动list数组的位置,代价比较高。
所以ArrayList数组适合查询和遍历,不适合插入和删除
一个有意思的错误,Arrays.asList()方法,将数组转换成list集合,不能使用修改集合的相关方法,如add/clear/remove,只能查询遍历。
如下代码,会抛出UnsupportedOperationException。
public void Test1(){
String[] strings = new String[3];
strings[0] = "one";
strings[1] = "two";
strings[2] = "three";
List<String> list = Arrays.asList(strings);
list.add("four");
}
至于原因,可以看下asList()方法的源码,如下,返回的为a,有final修饰符,不能修改数组的大小。
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
.....
}
2.2 Vector
底层一样为数组实现,不过是线程安全的,某一个时刻,只能有一个线程访问,所以速度慢。
2.3 LinkedList
LinkedList本质上是双向链表,支持快速的插入和删除,只需修改对应位置元素的前后信息即可,随即访问和遍历速度比较慢。
同时LinkedList有专门操作表头和表位的元素方法,适合当做栈、队列和双向队列来使用。
三、Set
无序的Collection,即存入顺序和读出顺序不一致,值不能重复。Set比较两个元素是否一致,是通过元素的hashCode值(Java根据对象的内存地址计算出此序号)和equals方法来判断,hashCode值相等并且equals为true,才认为两个值相等。
3.1 hashSet
按元素的hashCode来存储数据,如果两个元素hashCode相同,equals为false,两个元素存储在同个hashCode值得桶中,有点类似hashMap。
3.2 TreeSet
TreeSet利用二叉树的原理,对新add()进来的元素进行排序(升序或者降序),排序的依据为元素对象的Comparable接口的compareTo()函数的返回值,所以Integer和String(已有默认的compareTo()方法实现)可以自动排序,自定义对象要实现TreesSet的排序,需要继承Comparable接口,重写comparTo()方法。类似的还有TreeMap。
四、Map
Map是Java的映射集合,主要使用的实现对象有hashMap、concurrentHashMap、TreeMap、LinkedHashMap
4.1 hashMap和concurrentHashMap
这两个不多说,其他文章中已经有所研究。
4.2 TreeMap
实现元素的排序,元素需要实现Comparable接口的compareTo()方法。
4.3 LinkedHashMap
linkedHashMap是hashMap的一个子类,最大的特点是记录插入的顺序,iterator迭代器遍历元素时,输出的元素是插入的顺序。