Java基础(5):Java集合

1 集合概述

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

2 Collection接口

  • Collection接口是List、Set和Queue接口的父接口。
  • Collection接口常用方法
Modifier and TypeMethodDescription
intsize()返回集合元素个数
booleanisEmpty()返回集合是否为空
booleanadd(Object o)向集合添加一个元素
booleanremove(Object o)删除指定元素o
voidclear()清空集合
booleancontains(Object o)返回集合是否含指定元素
Iteratoriterator()返回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 TypeMethodDescription
booleanhasNext()返回集合是否还有元素
Enext()返回集合下一个元素
voidremove()删除集合上次next()方法返回的元素
default voidforEachRemaining(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 TypeMethodDescription
inthashCode()返回对象的所有元素hashCode值的和

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

3.1 HashSet类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值