一、Java集合概述
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供看一些多线程支持的集合类。
java集合类主要由两个接口派生而出:Collection和Map。
- Set和List接口是Collection接口派生的两个子接口,它们分别代表了无序集合和有序集合,Quene是队列,类似于List。
- 所有的Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用于标识集合里的每项元素。
下图为Collection和Map体系的继承树:
二、遍历集合
遍历集合有两种方式:Iterator接口和forEach循环。
Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象被称为迭代器。
(一)使用Lambda表达式
public class CollectionEach
{
public static void main(String [] args)
{
//创建一个集合
Collection books = new HashSet();
books.add("轻量级JavaEE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
//调用forEach()方法遍历集合
books.forEach(obj -> System.out.println("迭代集合元素:"+obj));
}
}
(二)使用Iterator遍历
public class CollectionEach
{
public static void main(String [] args)
{
//创建集合、添加元素的代码和前一个程序相同
...
//获取books集合对应的迭代器
Iterator it=books.iterator();
while(it.hasNext())
{
//it.next()方法返回的数据类型是object类型,因此需要强制类型转换
String book = (String)it.next();
System.out.println(book);
if(book.equals("疯狂Java讲义"))
{
//从集合中删除上一层next()方法返回的元素
it.remove();
}
//对book变量赋值,不会改变集合元素本身
book = "测试字符串";
}
System.out.println(books);
}
}
注意:
- Iterator必须依附于Collection对象,若有一个Iterator集合,则必然有一个与之关联的Collection对象。
- 当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove方法删除上一次next()方法返回的集合元素才可以;否则会引发java.util.ConcurrentModificationException异常。
(三)使用Lambda表达式遍历Iterator
public class CollectionEach
{
public static void main(String [] args)
{
//创建集合、添加元素的代码和前一个程序相同
...
//获取books集合对应的迭代器
Iterator it = books.iterator();
//使用Lambad表达式(目标类型是Comsumer)来遍历集合元素
it.forEachRemaining(obj -> System.out.println("迭代集合元素:"+obj));
}
}
(四)使用forEach循环遍历
public class CollectionEach
{
public static void main(String [] args)
{
//创建集合、添加元素的代码和前一个程序相同
...
for(Object obj:books)
{
String book = (String)obj;
System.out.println(book);
}
System.out.println(books);
}
}
三、操作集合
(一)使用Predicate操作集合
//创建一个集合
Collection books = new HashSet();
books.add("轻量级JavaEE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂IOS讲义");
books.add("疯狂Ajax讲义");
books.add("疯狂Android讲义");
//removeIf(Predicate filter)方法,批量删除符合filter条件的所有元素。
//使用Lambda表达式(目标类型是Predicate)过滤集合
books.removeIf(ele -> ((String)ele).length() < 10);
System.out.println(books);
(二)使用Stream操作集合
//调用builder()类方法创建该Stream对应的Builder
IntStream d=IntStream.builder()
.add(14)
.add(13)
.add(-5)
.add(8)
.build();
//求元素的最大值
d.max().getAsInt();
//求所有元素的总和
d.sum();
//求所有元素的总数
d.count();
//求所有元素的平均值
d.average();
//统计c集合中包含“红色”子串的数量
books.stream().filter(ele->((String)ele).contains("红色")).count();