Java集合的概述
集合可以说时一个容器,一个不确定的数组,集合类主要负责保存丶盛装其他数据,所以也称为容器类.
Java中的集合类主要由两个接口派生.
Collection接口
这个接口和Collections是有区别,不要弄混淆了.
Map接口
Lamda集合
lamda是一个Java8的新特性,将函数作为参数传入方法中,有许多便利,对与集合也是一样,可以使用lambda来遍历集合.
上代码
import java.util.ArrayList;
import java.util.Collection;
public class CollectionEachByLambda {
public static void main(String[] args) {
//随意创建一个集合
Collection c = new ArrayList();
c.add("aaaaaa");
c.add("bbbbbbbbbbb");
c.add("cccccccccccccccc");
c.forEach(obj -> System.out.println(obj));
}
}
控制台打印结果
aaaaaa
bbbbbbbbbbb
cccccccccccccccc
Iterator
Iterator接口也是Java集合框架的成员,但它与Collection和Map不一样,它主要用与迭代对象,也被称为迭代器.
Iterator本身并没有盛装对象的能力,如果要创建Iterator,必须要有一个被迭代的集合,所以Iterator必须依附与Collection,也就是说若有一个Iterator必然会有一个对应的Collection.
使用Iterator对象迭代代码如下
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionEachByIterator {
public static void main(String[] args) {
//随意创建一个集合
Collection c = new ArrayList();
c.add("aaaaaa");
c.add("bbbbbbbbbbb");
c.add("cccccccccccccccc");
//创建迭代器
Iterator it = c.iterator();
//it.hasNext()如果被迭代的集合还有数据,返回true
while(it.hasNext()) {
//返回集合的下一元素,返回的类型为Object,若其他类型需要强转
Object o = it.next();
System.out.println(o);
}
}
}
注意
当Iterator访问集合元素的时候,Collcetion中的元素不能被改变,只有通过Iterator中的所提供的方法才可以,否则会引发,java.util.ConcurrentModificationException异常,如下:
import java.util.Collection;
import java.util.Iterator;
public class CollectionEachByIterator {
public static void main(String[] args) {
//随意创建一个集合
Collection c = new ArrayList();
c.add("aaaaaa");
c.add("bbbbbbbbbbb");
c.add("cccccccccccccccc");
//创建迭代器
Iterator it = c.iterator();
//it.hasNext()如果被迭代的集合还有数据,返回true
while(it.hasNext()) {
//返回集合的下一元素,返回的类型为Object,若其他类型需要强转
Object o = it.next();
System.out.println(o);
if(o.equals("aaaaaa")) {
//删除元素
c.remove("aaaaaa");
}
}
}
}
控制台信息:
Exception in thread "main" aaaaaa
java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.base/java.util.ArrayList$Itr.next(Unknown Source)
at 集合.CollectionEachByIterator.main(CollectionEachByIterator.java:20)
若是将程序设计为it.remove(),不会引发异常,但这是不可取的,对于其他集合,迭代时删除都会导致异常,例如HashSet,ArrayList等,只有删除特定的元素时,才不会报异常.
使用Lambda遍历Iterator
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class EachIteratorByLambda {
public static void main(String[] args) {
//随意创建一个集合
Collection c = new ArrayList();
c.add("aaaaaa");
c.add("bbbbbbbbbbb");
c.add("cccccccccccccccc");
//创建迭代器
Iterator it = c.iterator();
//使用lambda
it.forEachRemaining(obj -> System.out.println("打印的信息"+obj));
}
}
使用foreach迭代
同样,也不能在迭代时更改元素,将会引发java.util.ConcurrentModificationException
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class EachByForeach {
public static void main(String[] args) {
//随意创建一个集合
Collection c = new ArrayList();
c.add("aaaaaa");
c.add("bbbbbbbbbbb");
c.add("cccccccccccccccc");
for(Object o : c) {
System.out.println(o);
}
}
}