通过之前对 JAVA基础 —— 集合 的学习,我们对于集合的概念以及ArrayList都有了初步的了解。

接下来我们将整体的了解集合的体系结构。


目录

一、 Collection常用方法

二、 Collection的通用遍历方式

1.  迭代器遍历

1.1 Collection集合获取迭代器

1.2 Iterator中常用方法

 2.  增强for遍历

2.1 增强for的细节

3. Lambda表达式遍历 


集合体系结构:

Collection

单列集合

每次只能添加一个元素

Map

双列集合

每次在添加数据的时候,添加的是一对两个元素

Collection单列集合:

Collection是单列集合中的祖宗接口,它的功能是全部单列集合都可以继承使用的,所有的方法可以被List和Set系列集合共享。

java list toList后如何还原 java list collect_List

List系列结合:添加的元素是有序、可重复、有索引。

  •  有序:存和取的顺序是有序的。
  • 可重复:集合中存储的元素是可重复的。
  • 有索引:可以通过索引获取集合中每一个元素。


Set系列集合:添加的元素是无序、不重复、无索引。

  • 无序:存和取的顺序不一定是相同的。
  • 不重复:集合中存储的元素是不可以重复的。
  • 无索引:不能通过索引获取Set集合中每一个元素。

一、 Collection常用方法

方法名称

说明

public boolean add

把给定的对象添加到当前集合中

public void clear

清空集合中所有的元素

public boolean remove

把给定的对象在当前集合中删除

public boolean contains (object  obj )

判断当前集合中是否包含给定的对象

public boolean isEmpty

判断当前集合是否为空

public int size

返回集合中元素的个数/集合的长度

public class CollectionTest {
	public static void main(String[] args) {
		// 注意:Collection是一个接口
		// 不能直接创建对象 只能创建他实现类对象
		// 实现类:ArrayList

		// 为了学习Collection接口方法
		// 平常代码还是按照之前方法创建对象
		Collection<String> coll = new ArrayList<>();

		// 1.添加元素
		// 细节: 添加返回值true/false
		// 如果我们要将List系列集合添加永远为true : List集合中元素可重复
		// 如果我们要将Set系列集合添加不一定true
		// 如果当前添加元素不存在,方法返回true ;如果添加元素已经存在, 方法返回false
		// 因为Set系列集合不允许重复
		coll.add("aaa");
		coll.add("bbb");
		System.out.println(coll); // [aaa,bbb]

		// 2.删除元素
		// 因为Collection定义的是共性方法,不能通过索引进行删除
		// 所以只能通过元素对象进行删除
		coll.remove("aaa");
		System.out.println(coll); // [bbb]

		// 3.判断元素是否包含
		// 细节:底层依靠equals方法进行判断是否包含
		// 所以,如果集合中存储的自定义对象,也想通过contains方法进行判断
		// 那么就必须在javabean类中,一定要重写equals方法
		boolean result = coll.contains("aaa");
		System.out.println(result); // false

		// 判断是否为空
		boolean result1 = coll.isEmpty();
		System.out.println(result1); // fasle

		// 获取长度
		int size = coll.size();
		System.out.println(size); // 1

		// 清空
		coll.clear();
		System.out.println(coll); // []
	}
}

二、 Collection的通用遍历方式

  1. 迭代器遍历
  2. 增强for遍历
  3. Lambda表达式遍历

之前学习的普通For遍历为什么没有呢?

因为Collection集合体系中Set分支没有索引,所以不能通过索引进行遍历,进而不能欧诺个普通for循环进行遍历。

1.  迭代器遍历

  • 迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式。
  • 迭代器不依赖索引

1.1 Collection集合获取迭代器

方法名称

说明

Iterator<Element> Iterator()

返回迭代器对象,默认指向当前集合的 0 索引。

1.2 Iterator中常用方法

方法名称

说明

boolean hasNext

判断当前位置是否有元素,有元素返回true ,没有元素返回false

Element next

获取当前位置的元素,并将迭代器对象移向下一个位置。

public class CollectionTest {
	public static void main(String[] args) {
		// 1.创建集合添加对象
		Collection<String> coll = new ArrayList<>();
		coll.add("aaa");
		coll.add("ccc");
		coll.add("bbb");
		coll.add("ddd");

		// 2.获取迭代器对象
		// 迭代器就还像是一个箭头,默认指向集合的0索引处
		Iterator<String> it = coll.iterator();

		// 3.利用循环获得集合中每一个元素
		while (it.hasNext()) {
			// 4.next方法两件事情:获取元素 移动指针
			String str = it.next();
			System.out.println(str);
		}
	}
}

细节注意点:

  1. 报错NoSuchElementExce (如果当前位置没有元素,还要强行获取)
  2. 迭代器遍历完毕,指针不会复位
  3. 循环中只能用一次next方法
  4. 迭代器遍历时,不能用集合的方法进行增加或者删除

 2.  增强for遍历

  • 增强for的底层就是迭代器,是为了简化迭代器的代码书写的。
  • 它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
  • 所有的单列集合和数组才能用增强for进行遍历。

格式:

for(元素的数据类型 变量名 : 数组或者集合){
}

java list toList后如何还原 java list collect_迭代器_02

public class CollectionTest {
	public static void main(String[] args) {
		// 1.创建集合添加对象
		Collection<String> coll = new ArrayList<>();
		coll.add("zhangsan");
		coll.add("lisi");
		coll.add("wangwu");
		
		//2.利用增强for进行遍历
		//细节:
		//s: 其实就是一个第三方变量 在循环的时候依次表示集合中每一个数据
		for (String s : coll) {
			System.out.print(s + ","); //zhangsan,lisi,wangwu,
		}
	}
}

2.1 增强for的细节

  • 修改增强for中的变量,不会改变集合中原本的数据。

java list toList后如何还原 java list collect_System_03

s只是第三方变量

java list toList后如何还原 java list collect_List_04

修改的也只是第三方变量的值

3. Lambda表达式遍历 

得益于JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

方法名称说明default void forEach结合lambda遍历集合

public class CollectionTest {
	public static void main(String[] args) {
		// 1.创建集合添加对象
		Collection<String> coll = new ArrayList<>();
		coll.add("zhangsan");
		coll.add("lisi");
		coll.add("wangwu");

		// 2.利用匿名内部类的形式
		// forEach底层原理:
		// 其实也会自己遍历集合,依次得到每一个元素
		// 把得到的每一个元素,传递给下面的accept方法
		coll.forEach(new Consumer<String>() {
			@Override
			// s依次表示集合中的每一个数据
			public void accept(String s) {
				System.out.println(s);
			}
		});

		// Lambda表达式进行遍历
		// () -> {]
		// (String s) 形参数据类型可以省略
		// 只要一个字符 ()可以省略
		// 方法体只有一行 大括号可以省略 return可以省略 分号;可以省略
		// coll.forEach((String s) -> {
		// System.out.println(s);
		// });
		coll.forEach(s -> System.out.println(s));
	}
}