1、集合的概述
1.1定义:
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他的数据,所有的集合类都位于java.util
包下。
1.2集合与数组的区别:
数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象。
1.3集合的组成:
Java集合类主要是由两个接口派生而出的:Collection
和Map
,它们两是Java集合框架的跟接口,这两个接口又包含了一些子接口或实现类,其中所有的Map
实现类用于保存具有映射关系的数据,如图:
根据上图,可以把Java所有集合分成三大类:
Set
:无序、不可重复
List
:像一个数组,可以记住每次添加元素的顺序、且List
的长度可变。访问`List集合中的元素,可以直接根据元素的索引来访问。
2、Collection
和Iterator
接口
1、Collection
是List
、Set
、Queue
接口的父接口
2、Collection
实现类都重写了toString()
方法:
当使用System.out
的println()
方法来输出集合对象时,将输出[elel,ele2…]的形式
3、使用Java8增强的Iterator
接口遍历集合元素 Iterator
接口也是Java集合框架的成员,但它与Collection
系列、Map
系列的集合不一样:Collection
系列集合、Map
系列集合主要用于盛装其他对象,而Iterator
则主要用于遍历(即迭代访问)Collection
集合中的元素,Iterator
对象也破称为迭代器。
Iterator
接口隐藏了各种Collection
实现类的底层细节,向应用程序提供了遍历Collection
集合元素的统一编程接口。Iterator
接口里定义了如下4个方法。
boolean
hasNext()
:如果被迭代的集合元素还没有被遍历完,则返回true
Object
next()
:返回集合里的下一个元素。
void`` remove()
:删除集合里上一次next方法返回的元素。
void
forEachRemaining(Consumer action)
:这是Java8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。
利用Iterator
来遍历集合,代码示例:
public class IteratorTest
{
public static void main(String[] args)
{
// 创建集合、添加元素的代码与前一个程序相同
Collection books = new HashSet();
books.add("轻量级Java EE企业应用实战");
books.add("疯狂Java讲义");
books.add("疯狂Android讲义");
// 获取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);
}
}
tisp:
Iterator
必须依附于Collection
对象,若有一个Iterator
对象,则必然有一个与之关联的Collection
对象。Iterator
提供了两个方法来迭代访问Collection
集合里的元素,并可通过remove()
方法来删除集合中上一次next()
方法返回的集合元素。
4、Iterator
遍历集合时,是把集合元素的值传给了迭代变量,并不是把集合元素的本身传给了迭代变量。
5、用Iterator
迭代访问集合元素时,Collection
集合里的元素不能被改变,从而可以避免共享资源而引发的潜在问题。
当使用Iterator
迭代访问Collection
集合元素时,Collection
集合里的元素不能被改变,只有通过Iterator
的 remove()
方法删除上一次next()
方法返回的集合元素才可以;否则将会引发java.util.ConcurrentModificationException
异常。
6、使用foreach循环遍历集合元素
- foreach循环遍历时,也只是把集合元素的只符给了迭代变量,而不是集合元素本身。
- 当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则也会报错。
7、使用Java8新增的Predicate操作集合
涉及到就是removeIf(Predicate filter)方法,该方法会删除符合filter条件的所有元素。
代码示例:
public class PredicateTest
{
public static void main(String[] args)
{
// 创建一个集合
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讲义"));
// 使用Lambda表达式(目标类型是Predicate)过滤集合 删除长度小于10的字符串
books.removeIf(ele -> ((String)ele).length() < 10);
System.out.println(books);
}
}