前言
JAVA集合体系的简单介绍。
集合继承图
上图中,虚线空箭头就是实现,实线空箭头就是继承,虚线实箭头是依赖。
1、Iterator接口
Iterator接口,一个集合的迭代器,主要包含hasnext(),next(),remove()三种方法。
迭代器的常见问题
常见问题一
- 在进行集合元素获取时,如果集合中已经没有元素可以迭代了,还继续使用迭代器的next方法,将会抛出java.util.NoSuchElementException没有集合元素异常。
- 解决办法: 如果还需要重新迭代,那么就重新获取一个新的迭代器对象进行操作
(迭代完一次集合后,迭代器不能用了)
常见问题二
- 在进行集合元素迭代时,如果添加或移除集合中的元素 , 将无法继续迭代 , 将会抛出ConcurrentModificationException并发修改异常.
(在迭代器创建的时候,已经将集合大小确定了,所以不能增删)
remove()方法
从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 此方法只能调用一次next() 。 如果底层集合在迭代过程中以任何方式进行修改而不是通过调用此方法,则迭代器的行为是未指定的。
关于remove()方法的理解,请看下面这篇文章。
Iterator中的remove()方法详解-Java
2、Collection(集合的最大接口)
Collection:是单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是
- java.util.List: List的特点是元素有序、元素可重复 ;
List接口的主要实现类有java.util.ArrayList和java.util.LinkedList, - java.util.Set: Set的特点是元素不可重复。
Set接口的主要实现类有java.util.HashSet和java.util.LinkedHashSet,java.util.TreeSet。
3、List
- ArrayList 数组结构,线程不安全,查询速度快
- LenkedList 链表结构,增删速度快
4、Set
**特点:**元素无索引,元素存取无序,元素不可重复(唯一)
实现类:
- HashSet集合:元素无索引,元素存取无序,元素不可重复(唯一)
- LinkedHashSet集合:元素无索引,元素存取有序,元素不可重复(唯一)
- TreeSet集合:元素无索引,元素存取无序,元素不可重复(唯一),元素可排序
HashSet如何保证元素唯一?
HashSet集合保证元素唯一的原理:底层是哈希表结构,哈希表保证元素唯一依赖于hashCode()和equals方法();
先调用hashCode()方法计算哈希值,判断哈希值是否相同,
- 相同,判断equals是否为true,
- 不相同,不调用equals。
5、Map
Map集合的概述:
Map<K,V>接口概述:也称Map集合,是所有双列集合的顶层父接口,K用来限制键的类型,V用来限制值的类型
Map集合的特点:
Map集合存储元素是以键值对的形式存储,也就是说每一个键值对都有键和值
通过键取值
Map集合中的键不能重复,如果键重复了,那么值就会覆盖
Map集合中的值是可以重复
Map集合的实现类:
HashMap类:键唯一,键值对存取无序, 由哈希表保证键唯一
LinkedHashMap类:键唯一,键值对存取有序,由哈希表保证键唯一,由链表保证键值对存取有序
TreeMap类:键唯一,可以对键值对进行排序
6、Collections(集合工具类)
常用方法如下:
public static void shuffle(List<?> list):
打乱集合顺序。public static <T> void sort(List<T> list)
:将集合中元素按照默认规则排序。public static <T> void sort(List<T> list,Comparator<? super T> com )
:将集合中元素按照指定规则排序。
//shuffle方法使用 打乱
Collections.shuffle(list);
//sort方法使用 默认规则排序
Collections.sort(list);
Comparator比较器
指定规则: 自己定义的规则
参数Comparator接口:也称比较器接口,用来指定排序的规则
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// 指定排序规则
// 前减后:升序
// 后减前:降序
// 前:第一个参数 o1
// 后:第二个参数 o2
return o2 - o1;
}
});