当筵意气临九霄,星离雨散不终朝。这篇文章主要讲述Java集合框架之 Collection 接口 #yyds干货盘点#相关的知识,希望能为你提供帮助。
Collection 接口
所有通用集合实现都有一个带有 Collection 参数的构造函数,此构造函数初始化新集合以包含指定集合中的所有元素,即它允许转换集合的类型。
如把一个 Collection<
String>
s,它可以转化成 List、Set 或其他类型的 Collection。如:
List< String> s = new ArrayList< String> (c);
Collection 接口包含执行基本操作的方法:
- ?
?int size()?
? - ?
?boolean isEmpty()?
? - ?
?boolean contains(Object element?
? - ?
?boolean add(E element)?
? - ?
?boolean remove(Object element)?
? - ?
?Interator< E> interator()?
?
Collection 接口还包含对整个集合进行操作的方法:
- ?
?boolean containsAll(Collection< ?> c)?
? - ?
?boolean addAll(Collection< ? extends E> c)?
? - ?
?boolean removeAll(Collection< ?> c)?
? - ?
?boolean retainAll(Collection< ?> c)?
? - ?
?void clear()?
?
- ?
?Object[] toArray()?
? - ?
?< T> T[] toArray(T[] a)?
?
JDK 8 及更高版本中,Collection 接口还公开方法 Stream< E> stream() 和 Stream< E> parallelStream(),帮助从底层集合中获取顺序或并行流。
public interface Collection< E> {
boolean add(E element);
Interator< E> iterator(); // 返回一个用于访问集合中各个元素的迭代器
}
?
?add?
? 方法用于向集合中添加元素。如果成功添加元素改变了集合就返回 true;如果集合没有发生改变就返回 false。比如在集合( set )中添加一个对象,如果这个元素在集合中已经存在,这时 add 方法就没有奏效,因为集合中不允许有重复的对象。?
?interator?
? 方法用于返回一个实现了 Interator 接口的对象,可以使用这个迭代器对象依次访问集合中的元素。集合遍历接口--迭代器Iterator 接口包含 4 个方法:
public interface Interator< E> {
E next(); // 返回将要访问的下一个对象。如果已经到达了集合的末尾,将抛出一个 NoSuchElement-Exception
boolean hasNext(); // 如果存在另一个可访问的元素,返回 true
void remove(); // 删除上次访问的对象。这个方法必须紧跟在访问一个元素之后执行。如果上次访问之后集合已经发生了变化,这个方法将会抛出一个 IllegalStateException
default void forEachRemaining(Consumer< ? super E> action); // 访问元素,并传递到指定的动作,直到再没有更多元素,或者这个动作抛出一个异常
}
通过反复调用 ?
?next?
?? 方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next 方法将抛出一个 ??NoSuchElementException?
?。因此,在需要调用 next 之前调用 hasNext 方法。?
?hashNext?
? 如果迭代器对象还有多个可以访问的元素,这个方法就返回 true。Collection< String> c = ...;
Interator< String> iter = c.iterator();
while (iter.hasNext()) {
String element = iter.next();
// do something with element
}
用 ?
?for each?
? 循环可以更加简练地表达同样的循环操作:for (String element : c) {
// do something with element
System.out.Println(element);
}
?
?for each?
? 循环可以处理任何实现了 Iterable 接口的对象,这个对象只包含一个抽象方法:【Java集合框架之 Collection 接口 #yyds干货盘点#】
public interface Iterable< E> {
Iterator< E> iterator();
}
JDK8 及更高版本中,迭代集合的首选方法是获取流并对其执行聚合操作。聚合操作需要与 Lambda 表达式结合使用,以使用较少的代码使编程更具表现力。
myShapeCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.Println(e.getName()));
访问元素的顺序取决于集合类型。
- 如果迭代处理一个 ArrayList,迭代器索引从 0 开始,没迭代一次,索引值加 1 。
- 如果访问 HashSet 中的元素,会按照一种基本上随机的顺序获得元素。(每一次访问的顺序都是唯一的)
Iterator 接口的 ?
?remove?
? 方法将会删除上次调用 next 方法时返回的元素。目的是:删除某个元素前最该先看一下这个元素。集合接口批量操作批量操作对整个集合执行操作。包含基本的方法有:
- ?
?contailsAll?
? : 如果目标 Collection 包含指定 Collection 中的所有元素,就返回 true。 - ?
?addAll?
? : 将指定 Collection 中的所有元素添加到目标 Collection。 - ?
?removeAll?
? : 从目标 Collection 中删除包含在指定 Collection 中的所有元素。 - ?
?retainAll?
? : 从目标 Collection 中删除所有所有未包含在指定 Collection 中删除所有未包含在指定 Collection 中的元素。 - ?
?clear?
? : 从集合中删除所有元素。
如,检测任意集合是否包含指定元素的泛型方法:
public static < E> boolean contains(Collection< E> c, Object obj) {
for (E element : c)
if (element.equals(obj))
return true;
return false;
}
其他方法还有一些实用方法非常有用,应该将它们提供给用户实用。下面列举一部分:
int size()// 返回当前存储在集合中的元素个数
boolean isEmpty() // 如何集合中没有元素,返回 true
boolean contains(Object obj)// 如果集合中包含了一个与obj相等的元素,返回true
boolean equals(Object other)// 如果集合与 other 集合相等,返回true
boolean add(E element) // 将一个元素添加到集合中。由于这个调用改变了集合,返回 true
boolean addAll(Collection< ? extends E> from) // 将 other 集合中的所有元素添加到这个集合。如果由于这个调用改变了这个集合,返回true
boolean remove(Object obj)// 从这个集合中删除等于 obj 的对象。如果有匹配的对象被删除,返回true
boolean removeAll(Collection< ?> c) // 从这个集合中删除obj集合中存在的所有元素。如果这个调用改变了集合,返回true
default boolean removeIf(Predicate< ? super E> filter // JDK8, 从这个集合中删除filter返回true的所有元素,如果因为这个调用改变了集合,返回true
void clear() // 从这个集合中删除所有的元素
boolean retainAll(Collection< ?> c) // 从这个集合中删除所有与other集合元素不同的元素。如果由于这个调用改变了集合,返回true
Object[] toArray() // 返回这个集合中的对象的数组
< T> T[] toArray(T[] arrayToFill)
?
?<
T>
T[] toArray(T[] arrayToFill)?
? :返回这个集合中的对象的数组。如果 arrayToFill 足够大,就将集合中的元素填入这个数组中,剩余空间填补 null;否则,分配一个新数组,其成员类型与 arrayToFill 的成员类型相同,其长度等于集合的大小,并填充集合元素。Reference: java 核心技术 卷 1 :基础知识(原书第11版)
推荐阅读
- #yyds干货盘点#看动画学算法之:hashtable
- 携程一面(分布式配置系统Apollo如何实时更新配置的?)
- Hadoop 入门笔记—核心组件 YARN
- git基础命令大全
- #yyds干货盘点#马拉车算法解最长回文子串!Manacher
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClie
- #yyds干货盘点#Galang中的map数据类型使用
- #yyds干货盘点# web安全day10(通过实验理解windows域的OU和GPO)
- 并发高(可能是编译优化引发有序性问题)