【Java集合】单列集合Collection常用方法详解

嗨~ 今天的你过得还好吗?
路途漫漫终有一归,
幸与不幸都有尽头。
在上篇文章中,我们简单介绍了下Java 集合家族中的成员,那么本篇文章,我们就来看看 Java在单列集合中,为我们提供的一些方法,以及单列集合的常用遍历玩法,一起来进入学习吧。
在Java基础中我们也学过,在类实现接口后,该类就会将接口中的抽象方法继承过来,此时该类需要重写该抽象方法,完成具体的逻辑。
一、Collection 常用功能
Collection 是所有单列集合的父接口,因此在Collection 中定义了单列集合(List 和 Set)通用的一些方法,这些方法可用于操作所有的单列集合。

1.1 方法如下:

打开api文档,我们可以看到Collection 在 java.util 下,我们通过练习来演示下这些方法的使用:
1.2 方法演示:
public class Demo1Collection {
public static void main(String[] args) {
//创建集合对象
//使用多态的形式 定义
Collection<String> person = new ArrayList<>();
//输出不是一个对象地址,所以说重写了toString 方法
System.out.println(person);
// boolean add(Object o) 向集合中添加一个元素
// 返回值是一个boolean值,一般可以不用接收
person.add("科比");
person.add("姚明");
person.add("库里");
person.add("麦迪");
//添加完我们在输出一下这个集合
System.out.println(person);
// boolean remove(Object o) 删除该集合中指定的元素
// 返回 集合中存在元素,删除元素,返回true;集合中不存在,删除返回false
boolean res1 = person.remove("科比");
boolean res2 = person.remove("奥尼尔");
System.out.println("res1=" +res1);
System.out.println("res2=" +res2);
// boolean isEmpty() 判断该集合是否为空
boolean empty = person.isEmpty();
System.out.println("empty=" + empty);
// boolean contains(Object o) 判断该集合中是否包含某个元素
boolean contains = person.contains("麦迪");
System.out.println("contains=" + contains);
// int size() 获取该集合元素个数
int size = person.size();
System.out.println("size = " + size);
// public Object[] toArray() 把集合总的元素,存储到数组中
Object[] personArray = person.toArray();
for (int i = 0; i < personArray.length; i++) {
System.out.println("数组--" + personArray[i]);
}
// void clear() 删除该集合中的所有元素,但是集合还存在
person.clear();
System.out.println(person);
//通过多态的方式,如果我们把arrayList 换成HashSet,发现也能使用,这就是我们实现接口的好处
}
}
注意:有关Collection中的方法不止上面这些,其他方法可以自行查看API学习。
二、查询集合中的元素-Iterator 迭代器
2.1 Iterator 接口
在程序开发中,经常需要遍历集合中的所有元素,就是要看看里面所有的元素,那我们怎么办呢?

针对这种需求,JDK 专门提供了一个接口: java.util.Iterator。该接口也是 Java集合中的一员,但它与 Collection、Map 接口有所不同,Collection 接口 与 Map 接口 主要用于存储元素,而 Iterator 主要用于迭代访问(即 遍历) Collection中的元素,因为Iterator 对象也被称为迭代器。
下面介绍一下迭代器的概念:
迭代即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种方式专业术语称为迭代。
通过文档,我们可以看到 Iterator 是一个接口,我们无法直接使用,而需要使用Iterator接口的实现类对象,通过Collection接口中的 Iterator()方法,就可以返回迭代器的实现类对象:
- public Iterator iterator(): 获取结合对应的迭代器,用来遍历集合中的元素。
通过API文档,我们可以看到 Collection 中 Itrerator 接口的常用方法如下:
public E next() 返回迭代的下一个元素
public boolean hasNext() 如果仍有元素可以迭代,则返回true

接下来我们通过案例学习,如何使用Iterator 迭代集合中的元素:
/**
* Iterator 迭代器使用
*/
public class Demo1Iterator {
public static void main(String[] args) {
/**
* 使用步骤:
* 1. 使用集合中的方法 iterator() 获取迭代器的实现类对象,使用Iterator接口接收 (使用接口接收返回值,这就是我们说的多态)
* 2. 使用Iterator接口中的方法 hashNext() 判断有没有下一个元素
* 3. 使用Iterator接口中的方法 next() 取出集合中的下一个元素
*
*/
Collection<String> ball = new ArrayList<>();
ball.add("篮球");
ball.add("足球");
ball.add("排球");
ball.add("乒乓球");
//我们来获取一个迭代器,多态
Iterator<String> iterator = ball.iterator();
//判断
boolean b = iterator.hasNext();
System.out.println("是否有元素--" + b);
//取出
String next = iterator.next();
System.out.println("元素--" + next);
//判断
boolean b1 = iterator.hasNext();
System.out.println("是否有元素--" + b1);
//取出
String next1 = iterator.next();
System.out.println("元素--" + next1);
//判断
boolean b2 = iterator.hasNext();
System.out.println("是否有元素--" + b2);
//取出
String next2 = iterator.next();
System.out.println("元素--" + next2);
//判断
boolean b3 = iterator.hasNext();
System.out.println("是否有元素--" + b3);
//取出
String next3 = iterator.next();
System.out.println("元素--" + next3);
//判断
boolean b4 = iterator.hasNext();
System.out.println("是否有元素--" + b4);
//取出
// String next4 = iterator.next();
// System.out.println("元素--" + next4);
//如果没有元素,在取的话,会报一个NoSuchElementException 的错误
/**
*
* 代码优化 上面这些步骤是一个重复的过程,我们可以使用循环来优化,那我们选择哪种来呢
* 我们说 知道元素个数,使用for
* 不知道元素个数,使用while
*
* 那当前我们迭代器的个数,我们不知道,所以使用while循环,而我们的hasNext 就可以作为
* while的条件来判断
*
*/
while (iterator.hasNext()) {
String ballResult = iterator.next();
System.out.println("--优化--" + ballResult);
}
}
}
分析:
在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException 没有集合元素的错误。
2.2 迭代器的实现原理
我们在之前的案例中已经完成了Iterator 遍历集合的整个过程。当遍历集合时,首先通过调用集合的iterator() 方法获得迭代器对象,然后使用hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已经到达集合末尾,停止遍历元素。
Itearator 迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好的理解迭代器的工作原理,接下来通过一个图例来演示 Iterator 对象迭代元素的过程:

在获取迭代器的实现类对象是,会把索引指向集合的-1位置,也就是在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。
当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,
当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,
以此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
三、查询集合中的元素-增强for
3.1 概念
增强for循环(也称为 for each 循环)是JDK5以后出来的一个高级for循环,专门用来遍历数组和集合的。 通过api文档,Collection 继承了一个Iterable 接口 ,而实现这个接口允许对象成为 “foreach” 语句目标,也就是所有的单列集合都可以使用增强for。

它的内部原理其实是个Iterator 迭代器,只是用for循环的方式来简化迭代器的写法,所以在遍历的过程中,不能对集合中的元素进行增删改查操作。
格式:
for (元素类型 元素名 : 集合名或数组) {
访问元素
}
它用于遍历 Collection 和数组。通常只进行遍历元素,不在遍历的过程中对集合元素进行增删操作。
3.2 练习1:遍历数组
public class Demo2Foreach {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for (int i : array) {
System.out.println("--数组元素--" + i);
if (i == 2) {
i = 19;
}
}
//在增强for中修改 元素,并不能赋值
System.out.println(Arrays.toString(array));
}
}
3.3 练习2:遍历集合
public class Demo3Foreach {
public static void main(String[] args) {
Collection<String> ball = new ArrayList<>();
ball.add("篮球");
ball.add("足球");
ball.add("排球");
for (String s : ball) {
System.out.println("---" + s);
}
//相对于Iterator遍历方式,增强for 简化了很多,所以优先使用该方式。
}
}
新for 循环必须有被遍历的目标。目标只能是Collection 或者是数组。仅仅作为遍历操作出现。
总结
本篇中主要介绍了单列集合接口Collection为我们提供的常用接口,也通过代码的方式带大家体会了一下。在后面的内容中为大家介绍了如何把单列集合中的内容查看出来(遍历),通过讲解一些底层的原理,让大家感受了一下迭代器的使用。
编程学习,从云端源想开始,课程视频、在线书籍、在线编程、一对一咨询……你想要的全部学习资源这里都有,重点是统统免费!点这里即可查看
当然集合的遍历不仅仅限于这两种方式,例如java8为我们提供的流式遍历集合,希望大家下去后自己也能搜搜相关的遍历方式,尝试使用一下,ok,本文就到这里了。
【Java集合】单列集合Collection常用方法详解的更多相关文章
- hibernate集合映射inverse和cascade详解
hibernate集合映射inverse和cascade详解 1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...
- 【Java】HashMap源码分析——常用方法详解
上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...
- Java线程创建形式 Thread构造详解 多线程中篇(五)
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...
- java线程池的使用与详解
java线程池的使用与详解 [转载]本文转载自两篇博文: 1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html ...
- $.ajax()常用方法详解(推荐)
AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分.接下来通过本文给大家介绍ajax一些常用方法,大家有需要可以一起学习. 1.url: 要求为String类型的参数 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- Java之Static静态修饰符详解
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
随机推荐
- 【2020GET】即构科技蒋宁波:教育行业客户需求的核心是什么?
11月24日,由即构科技主办的2020GET大会教育科技分论坛在北京成功召开,来自叮咚课堂.小冰.360OS.蕃茄田艺术.即构科技的6位资深教育/科技大咖,在论坛上进行深度分享. 以下为即构科技联合创 ...
- Windows10 下 Neo4j1.5.8 安装教程
前言 Neo4j 是一个高性能的.NOSQL 图形数据库,它将结构化数据存储在网络上而不是表中.基于磁盘的.具备完全的事务特性的 Java 持久化引擎,这里就不把他和常用关系型数据库做对比了.因为篇幅 ...
- DevOps|研发效能治理:进化史、规模化与治理复杂性
麻广广@码猿外 研发效能这个词近几年火遍全网,各大企业都加入了研发效能治理的行列,开始梳理企业内部各个团队的研发流程,以期望找到企业降本增效的方向. 抛开政治因素,研发效能治理我们到底是在谈什么呢?从 ...
- Angular: 点击一次按钮,增加一个元素
解决方案 思路 在组件的typesscript文件中,创建一个数组来存储每个按钮的信息 在模板中使用 *ngFor 指令来循环渲染按钮列表 在按钮事件的处理函数中,每次点击按钮时向按钮数组添加一个新的 ...
- 深度系统安装mysql
# 安装 Mysql 8.0.19下载 MySQL Community Server 8.0.19 [Compressed TAR Archive](mysql-8.0.19-linux-glibc2 ...
- JavaScript中单例模式这样用
如果希望自己的代码更优雅.可维护性更高以及更简洁,往往离不开设计模式这一解决方案. 在JS设计模式中,最核心的思想:封装变化(将变与不变分离,确保变化的部分灵活,不变的部分稳定). 单例模式 那么来说 ...
- 【Nacos篇】Nacos基本操作及配置
官方文档:https://nacos.io/zh-cn/docs/v2/ecology/use-nacos-with-spring-cloud.html 前置条件:SpringCloud脚手架 单机模 ...
- CodeForces 1332E Height All the Same
题意 对于一个\(n*m\)的矩阵,有两种操作 一个格子加二 一个格子和另一个相邻的格子同时加一 通过这两种操作最终使得所有矩阵元素相等 对于矩阵元素来说,有\(L\leq a_{i,j}\leq R ...
- Particles
Smiling & Weeping ----我本想边走边爱,可你一个人就挡住了人山人海 牢骚:其实想明白了也就这么一回事,当时一直想dp,(# ̄- ̄#) 正解:其实题目说的明明白白,任选一个数 ...
- Codeforces Round div.2 C
Smiling & Weeping ----我对姑娘的喜欢,何止钟意二字 题目链接:Problem - C - Codeforces 自我分析:我感觉这是一道很有意义的题目,可以帮我们更好的理 ...