章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素


一、 集合的概念


存储一个班学员信息,假定一个班容纳20名学员

        当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。

数组有什么缺点?

        数组一旦定义,长度将不能再变化。然而在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。

而我们需要对数据的保存的逻辑可能各种各样,于是就有了各种各样的数据结构。Java中对于各种数据结构的实现,就是我们用到的集合。

集合和数组既然都是容器,它们的区别:

        数组的长度是固定的。集合的长度是可变的。

        数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

二、 集合 API


集合体系概述

        Java的集合框架是由很多接口、抽象类、具体类组成的,都位于java.util包中。

单列集合:一次放进去一个值(对象)

双列集合:键值

三、 Collection 接口


Collection 接口:定义了存取一组对象的方法,其子接口 Set 和 List 分别定义了存储方式:

        ● Set 中的数据对象不可以重复。

        ● List 中的数据对象有顺序(添加顺序)且可以重复。

四、 List 接口及实现类


  List 的实现类

List继承了Collection接口,有三个实现的类

ArrayList :数组列表,数据采用数组方式存储。

LinkedList :链表

Vector :数组列表,添加同步锁,线程安全的

  ArrayList

        • ArrayList 实现

        ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高

        • ArrayList 常用方法

add(E element)   //在数组尾部添加

add(int index , E element)  //在索引处添加

get(int index)   //获得索引处的值

indexOf(Object o)    //返回指定字符在此字符串中第一次一次出现处的索引

lastIndexOf(Object o)    //返回指定字符在此字符串中最后一次出现处的索引

remove(int index)   // 删除并返回指定位置元素

set(int index, E element)    //用于替换动态数组中指定索引的元素

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListDemo1 {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        //添加元素(数组尾部)
        arrayList.add("a");
        arrayList.add(1);
        arrayList.add('b');
        arrayList.add("a");
        arrayList.add(true);
        System.out.println(arrayList);

        //在指定索引处添加元素,其他依次后移
        arrayList.add(1,"new");
        System.out.println(arrayList);

        //获得索引处的元素
        System.out.println("arrayList.get(1) = "+arrayList.get(1));

        //返回指定字符在此字符串中第一次出现处的索引
        System.out.println(arrayList.indexOf("a"));  //0
        //返回指定字符在此字符串中最后一次出现处的索引
        System.out.println(arrayList.lastIndexOf("a"));  //4

        //删除元素(单次)
        arrayList.remove("a");   //通过直接输入删除的值来删
        arrayList.remove(1);   //通过索引来删除
        System.out.println(arrayList);
        arrayList.remove("1");  //数字只能通过索引来删除
        System.out.println(arrayList);
        arrayList.remove("b");  //遇到重复相同的字符串,只会删除第一个
        System.out.println(arrayList);

        //删除元素(指定索引处),其后的依次前移
        arrayList.remove(1);
        System.out.println(arrayList);

        //替换元素(不考虑元素类型)
        arrayList.set( 1,"newNew");
        System.out.println(arrayList);

        //清空元素
        arrayList.clear();
        System.out.println(arrayList);

        //判断是否为空
        System.out.println(arrayList.isEmpty()); //true 

    }
}

         • 易错处

由于ArrayList可以存储任何类型的对象,而遍历时,会默认为Object类型,要使用子类的还要涉及向下转型,既麻烦又不可取。因而Java引入一种泛型( <E> ),用来限制可以输入的对象类型

public class ArrayList<E> extends AbstractList<E>

import java.util.ArrayList;

public class ArrayListDemo3 {
    public static void main(String[] args) {
        /*
        集合容器中默认可以添加Object类型
         */
        //但是不建议,毕竟好进去不好出来
        //因而我们使用 <>泛型 来限定输入的类型
        ArrayList<String> arrayList = new ArrayList();
        arrayList.add("a");
        //arrayList.add(1); //报错



    }
}

  LinkedList

        • LinkedList 实现

LinkedList采用链表存储方式。插入、删除元素时效率比较高

        • LinkedList 常用方法

add(int index , Object element)        //添加

addFirist(Object element)        //头添加

addLast(Object element)        //尾添加

get(int index)        //获得索引元素

removeFirst()       // 返回头元素

removeLast()        //返回尾元素

remove(int index)  //删除并返回索引的元素

getFirst()   //获得头元素

getLast()   //获得尾元素

import java.util.LinkedList;

public class LinkListDemo1 {
    public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("a");
        linkedList.add("b");
        linkedList.add("c");
        System.out.println(linkedList);
        linkedList.add(1,"dd"); //向指定位置插入
        System.out.println(linkedList);
        //获取指定位置上的元素
        System.out.println(linkedList.get(1));

        //删除并返回是否删除成功
        System.out.println(linkedList.remove("a")); 
        System.out.println(linkedList);
        System.out.println(linkedList.pop()); //从这个列表表示的堆栈中弹出一个元素。弹出意味着移除并返回这个列表的第一个元素。
    }
}

  Vector 

 Vector 数组列表,添加同步锁,它是线程安全的

import java.util.Vector;
/*
数组列表,线程安全的
 */
public class VectorDemo {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("a");
        vector.add("b");
        vector.add("c");

    }
}

五、 List接口集合迭代


  for循环遍历

import java.util.ArrayList;
import java.util.Arrays;

public class ListTraverse {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");

        /*
        通过for循环遍历
         */
        for(int i = 0;i<arrayList.size();i++){
            System.out.println(arrayList.get(i));
        }
        System.out.println();
        //for循环时可以修改元素
        for(int i = 0;i<arrayList.size();i++){
            if("a".equals(arrayList.get(i))){
                arrayList.remove(i);
            }
            System.out.println(arrayList.get(i));
        }
        System.out.println();

    }
}

  增强for循环的遍历

import java.util.ArrayList;
import java.util.Arrays;

public class ListTraverse {
    public static void main(String[] args) {

        ArrayList<String> arrayList1 = new ArrayList<>();
        arrayList1.add("a");
        arrayList1.add("b");
        arrayList1.add("c");
        /*
        通过增强for循环遍历
         */
        for(String s:arrayList1){
            System.out.println(s);
        }
        System.out.println();
        //增强for循环时不允许修改元素
        for(String s:arrayList1){
            if(s.equals("a")){
                arrayList1.remove(s);
            }
            System.out.println(s);
        }
    }
}

        注:增强for循环遍历元素时,不允许修改元素(增添或删除)

  迭代器遍历(Iterator)

import java.util.ArrayList;
import java.util.Iterator;

public class ListTraverse1 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("a");
        arrayList.add("b");
        arrayList.add("c");

        /*
        使用迭代器遍历
         */
        //获得集合对象的迭代器对象
        Iterator<String> it = arrayList.iterator();
        while (it.hasNext()){
            String s = it.next();//获取到下一个元素
            System.out.println(s);
        }


        ArrayList<String> arrayList1 = new ArrayList<>();
        arrayList1.add("a");
        arrayList1.add("b");
        arrayList1.add("c");
        Iterator<String> its = arrayList1.iterator();
        while (its.hasNext()){
            String s = its.next();//获取到下一个元素
            if(s.equals("a")){
                its.remove(); //使用迭代器对象删除元素
            }
            System.out.println(s);
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9. 内核、文件系统加载工具

内核、文件系统加载工具 内核、文件系统加载工具是嵌入式开发必备的工具 1. 烧写BootLoader 1.1 通过超级终端方式 烧写 Bootloader 可以使用超级终端的“传送” |“发送文件”命令进入发送文件对话框&#xff0c;使用 Xmodem 协议和 Kermit 协议发送 Bootloader 的各个文件…

《计算机网络》考研:2024/3/9 2.1.7-数据交换方式;2.2-物理层传输介质;2.3-物理层设备

2024/3/9 2.1.7、2.2、2.3 2.1.7 数据交换方式 电路交换存储转发方式 报文交换分组交换&#xff1a; 数据报方式虚电路方式 电路交换 报文交换 分组交换 2.2 物理层传输介质 物理层的主要任务 物理层设备 中继器&#xff1a; 集线器&#xff08;多口中继器&#xff09;…

如何获取用户请求的真实ip,并返回访问者的ip地理位置?node,vue

一、获取真实IP 方式1、前端调用免费公共接口获取 前端获取访问者的真实的外网ip,可以通过调用接口https://api.ipify.org/来获取。你也可以直接在网页上访问它来看自己的外网ip。 ipify介绍&#xff1a; ipify是一个免费的公共 API&#xff0c;用于获取设备的公共 IP 地址。…

Claude3横空出世:颠覆GPT-4,Anthropic与亚马逊云科技共启AI新时代

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

exceljs解析和生成excel文件

安装 npm install exceljs解析excel 通过 Workbook 的 readFile 方法可以拿到workbook对象, workbook对象包含的概念有 worksheet(工作表) --> row(行) --> cell(单元格).于是可以通过依次遍历 worksheet, row, cell来拿到单元格的数据直接通过 worksheet.getSheetValue…

从零学习Linux操作系统 第三十五部分 Ansible中的角色

一、理解roles在企业中的定位及写法 #ansible 角色简介# Ansible roles 是为了层次化&#xff0c;结构化的组织Playbookroles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中&#xff0c;并可以便捷地include它们roles一般用于基于主机构建服务的场景中&…

Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费

证书准备&#xff1a;springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换&#xff0c;因为kafka里面是jks 需要通过openssl进行转换。 证书处理&#xff1a; KeyStore 用于存储客户端的证…

Java多线程实战-实现多线程文件下载,支持断点续传、日志记录等功能

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 1 基础知识回顾 1.1 线程的创建和启动 1.2 线程池的使用 2.运行环境说…

k8s架构浅析

Node 节点&#xff08;物理主机或虚拟机&#xff09;&#xff0c;它们共同组成一个分布式集群&#xff0c;并且这些节点中会有一个 Master 节点&#xff0c;由它来统一管理 Node 节点。 Pod &#xff0c;在 K8S 中&#xff0c;Pod 是最基本的操作单元&#xff0c;它与 docker …

Linux之selinux详解

华子目录 概念作用selinux与传统的权限区别selinux工作原理名词解释主体&#xff08;subject&#xff09;目标&#xff08;object&#xff09;策略&#xff08;policy&#xff09;&#xff08;多个规则的集合&#xff09;安全上下文&#xff08;security context&#xff09; 文…

三栏布局的实现方法

1. 什么是三栏布局 常见的一种页面布局方式&#xff0c;将页面分为左栏、中栏和右栏左右两侧的盒子宽度固定&#xff0c;中间的盒子会随屏幕自适应一般中间放主体内容&#xff0c;左右两边放辅助内容 2. 如何实现三栏布局 2.1 弹性布局 将最外层盒子设为弹性布局&#xff0…

练习题-14

问题&#xff1a;已知函数 f : R → R f: \mathbb{R} \to \mathbb{R} f:R→R满足 f ( x y ) − f ( x − y ) f ( x ) f ( y ) , ∀ x , y ∈ R . f(xy)-f(x-y)f(x)f(y), \forall x, y \in \mathbb{R}. f(xy)−f(x−y)f(x)f(y),∀x,y∈R. 求 f f f. 提示&#xff1a;如果 f …

基于PBS向超算服务器队列提交任务的脚本模板与常用命令

本文介绍在Linux服务器中&#xff0c;通过PBS&#xff08;Portable Batch System&#xff09;作业管理系统脚本的方式&#xff0c;提交任务到服务器队列&#xff0c;并执行任务的方法。 最近&#xff0c;需要在学校公用的超算中执行代码任务&#xff1b;而和多数超算设备一样&a…

基于美洲狮优化算法(Puma Optimizar Algorithm ,POA)的无人机三维路径规划(提供MATLAB代码)

一、无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化飞行…

第十五届蓝桥杯模拟考试III_物联网设计与开发

编程题 一、基本要求 使用大赛组委会提供的四梯/国信长天物联网省赛套装&#xff08;基于STM32L071KBU微控制器设计&#xff09;&#xff0c;完成本试题的程序设计与调试。程序编写、调试完成后&#xff0c;选手需提交两个LoRa终端对应的hex文件&#xff0c;LoRa终端A对应的文…

【Week Y1】调用官方权重进行检测

YOLO白皮书之调用官方权重进行检测 一、下载yolo-v5s源码&#xff0c;并配置编译环境二、输入本地图片查看检测结果三、输入本地视频查看检测结果 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项…

C++学习随笔(2)——引用与函数

经过上章对C有了一个初步认识后&#xff0c;本章我们来学习一下C的一些与C语言不同的新玩样引用&#xff0c;还有C的函数规则。 目录 1. 引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 &#xff08;1&#xff09; 做参数 &#xff08;2&#xff09; 做返回值…

基于YOLOv8深度学习的路面坑洞检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

计算机设计大赛 目标检测-行人车辆检测流量计数

文章目录 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 行人车辆目标检测计数系统 …

服务器-->网站制作-->接口开发,一篇文章一条龙服务(2)

作者&#xff1a;q: 1416279170v: lyj_txd前述&#xff1a;本人非专业&#xff0c;兴趣爱好自学自研&#xff0c;很多没有说清楚的地方见谅&#xff0c;欢迎一起讨论的小伙伴~ 上期回顾&#xff0c;了解 服务器&#xff0c;网站制作&#xff0c;接口开发之见的关系&#xff0c…