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

news2024/9/27 15:35:50

零、 关闭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);
        }

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简析内部审计数字化转型的方法和路径

简析内部审计数字化转型的方法和路径 内部审计是一种独立的、客观的确认和咨询活动&#xff0c;包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储&#xff0c;据此再对数据…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(含matlab代码)

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序解决的是一个基于合作博弈的风光氢能源交易的问题&#xff0c;首先&#xff0c;考虑主体间的电能交易建立各主体的优化运行模型&#xff0c; 然后基于纳什谈判理论建立风–光–氢多主体合作运行模型&…

Springboot+vue的高校危化试剂仓储系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校危化试剂仓储系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#x…

(003)SlickEdit Unity的补全

文章目录 步骤XML知识点 附录 步骤 1.下载 unity 源码。 2.将自定义文件 MonoBehaviour.cs 放到解压后的项目里面&#xff1a; using System;namespace UnityEngine {public partial class MonoBehaviour{public virtual void Awake(){throw new NotImplementedException();…

Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目

目录 前言 一、2022年任务书3效果图 二、2022年任务书5效果图 三、2022年国赛正式赛卷 四、2023年国赛第一套样题 五、2023年国赛第二套样题 六、2023年国赛第三套样题 七、2023年国赛第四套样题 八、2023年国赛第七套样题 九、2023年国赛正式赛题&#xff08;第八套…

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 14 天啦&#xff01;学习了 flink 高级特性和新特性之数据类型及 avro 序列化&#xff0c;主要是解决大数据领域数据规范化写入和规范化读取的问题&#xff0c;avro 数据结构可以节约存储空间&#xff0c;本文中结合企业真…

RabbitMQ - 06 - Topic交换机

目录 控制台创建队列与交换机 编写消费者方法 编写生产者测试方法 结果 Topic交换机与Direct交换机基本一致 可参考 这篇帖子 http://t.csdnimg.cn/AuvoK topic交换机与Direct交换机的区别是 Topic交换机接收的消息RoutingKey必须是多个单词&#xff0c;以 . 分割 Topic交…

练习01-登录注册(简单)

一、用户登录/注册实现 综合前面学的知识来实现简单的注册登录功能 1.准备工作 注册登录页面 数据库&#xff0c;数据表 mybatis 坐标引入&#xff0c;MySQL驱动 配置 映射文件 用户实体类 Servlet代码 2.页面 不想手写的可以看博主IT黄大大【带源码】 【炫酷登录界…

贝叶斯优化CNN-GRU回归预测(matlab代码)

贝叶斯优化CNN-GRU回归预测matlab代码 贝叶斯优化方法则采用贝叶斯思想&#xff0c;通过不断探索各种参数组合的结果&#xff0c;根据已有信息计算期望值&#xff0c;并选择期望值最大的组合作为最佳策略&#xff0c;从而在尽可能少的实验次数下达到最优解。 数据为Excel股票…

PostgreSQL数据优化——死元组清理

最近遇到一个奇怪的问题&#xff0c;一个百万级的PostgreSQL表&#xff0c;只有3个索引。但是每次执行insert或update语句就要几百ms以上。经过查询发现是一个狠简单的问题&#xff0c;数据库表死元组太多了&#xff0c;需要手动清理。 在 PG 中&#xff0c;update/delete 语句…

每日五道java面试题之springMVC篇(二)

目录&#xff1a; 第一题. 请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f;第二题. MVC是什么&#xff1f;MVC设计模式的好处有哪些?第三题. 注解原理是什么?第四题. Spring MVC常用的注解有哪些&#xff1f;第五题. SpingMvc中的…

【数据结构初阶 9】内排序

文章目录 &#x1f308; 1. 直接插入排序&#x1f308; 2. 希尔排序&#x1f308; 3. 简单选择排序&#x1f308; 4. 堆排序&#x1f308; 5. 冒泡排序&#x1f308; 6. 快速排序6.1 霍尔版快排6.2 挖坑版快排6.3 双指针快排6.4 非递归快排 &#x1f308; 7. 归并排序7.1 递归版…

用户管理【MySQL】

文章目录 查看用户信息创建用户修改密码删除用户授予权限收回权限 查看用户信息 在名为mysql的数据库中有一个表user维护着 MySQL 的用户信息。 其中&#xff1a; user&#xff1a; 表示该用户的用户名。host&#xff1a; 表示该用户可以从哪个主机登录&#xff0c;localhost…

了解飞行时间传感

简介:测距技术 人类和许多动物利用各种感官来测量与其他物体的距离。视觉是最常用的。在晚上,触觉可以用来感受其他物体的存在——当然触觉对于视障人

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记06_共谋(下)

1. 博弈论 1.1. 当市场竞争对手之间普遍存在着误解和不信任情绪时&#xff0c;从长远来看&#xff0c;他们一半时间是在合作&#xff0c;另一半时间则是在背叛承诺 1.2. 当一方越了解对手&#xff0c;或者说可以更好地掌握对方的战略性行为时&#xff0c;他才可能找到展开合作…

b树(一篇文章带你 理解 )

目录 一、引言 二、B树的基本定义 三、B树的性质与操作 1 查找操作 2 插入操作 3 删除操作 四、B树的应用场景 1 数据库索引 2 文件系统 3 网络路由表 五、哪些数据库系统不使用B树进行索引 1 列式数据库 2 图形数据库 3 内存数据库 4 NoSQL数据库 5 分布式数据…

理解linux进程

基本概念 课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核观点&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体 windows上的进程 由上图可以看出在OS中进程可以同时存在并且非常多 大概理解进程 进程内核task_s…

SpringSecurity两种验证方式及调用流程

一、HttpBasic方式 <security:http-basic/> 二、Formlogin方式 <security:form-login login-page"/userLogin" /> 三、SpringSecurity执行流程

OpenCV的常用数据类型

OpenCV涉及的常用数据类型除包含C的基本数据类型,如&#xff1a;char、uchar&#xff0c;int、unsigned int,short 、long、float、double等数据类型外, 还包含Vec&#xff0c;Point、Scalar、Size、Rect、RotatedRect、Mat等类。C中的基本数据类型不需再做说明下面重点介绍一下…

redisson解决redis服务器的主从一致性问题

redisson解决redis的主节点和从节点一致性的问题。从而解决锁被错误获取的情况。 实际开发中我们会搭建多台redis服务器&#xff0c;但这些服务器分主次&#xff0c;主服务器负责处理写的操作&#xff08;增删改&#xff09;&#xff0c;从服务器负责处理读的操作&#xff0c;…