1 集合概述
- 集合又称容器,是为了保存数量不确定或具有映射关系的数据而提供的类。
- Java的集合类主要由
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]
注意:
- 集合中的元素都是引用数据类型,不能是基本数据类型(会自动转为相应对象包装类Integer等)。
- 如果未使用泛型
<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接口常用方法:
- 方式1:Lambda表达式遍历
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);
}
注意:
- Iterator必须依附于Collection对象。(集合的迭代器)
- Iterator迭代、方式3的foreach循环遍历时,不要修改(add、remove…)集合,很可能会引发异常。
- 方式3:foreach循环遍历
for (Integer integer : cIntegers) {
System.out.println("迭代集合元素:"+integer);
}
- Predicate操作集合
- Collection接口的
removeIf(Predicate<? super E> filter)
方法使用了Predicate函数式接口,可使用Lambda表达式:
cIntegers.removeIf(obj-> obj.intValue()==1);
System.out.println(cIntegers); //输出[2, 3, 4]
- 自定义带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()方法的原则与方法: