一、集合概述和分类
1.1 集合的分类
同学们,前面我们已经学习过了arraylist集合,它是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。为了满足不同的业务场景需求,除了arraylist集合以外,java还提供了很多种其他的集合,如下图所示:

我想你的第一感觉是这些集合好多呀!但是,我们学习时会对这些集合进行分类学习,如下图所示:一类是单列集合元素是一个一个的,另一类是双列集合元素是一对一对的。

在今天的课程中,主要学习collection单列集合。collection是单列集合的根接口,也称之为顶层接口,collection接口下面又有两个子接口list接口、set接口,list和set下面分别有不同的实现类,如下图所示:

上图中各种集合的特点如下图所示:

可以自己写代码验证一下,各种集合的特点
public class collectiontest1 {
public static void main(string[] args) {
// 简单确认一下collection集合的特点
collection<string> list1 = new arraylist<>(); //存取顺序一致,可以重复,有索引
list1.add("java1");
list1.add("java2");
list1.add("java1");
list1.add("java2");
system.out.println(list1); //[java1, java2, java1, java2]
collection<string> list2 = new hashset<>(); //存取顺序不一致,不重复,无索引
list2.add("java1");
list2.add("java2");
list2.add("java1");
list2.add("java2");
list2.add("java3");
system.out.println(list2); //[java3, java2, java1]
}
}总结:
1. 单列集合的代表是谁?双列集合的代表是谁?
collection、map
2. collection集合有哪两大常用的集合体系,各自有啥特点?
list系列集合:添加的元素是有序、可重复、有索引。
set系列集合:添加的元素是无序、不重复、无索引。
1.2 collection集合的常用方法
接下来,我们学习一下collection集合的一些常用方法,这些方法所有collection实现类都可以使用。 这里我们以创建arraylist为例,来演示
public class collectiontest2 {
public static void main(string[] args) {
collection<string> c = new arraylist<>();
// 添加元素到集合
c.add("java1");
c.add("java1");
c.add("java2");
c.add("java2");
c.add("java3");
system.out.println(c); //打印: [java1, java1, java2, java2, java3]
// 获取集合的大小
system.out.println(c.size()); //5
// 判断集合中是否包含某个元素
system.out.println(c.contains("java1")); //true
system.out.println(c.contains("java1")); //false
// 删除某个元素,如果有多个重复元素只能删除第一个
system.out.println(c.remove("java1")); //true
system.out.println(c); //打印: [java1,java2, java2, java3]
// 清空集合的元素
c.clear();
system.out.println(c); //打印:[]
// 判断集合是否为空 是空返回true 反之返回false
system.out.println(c.isempty()); //true
// 把集合转换为数组
object[] array = c.toarray();
system.out.println(arrays.tostring(array)); //[java1,java2, java2, java3]
// 如果想把集合转换为指定类型的数组,可以使用下面的代码
string[] array1 = c.toarray(new string[c.size()]);
system.out.println(arrays.tostring(array1)); //[java1,java2, java2, java3]
// 还可以把一个集合中的元素,添加到另一个集合中
collection<string> c1 = new arraylist<>();
c1.add("java1");
c1.add("java2");
collection<string> c2 = new arraylist<>();
c2.add("java3");
c2.add("java4");
c1.addall(c2); //把c2集合中的全部元素,添加到c1集合中去
system.out.println(c1); //[java1, java2, java3, java4]
}
}最后,我们总结一下collection集合的常用功能有哪些,arraylist、linkedlist、hashset、linkedhashset、treeset集合都可以调用下面的方法。

二、collection遍历方式
各位同学,接下来我们学习一下collection集合的遍历方式。有同学说:“集合的遍历之前不是学过吗?就用普通的for循环啊? “ 没错!之前是学过集合遍历,但是之前学习过的遍历方式,只能遍历list集合,不能遍历set集合,因为以前的普通for循环遍历需要索引,只有list集合有索引,而set集合没有索引。
所以我们需要有一种通用的遍历方式,能够遍历所有集合。
2.1 迭代器遍历集合
接下来学习的迭代器就是一种集合的通用遍历方式。就是用来遍历集合的专用方式(数组没有迭代器),在java中迭代器的代表是iterator。
代码写法如下:
public class collectiontest3 {
public static void main(string[] args) {
collection<string> c = new arraylist<>();
c.add("赵敏");
c.add("小昭");
c.add("素素");
c.add("灭绝");
system.out.println(c); // [赵敏, 小昭, 素素, 灭绝]
// 第一步:先获取迭代器对象
// 解释:iterator就是迭代器对象,用于遍历集合的工具
iterator<string> it = c.iterator();
// 第二步:判断当前位置是否有元素可以获取
// 解释:hasnext()方法返回true,说明有元素可以获取;反之没有
while(it.hasnext()){
// 第三步:获取当前位置的元素,然后自动指向下一个元素.
string e = it.next();
system.out.println(e);
}
}
}迭代器代码的原理如下:
- 当调用iterator()方法获取迭代器时,当前指向第一个元素
- hasnext()方法则判断这个位置是否有元素,如果有则返回true,进入循环
- 调用next()方法获取元素,并将当前元素指向下一个位置,
- 等下次循环时,则获取下一个元素,依此内推

最后,我们再总结一下,使用迭代器遍历集合用到哪些方法

2.2 增强for遍历集合
同学们刚才我们学习了迭代器遍历集合,但是这个代码其实还有一种更加简化的写法,叫做增强for循环。
格式如下:

需要注意的是,增强for不光可以遍历集合,还可以遍历数组。接下来我们用代码演示一下:
public class collectiontest4 {
public static void main(string[] args) {
collection<string> c = new arraylist<>();
c.add("赵敏");
c.add("小昭");
c.add("素素");
c.add("灭绝");
system.out.println(c); // [赵敏, 小昭, 素素, 灭绝]
// 1.使用增强for遍历集合
for(string s: c){
system.out.println(s);
}
system.out.println("----------------------");
// 2.再尝试使用增强for遍历数组
string[] arr = {"迪丽热巴", "古力娜扎", "稀奇哈哈"};
for(string name: arr){
system.out.println(name);
}
}
}2.3 foreach遍历集合
在jdk8版本以后还提供了一个foreach方法也可以遍历集合,如果下图所示:

我们发现foreach方法的参数是一个consumer接口,而consumer是一个函数式接口,所以可以传递lambda表达式
public class collectiontest5 {
public static void main(string[] args) {
collection<string> c = new arraylist<>();
c.add("赵敏");
c.add("小昭");
c.add("素素");
c.add("灭绝");
system.out.println(c); // [赵敏, 小昭, 素素, 灭绝]
// 调用foreach方法
// 由于参数是一个consumer接口,所以可以传递匿名内部类
c.foreach(new consumer<string>() {
@override
public void accept(string s) {
system.out.println(s);
}
});
system.out.println("---------------------");
// 也可以使用lambda表达式对匿名内部类进行简化
c.foreach(s -> system.out.println(s)); // [赵敏, 小昭, 素素, 灭绝]
}
}2.4 遍历集合案例
接下来,我们看一个案例,在集合中存储自定义的对象,并遍历。具体要求如下

首先,我们得写一个电影类,用来描述每一步电影应该有哪些信息。
public class movie{
private string name; // 电影名称
private double score; // 评分
private string actor; // 演员
// 无参数构造方法
public movie(){}
// 全参数构造方法
public movie(string name, double score, string actor){
this.name=name;
this.score=score;
this.actor=actor;
}
//...get、set、tostring()方法自己补上..
}接着,再创建一个测试类,完成上面的需求
public class collectiondemo {
public static void main(string[] args) {
collection<movie> movies = new arraylist<>();
movies.add(new movie("《肖申克的救赎》", 9.7, "罗宾斯"));
movies.add(new movie("《霸王别姬》", 9.6, "张国荣、张丰毅"));
movies.add(new movie("《阿甘正传》", 9.5, "汤姆汉克斯"));
for(movie movie : movies){
system.out.println("电影名:" + movie.getname());
system.out.println("评分:" + movie.getscore());
system.out.println("主演:" + movie.getactor());
system.out.println("--------------------");
}
}
}以上代码的内存原理如下图所示:当往集合中存对象时,实际上存储的是对象的地址值

总结:
1、如何获取集合的迭代器对象?
iterator<e> iterator():获取集合对应的迭代器,用来遍历集合中的元素的。
2、增强for可以遍历哪些容器?
既可以遍历集合也可以遍历数组
3、增强for的关键是记住它的遍历格式,它的具体格式是什么样的?
for(元素的数据类型 变量名 : 数组或者集合){
// 在此处使用变量即可, 该变量就是元素
}
4、集合中存储的是元素的什么信息?
集合中存储的是元素对象的地址
到此这篇关于java集合collection与list实例详解的文章就介绍到这了,更多相关java集合collection与list内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论