Java基础(5):Java集合

1 集合概述

  • 集合又称容器,是为了保存数量不确定或具有映射关系的数据而提供的类。
  • Java的集合类主要由CollectionMap两个接口派生而出。
Collection集合体系
Map集合体系

2 Collection接口

  • Collection接口是List、Set和Queue接口的父接口。
  • Collection接口常用方法
Modifier and Type Method Description
int size() 返回集合元素个数
boolean isEmpty() 返回集合是否为空
boolean add(Object o) 向集合添加一个元素
boolean remove(Object o) 删除指定元素o
void clear() 清空集合
boolean contains(Object o) 返回集合是否含指定元素
Iterator iterator() 返回Iterator对象,即迭代器
Collection<Integer> cIntegers = new HashSet<>();
cIntegers.add(1);
cIntegers.add(2);
cIntegers.add(3);
cIntegers.add(4);
System.out.println(cIntegers); //输出 [1, 2, 3, 4]

注意

  1. 集合中的元素都是引用数据类型,不能是基本数据类型(会自动转为相应对象包装类Integer等)。
  2. 如果未使用泛型<Integer>之类,系统默认集合元素为Object类型。
  • 遍历集合元素
    • 方式1:Lambda表达式遍历
      Iterable接口是Collection接口的父接口,它的方法forEach(Consumer<? super T> action)遍历集合时,元素会传给Consumer接口的accept(T t)方法(该接口唯一抽象方法)。
    cIntegers.forEach(obj -> System.out.println("迭代集合元素:"+obj));//创建匿名对象,重写accept方法
    
    • 方式2:Iterator遍历
      Iterator接口常用方法:
Modifier and Type Method Description
boolean hasNext() 返回集合是否还有元素
E next() 返回集合下一个元素
void remove() 删除集合上次next()方法返回的元素
default void forEachRemaining(Consumer<? super E> action) 可用Lambda表达式遍历
Iterator<Integer> it = cIntegers.iterator();  //生成迭代器
while (it.hasNext()) {
	Integer integer = it.next();
	System.out.println("迭代集合元素:"+integer);	
}

注意

  1. Iterator必须依附于Collection对象。(集合的迭代器)
  2. Iterator迭代、方式3的foreach循环遍历时,不要修改(add、remove…)集合,很可能会引发异常。
  • 方式3:foreach循环遍历
for (Integer integer : cIntegers) {
	System.out.println("迭代集合元素:"+integer);
}
  • Predicate操作集合
  1. Collection接口的removeIf(Predicate<? super E> filter)方法使用了Predicate函数式接口,可使用Lambda表达式:
cIntegers.removeIf(obj-> obj.intValue()==1);
System.out.println(cIntegers); //输出[2, 3, 4]
  1. 自定义带Predicate接口参数的方法:
public class PredicateTest2
{
	public static void main(String[] args)
	{
		// 创建books集合
		Collection books = new HashSet();
		books.add(new String("轻量级Java EE企业应用实战"));
		books.add(new String("疯狂Java讲义"));
		books.add(new String("疯狂iOS讲义"));
		books.add(new String("疯狂Ajax讲义"));
		books.add(new String("疯狂Android讲义"));
		// 统计书名包含“疯狂”子串的图书数量
		System.out.println(calAll(books , ele->((String)ele).contains("疯狂")));
		// 统计书名包含“Java”子串的图书数量
		System.out.println(calAll(books , ele->((String)ele).contains("Java")));
		// 统计书名字符串长度大于10的图书数量
		System.out.println(calAll(books , ele->((String)ele).length() > 10));
	}
	public static int calAll(Collection books , Predicate p)
	{
		int total = 0;
		for (Object obj : books)
		{
			// 使用Predicate的test()方法判断该对象是否满足Predicate指定的条件
			if (p.test(obj))
			{
				total ++;
			}
		}
		return total;
	}
}

注意:Consumer接口和Predicate接口都是函数式接口,详情参见Java常见API第10节。

3 Set接口

  • 继承Collection接口。
  • Set不允许包含相同的元素。
  • 新增常用方法
Modifier and Type Method Description
int hashCode() 返回对象的所有元素hashCode值的和

注意:元素的hashCode值决定元素的存储位置。

3.1 HashSet类

  • Set接口的典型实现,Set集合中使用最多的类。
    注意:如果要把某个类(一般指用户自己创建的类)的对象保存到HashSet集合中,需要重写该类的equals()方法和hashCode()方法。
  • 重写hashCode()方法的原则与方法:

猜你喜欢

转载自blog.csdn.net/new_delete_/article/details/84337121