===========================
在Java 集合可分为 Collection 和 Map 两种体系。
一:Collection 体系是以Collection 接口为基础,其是定义了存取一组对象的方法的集合。Collection 体系用于存储单列数组。
二:Map 体系是以Map接口为基础。其是保存具有映射关系“key-value对”的集合。Map 体系用于存储双列数据。
Collection接口继承树
可以看到,主要有两个接口List与Set继承自Collection接口:
- |----List接口:存储有序的、可重复的数据。 有3个类实现了List接口:
- |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
- |----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
- |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
- |----Set接口:存储无序的、不可重复的数据 -->高中讲的“集合”
- |----HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值
- |----LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历(对于频繁的遍历操作,LinkedHashSet效率高于HashSet).
- |----TreeSet:可以按照添加对象的指定属性,进行排序。
- |----HashSet:作为Set接口的主要实现类;线程不安全的;可以存储null值
Collection 接口中的方法
Collection 接口是 List、 Set 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List集合 。在向Collection接口的实现类的对象中添加数据obj时,要求obj所在类要重写equals(), 因为在有些方法中用到了equals()操作。
Collection 接口有如下方法:
(List除了从Collection集合继承的方法外, List 集合里还添加了或重载了一些根据索引来操作集合元素的方法。而Set 集合没有额外的方法,就只能用下面这一些)
- 添加
add(Object obj)
addAll(Collection coll) - 获取有效元素的个数
int size() - 清空集合
void clear() - 是否是空集合
boolean isEmpty() - 是否包含某个元素
boolean contains(Object obj): 判断当前集合中是否包含obj。是判断时会调用obj对象所在类的equals()。
boolean containsAll(Collection c): 判断形参c集合中的所有元素是否都存在于当前集合中。也是调用元素的equals方法来比较的。 拿两个集合的元素挨个比较。 - 删除
boolean remove(Object obj) : 通过元素的equals方法判断是否是要删除的那个元素。 只会删除找到的第一个元素
boolean removeAll(Collection coll): 取当前集合的差集 - 取两个集合的交集
boolean retainAll(Collection c): 把交集的结果存在当前集合中,不
影响c - 集合是否相等
boolean equals(Object obj) - 转成对象数组
Object[] toArray() .>>>拓展:数组 —>集合:调用Arrays类的静态方法asList() - 获取集合对象的哈希值
hashCode() - 遍历
iterator(): 返回迭代器对象,用于集合遍历。
集合元素的遍历操作,使用迭代器Iterator接口- 内部的方法:hasNext() 和 next()
- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象, 默认游标都在集合的第一个元素之前。
- 内部定义了remove(),可以在遍历的时候,删除集合中的元素。此方法不同于集合直接调用remove()
- 注意:
- Iterator可以删除集合的元素, 但是是遍历过程中通过迭代器对象的remove方法, 不是集合对象的remove方法。
- 如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,再调用remove都会报IllegalStateException。
//集合的遍历
//方式一:不推荐
for(int i = 0;i < coll.size();i++){
System.out.println(iterator.next());
}
//方式二:推荐
hasNext():判断是否还有下一个元素
while(iterator.hasNext()){
//next():①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}
//方法三:加强for循环foreach,可用于遍历Collection或数组,遍历过程无需索引,其遍历集合的底层本质上是调用Iterator完成操作。
for(Object obj : list){
System.out.println(obj);
}
}