一、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体系的继承树:

java怎么在集合中求和 java集合join_java怎么在集合中求和

java怎么在集合中求和 java集合join_集合类_02

二、遍历集合

遍历集合有两种方式: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();