Java-单列集合Collection详解

2024-04-21 19:20

本文主要是介绍Java-单列集合Collection详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、单列集合

单列集合一次只能添加一个元素

Collection是顶层父类接口

List系列集合:

添加的元素是有序、可重复、有索引的,其中有序指的是存和取得顺序一致(e.g:我存进去的是1,2,3,取出来的是1,2,3),重复指的是集合中存储的元素是可以重复的,有索引指的是我们可以通过索引获取每一个元素。

Set系列集合:

添加的元素是无序、不重复、无索引的,其中无序指的是存和取得顺序可能不一致(e.g:我存进去的是1,2,3,取出来的可能是3,1,2),不重复指的是集合中存储的元素是不可以重复的,无索引指的是我们不可以通过索引获取每一个元素。

二、单列集合之Collection的概念

Collection是单列集合的祖宗接口(顶层父接口),它的功能是全部单列集合都可以使用的。

三、单列集合之Collection创建集合

Collection是接口 不能直接创建集合对象,但是可以通过该接口的具体类来创建集合对象,在Java中,一个对象变量可以引用任何实现了特定接口的类的实例(比如下面例子中的coll),这是java中多态的作用,你可以通过接口来引用任何实现了该接口的类的实例,从而增加了代码的灵活性和可维护性。因为你可以轻松地改变 coll 背后使用的实现类,而不需要修改所有使用 coll 的代码。例如,你可以将 new ArrayList<>() 替换为 new LinkedList<>() 或其他任何实现了 Collection 接口的类的实例,而无需修改其他代码。

e.g:  Collection<Integer> coll=new ArrayList<>();

通过ArrayList实现类创建集合

四、单列集合之Collection的常用方法

注意:Collection是接口,在使用它的方法时,不能创建它的对象,要创建它的实现类,通过它的实现类来使用接口的方法

1、添加元素

语法:集合名称.add(元素);

当往List系列添加元素时,返回值永远是true,因为List可以添加重复元素

当往Set系列添加元素时,当该元素已经在集合中存在时,那么返回值是false,当该元素集合中没有存在时,那么返回值是true,因为Set不可以添加重复元素

import java.util.ArrayList;
import java.util.Collection;public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]}
}

2、清空集合

语法:集合名称.clear();

当往List系列添加元素时,返回值永远是true,因为List可以添加重复元素

当往Set系列添加元素时,当该元素已经在集合中存在时,那么返回值是false,当该元素集合中没有存在时,那么返回值是true,因为Set不可以添加重复元素

import java.util.ArrayList;
import java.util.Collection;public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]//2.清空//清空集合所有的元素coll.clear();System.out.println(coll);// []}
}

3、删除元素

语法:集合名称.remove(元素);

当要删除的元素在集合中存在时,那么返回值是true,当该元素集合中没有存在时,那么返回值是false

Collection 接口没有提供按索引删除元素的方法。Collection 接口定义的方法都是基于元素的,而不是基于索引的。

import java.util.ArrayList;
import java.util.Collection;public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]// 2.删除// 删除成功返回true 删除失败返沪falseboolean r3=coll.remove("abc");System.out.println(r3);// trueSystem.out.println(coll);// [efg]boolean r4=coll.remove("aaa");System.out.println(r4);// falseSystem.out.println(coll);// [efg]}
}

4、判断集合是否包含该元素

语法:集合名称.contains(元素);

当要元素在集合中存在时,那么返回值是true,当该元素集合中没有存在时,那么返回值是false

细节:它的底层逻辑是通过equals方法进判断的,因此当集合存储的元素是对象时,也想通过

contains判断该对象是否存在时,需要重写JavaBean的contains方法

import java.util.ArrayList;
import java.util.Collection;public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]// 2.判断元素是否包含boolean r3=coll.contains("aaa");System.out.println(r3);// falseboolean r4=coll.contains("abc");System.out.println(r4);// true}
}

5、判断集合是否为空

语法:集合名称.isEmpty();

import java.util.ArrayList;
import java.util.Collection;public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]// 2.判断元素是否为空boolean r3=coll.isEmpty();System.out.println(r3);// false}
}

6、获取集合的长度

语法:集合名称.size();

public class test1 {public static void main(String[] args) {// 生成一个coll变量 它的类型是Collection 表示一组元素 其元素类型必须是StringCollection<String> coll=new ArrayList<>();// 1.添加// 返回值为布尔类型boolean r1= coll.add("abc");System.out.println(r1);// trueSystem.out.println(coll);// [abc]boolean r2= coll.add("efg");System.out.println(r2);// trueSystem.out.println(coll);// [abc, efg]// 2.判断元素是否为空int r3=coll.size();System.out.println(r3);// 2}
}

五、单列集合之Collection的遍历方式

Collection的遍历方式有三种,迭代器遍历、增强for遍历、lamda表达式遍历,没有普通的for循环遍历,因为普通的for循环遍历需要通过索引遍历,而set没有索引,因此没有普通的for循环遍历

1、迭代器遍历

迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式

step1:Collection获取迭代器的方式是Iterator<集合元素类型>迭代器名称=集合名称.Iterator();

  • Iterator 是Java集合框架中的一个接口,它提供了一种遍历集合元素的方式。
  • <String> 是一个泛型参数,它指定了这个迭代器将用于遍历包含String类型元素的集合。

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

step2:迭代器对象名称.hasnext();用来判断当前位置是否存在元素,如果存在则返回true,如果不存在则返回false

step3:迭代器对象名称.next();用来获取当前位置的元素,并将迭代器指向下一个位置

通过这三种方法 我们就可以遍历集合

语法:

Iterator<集合元素类型>迭代器名称=集合名称.Iterator();

while(迭代器对象名称.hasnext()){

        System.out.println(迭代器对象名称.next());

}

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.创建迭代器对象Iterator<String> it=coll.iterator();// 3.迭代器遍历集合while (it.hasNext()){System.out.println(it.next());}// 文韬// 黄子弘凡// 何运晨}
}

注意点:

①迭代器遍历完毕,指针不会复位

如果想要遍历第二次 就要生成新的迭代器对象

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.创建迭代器对象Iterator<String> it=coll.iterator();// 3.迭代器遍历集合while (it.hasNext()){System.out.println(it.next());}// 文韬// 黄子弘凡// 何运晨// 迭代器遍历完毕,指针不会复位// 以下结果都是false 因为遍历完集合 指针指向没有元素的位置 而且不会复原System.out.println(it.hasNext());// falseSystem.out.println(it.hasNext());// falseSystem.out.println(it.hasNext());// falseSystem.out.println(it.hasNext());// falseSystem.out.println(it.hasNext());// false// 遍历第二次// 需要生成新的迭代器对象Iterator<String> it2=coll.iterator();while (it2.hasNext()){System.out.println(it2.next());}// 文韬// 黄子弘凡// 何运晨}}
}

②循环中只能使用一次next方法

如果在循环中使用多次next方法就可能出现该位置没有元素的情况

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.创建迭代器对象Iterator<String> it=coll.iterator();// 3.迭代器遍历集合while (it.hasNext()){System.out.println(it.next());System.out.println(it.next());}// 文韬// 黄子弘凡// 何运晨// 报错:NoSuchElementException}
}

③迭代器遍历时,不能用集合的方式进行增加或删除,必须用迭代器的方法进行删除

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.创建迭代器对象Iterator<String> it=coll.iterator();// 3.迭代器遍历集合while (it.hasNext()){System.out.println(it.next());// 通过迭代器的remove方法删除元素it.remove();// 如果不输出当前元素的值 而是直接删除当前元素的值并将指针下移 就会报错}// 4.输出集合中的元素System.out.println(coll);}
}

④当迭代器遍历完之后再次使用 迭代器对象名称.next()就会报错

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class 迭代器遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.创建迭代器对象Iterator<String> it=coll.iterator();// 3.迭代器遍历集合while (it.hasNext()){System.out.println(it.next());}// 文韬// 黄子弘凡// 何运晨// 当迭代器遍历完之后再次使用 迭代器对象名称.next()就会报错System.out.println(it.next());// NoSuchElementException 表示不存在这个元素}
}

迭代器总结:

1、迭代器遍历不需要依赖索引,它是通过创建指针并移动指针来遍历集合中的元素

2、迭代器需要掌握的三种方法

Iterator<集合元素类型>迭代器名称=集合名称.Iterator();

迭代器对象名称.hasnext();

迭代器对象名称.next();

2、增强for遍历

增强for的底层就是迭代器,是为了简化迭代器的代码书写的

所有的单列集合和数组才能用增强for进行遍历

语法:

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

}

其中变量名存储的内容就是遍历过程中的每一个元素

import java.util.ArrayList;
import java.util.Collection;public class 增强for遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.增强for循环遍历// String表示遍历元素的类型 s用来存储遍历的每一个元素 coll表示遍历的集合名称for(String s:coll){System.out.println(s);// 遍历过程中的每一个元素}// 文韬// 黄子弘凡// 何运晨}
}

注意:当修改变量名存放的内容时,并不会修改集合的内容

import java.util.ArrayList;
import java.util.Collection;public class 增强for遍历 {public static void main(String[] args) {// 1.创建集合并添加元素Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("何运晨");// 2.增强for循环遍历// String表示遍历元素的类型 s用来存储遍历的每一个元素 coll表示遍历的集合名称// 修改变量s的内容并不会改变集合的内容for (String s : coll) {s="aaa";}System.out.println(coll);// 文韬// 黄子弘凡// 何运晨// 输出结果不会变成:// aaa// aaa// aaa}
}

生成增强for语句的快捷方式:

遍历的集合名称.for并回车即可生成

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

}

3、lamdba表达式遍历

语法:

Collection<遍历元素的数据类型> 集合对象名称=new ArrayList<>();

集合对象名称.forEach(s->System.out.println(s));

step1:生成集合对象     e.g: Collection<Integer> coll=new ArrayList<>();

step2:通过集合对象使用forEach方法 ,方法中写变量加上->输出元素的语句

  e.g:coll.forEach(s-> System.out.println(s));

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class lamdba遍历 {public static void main(String[] args) {Collection<String> coll=new ArrayList<>();coll.add("文韬");coll.add("黄子弘凡");coll.add("曹恩齐");// forEach是Iterable接口的默认方法 用于遍历集合中的每个元素 并对每个元素执行一个给定的操作// Collection接口拓展了Iterable接口,因此所有实现Collection接口的类也实现了Iterable接口// 因此实现Collection接口的对象coll也可以使用Iterable接口的方法forEach// forEach需要传入Consumer接口 当方法的参数是接口时 在调用方法时需要传递接口的实现类// 生成Consumer实现类的对象// 由于Consumer接口只有一个抽象方法 其实现类是函数式接口的匿名内部类 可以使用lamdba表达式简化// 简化lamdba表达式// 1.简化前coll.forEach(new Consumer<String>(){@Overridepublic void accept(String s){System.out.println(s);}});/*文韬黄子弘凡曹恩齐*/// 2.简化后coll.forEach( s-> System.out.println(s));/* 文韬黄子弘凡曹恩齐*/}
}

六、补充知识:lambda表达式简化接口的匿名形式

函数式编程:忽略面向对象的复杂语法,强调做什么而不是谁去做,做什么强调的是重写方法的形参类型、方法体、return返回值

语法:

()->{

}

其中()对应着重写方法的形参   ->是固定格式   {}对应着方法的方法体

简化规则:

1、参数类型可以省略不写

简化前:

简化后:

2、当只有一个参数时,参数类型可以省略不写,同时()也可以省略不写

3、如果lamdba表达式的方法体只有一行,那么大括号、分号、return可以省略不写,要省略需同时省略,不能只省略大括号、分号、return中的一部分

简化前:

简化后:

注意:

1、lambda表达式可以用来简化匿名内部类的书写

2、lambda表达式只能简化函数式接口的匿名内部类,其中函数式接口指的是有且仅有一个抽象方法的接口(只能是接口不能是抽象类),接口上方可以加@FuctionInterface注解来检验

e.g1:

e.g2:

简化前:

简化后:

七、单列集合之Collection的知识总结

这篇关于Java-单列集合Collection详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923851

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听