【进阶篇-Day9:JAVA中单列集合Collection、List、ArrayList、LinkedList的介绍】

目录

  • 1、集合的介绍
    • 1.1 概念
    • 1.2 集合的分类
  • 2、单列集合:Collection
    • 2.1 Collection的使用
    • 2.2 集合的通用遍历方式
      • `2.2.1 迭代器遍历:`
        • (1)例子:
        • (2)迭代器遍历的原理:
        • (3)迭代器源码分析:
        • (4)总结:
      • `2.2.2 增强for循环遍历:`
      • `2.2.3 foreach遍历:`
    • 2.3 List集合
      • (1)和索引相关的方法:
      • (2)list集合的遍历方法:
    • 2.4 数据结构
      • 2.4.1 栈和队列
      • 2.4.2 数组
      • 2.4.3 链表
      • 2.4.4 总结
    • 2.5 ArrayList类和LinkedList类
      • 2.5.1 ArrayList类:
        • (1)ArrayList长度可变原理:
      • 2.5.2 LinkedList类:

1、集合的介绍

1.1 概念

在这里插入图片描述

1.2 集合的分类

在这里插入图片描述

注:集合分为单列集合双列集合

  • 单列集合:一次添加一个元素,实现了Collection接口。
  • 双列集合:一次添加两个元素,实现了Map接口。

2、单列集合:Collection

在这里插入图片描述
注:Collection集合,可以分为List集合Set集合

  • List集合:存取有序、有索引、可以存储重复的元素。
  • Set集合:存取无序、没有索引、不可以存储重复的元素。

2.1 Collection的使用

在这里插入图片描述

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest1 {/*** Collection的常用方法:*     public boolean add(E e):把给定的对象添加到当前集合中*     public void clear():清空集合中所有的元素*     public boolean isEmpty():判断当前集合是否为空*     public boolean remove(E e):把给定的对象在当前集合中删除*     public boolean contains(Object obj):判断当前集合中是否包含给定的对象*     public int size():返回集合中元素的个数(集合的长度)**/public static void main(String[] args) {//以多态的形式创建集合对象,调用单列集合中的共有方法Collection<String> c = new ArrayList<>();//1、add(E e):把给定的对象添加到当前集合中boolean b1 = c.add("张三");boolean b2 = c.add("李四");boolean b3 = c.add("王五");System.out.println(b1);//true 返回是否添加成功的状态System.out.println(b2);//trueSystem.out.println(b3);//trueSystem.out.println(c);//[张三, 张三, 张三]//2、clear():清空集合中所有的元素c.clear();System.out.println(c);//[]//3、isEmpty():判断当前集合是否为空System.out.println(c.isEmpty());//true//4、remove(E e):把给定的对象在当前集合中删除c.add("马四");c.add("赵武");boolean remove = c.remove("马四");//返回值为是否删除成功的标记:删除存在的对象则返回true,删除不存在的对象则返回falseSystem.out.println(c);//[赵武] 可以发现马四已经被删除了//5、contains(Object obj):判断当前集合中是否包含给定的对象boolean contains1 = c.contains("平平");System.out.println(contains1);//false 不包含则返回falseboolean contains2 = c.contains("赵武");System.out.println(contains2);//true 包含则返回true//6、size():返回集合中元素的个数(集合的长度)System.out.println(c.size());//1}
}

2.2 集合的通用遍历方式

在这里插入图片描述

2.2.1 迭代器遍历:

(1)例子:
package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;public class CollectionTest3 {/*** public Iterator<E> iterator():获取遍历集合的迭代器*     1、public E next():从集合中获取一个元素*          注:如果next()调用超过了集合的大小,就会出现 NoSuchElementException 异常*     2、public boolean hasNext():如果任有元素可以迭代,则返回true*/public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("张三", 11);//Student是自定义创建的类Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三个对象c.add(s1);c.add(s2);c.add(s3);//1、获取迭代器Iterator<Student> iterator = c.iterator();//2、循环判断集合中是否还有元素while (iterator.hasNext()){////3、调用next方法,从集合中获取一个元素Student next = iterator.next();System.out.println(next);}}
}
(2)迭代器遍历的原理:

在这里插入图片描述

总结:next()方法取出一个元素后,指针会向后移动一位。

(3)迭代器源码分析:

在这里插入图片描述

(4)总结:

在这里插入图片描述

2.2.2 增强for循环遍历:

在这里插入图片描述

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest4 {/*** 使用增强for循环遍历**/public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("张三", 11);//Student是自定义创建的类Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三个对象c.add(s1);c.add(s2);c.add(s3);//使用增强for循环遍历for (Student s : c){System.out.println(s);}}
}

注:增强for循环的遍历方式,其实就是迭代器遍历,当编译成字节码文件后,发现增强for循环代码就会转换为迭代器遍历方式。

2.2.3 foreach遍历:

package com.itheima.collection;import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class CollectionTest4 {public static void main(String[] args) {Collection<Student> c = new ArrayList<>();Student s1 = new Student("张三", 11);//Student是自定义创建的类Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 31);//添加三个对象c.add(s1);c.add(s2);c.add(s3);//使用foreach方法遍历c.forEach(e-> System.out.println(e));}
}

注:foreach底层也是迭代器遍历。

2.3 List集合

在这里插入图片描述

(1)和索引相关的方法:

在这里插入图片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.List;public class ListDemo1 {/*** List接口的特点:存取有序、有索引、可以存储重复* 和索引有关的API:*     public void add(int index, E element):在指定的索引位置,添加元素*     public E set(int index, E element):根据索引修改集合中的元素*     public E remove(int index):根据索引删除集合中的元素*     public E get(int index):返回指定索引处的元素*/public static void main(String[] args) {List<String> list = new ArrayList<>();//1、add(int index, E element):在指定的索引位置,添加元素list.add("lisi");list.add("wangwu");list.add("maliu");list.add(1, "lisi");//在1号位置添加元素,原来1号位置及后面的元素都向后移动一位System.out.println(list);//[lisi, lisi, wangwu, maliu]//2、set(int index, E element):根据索引修改集合中的元素list.set(1, "马四");//修改索引为1的元素为马四System.out.println(list);//[lisi, 马四, wangwu, maliu]//3、remove(int index):根据索引删除集合中的元素list.remove(1);//删除索引为1的元素System.out.println(list);//[lisi, wangwu, maliu]//4、get(int index):返回指定索引处的元素System.out.println(list.get(1));//wangwu 获取索引为1的元素}
}

注意:remove()方法,如果list集合中存储的本身就是int类型,那么删除时会被当做索引,因此需要手动装箱,如下例子:

package com.itheima.collection.list;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {List<Integer> ll = new ArrayList<>();ll.add(111);ll.add(222);ll.add(333);
//        ll.remove(222);//222会被当作索引,这里就会报空指针,手动装箱,如下ll.remove(Integer.valueOf(222));System.out.println(ll);//[111, 333]}
}

(2)list集合的遍历方法:

在这里插入图片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class ListDemo2 {/*** List集合的遍历方式:*     1、普通for循环*     2、迭代器遍历*     3、增强for循环*     4、foreach方法*     5、ListIterator(List集合特有的迭代器)**/public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("111");list.add("222");list.add("333");list.add("444");//1、普通for循环for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("--------------------");//2、迭代器遍历Iterator<String> iterator = list.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("--------------------");//3、增强for循环for (String s : list){System.out.println(s);}System.out.println("--------------------");//4、foreach方法list.forEach(item -> System.out.println(item));System.out.println("--------------------");//5、ListIterator(List集合特有的迭代器)ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()){System.out.println(listIterator.next());}//上述ListIterator遍历和正常的一样,不一样的是可以倒叙遍历,同时增加了add()方法while (listIterator.hasPrevious()){System.out.println(listIterator.previous());}}
}

注意:在遍历过程中做删除、增加操作,可能会发生并发修改异常。
在这里插入图片描述
在这里插入图片描述

package com.itheima.collection.list;import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;/*** Title: ListDemo3* Describe: 类的功能* Name: masizhou* Date: 2024/7/13* Copyright: @2022 by masizhou*/public class ListDemo3 {/*** 在遍历过程中,如果有添加、删除元素操作时,会出现并发修改异常:ConcurrentModificationException* 【场景】:使用[迭代器]遍历集合的过程中,调用了[集合对象]的添加,删除方法,机会出现此异常* 【解决方案】:迭代器的遍历过程中,不允许使用集合对象的添加或删除,那就是用迭代器,自己的添加或删除方法*              删除方法:普通的迭代器有*              添加方法:普通的迭代器没有,需要使用list集合特有的迭代器**/public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");/*下面代码使用的是增强for循环,其实底层也是使用迭代器的方法,但这个时候增加和删除只能拿到集合的方法,没法使用迭代器的方法【解决方法】:手写迭代器进行遍历---这就是为啥手写迭代器遍历虽然麻烦,但是有特定使用的场景*/
//        for (String s : list){
//            list.remove("bbb");
//        }ListIterator<String> listIterator = list.listIterator();while (listIterator.hasNext()){String s = listIterator.next();if ("aaa".equals(s)){listIterator.remove();listIterator.add("我是增加的元素");}}System.out.println(list);//[我是增加的元素, bbb, ccc, ddd]}
}

注意:
(1)我们在写代码,在遍历过程中需要对一个集合做增加或者删除操作时,一般会放在一个新的集合中,避免索引乱了的问题而导致空指针。
(2)但是为了节省内存,就是要操作原集合,那就使用迭代器的遍历方法,然后用迭代器的add和remove方法做增加和删除操作就可以解决这个问题。

2.4 数据结构

在这里插入图片描述

2.4.1 栈和队列

在这里插入图片描述

2.4.2 数组

在这里插入图片描述

2.4.3 链表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.4.4 总结

在这里插入图片描述

2.5 ArrayList类和LinkedList类

2.5.1 ArrayList类:

在这里插入图片描述

package com.itheima.collection.list;
import java.util.ArrayList;
import java.util.List;public class ListDemo3 {public static void main(String[] args) {List<String> list = new ArrayList<>();//多态list.add("aaa");list.add("bbb");System.out.println(list);}
}
(1)ArrayList长度可变原理:

在这里插入图片描述

注意:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.5.2 LinkedList类:

在这里插入图片描述

package com.itheima.collection.list;
import java.util.LinkedList;
import java.util.List;public class ListDemo4 {/*** LinkedList特有方法:*     public void addFirst(E e):头部添加*     public void addLast(E e):尾部添加*     public E getFirst():获取第一个*     public E getLast():获取最后一个*     public E removeFirst():删除第一个*     public E removeLast():删除最后一个**/public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("张三");linkedList.add("李四");linkedList.add("王五");//1、addFirst(E e):头部添加linkedList.addFirst("玛尔");System.out.println(linkedList);//[玛尔, 张三, 李四, 王五]//2、addLast(E e):尾部添加linkedList.addLast("马六");System.out.println(linkedList);//[玛尔, 张三, 李四, 王五, 马六]//3、getFirst():获取第一个System.out.println(linkedList.getFirst());//玛尔//4、getLast():获取最后一个System.out.println(linkedList.getLast());//马六//5、removeFirst():删除第一个LinkedList<String> l1 = new LinkedList<>();l1.add("aaa");l1.add("bbb");l1.add("ccc");l1.add("ddd");//l1 = [aaa, bbb, ccc, ddd]l1.removeFirst();System.out.println(l1);//[bbb, ccc, ddd]//6、removeLast():删除最后一个LinkedList<String> l2 = new LinkedList<>();l2.add("aaa");l2.add("bbb");l2.add("ccc");l2.add("ddd");//l2 = [aaa, bbb, ccc, ddd]l2.removeLast();System.out.println(l2);//[aaa, bbb, ccc]}
}

在这里插入图片描述

在这里插入图片描述
答:实际上就是从头或者从尾部开始遍历查找:

  • 如果索引比集合长度的一半小,则从头找;
  • 如果索引比集合长度的一半大,则从尾找;

注意!!!
注意!!!
注意!!!
双列集合在Day10里。。。

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

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

相关文章

排序——交换排序

在上篇文章我们详细介绍了排序的概念与插入排序&#xff0c;大家可以通过下面这个链接去看&#xff1a; 排序的概念及插入排序 这篇文章就介绍一下一种排序方式&#xff1a;交换排序。 一&#xff0c;交换排序 基本思想&#xff1a;两两比较&#xff0c;如果发生逆序则交换…

jenkins系列-09.jpom构建java docker harbor

本地先启动jpom server agent: /Users/jelex/Documents/work/jpom-2.10.40/server-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % sh Server.sh start/Users/jelex/Documents/work/jpom-2.10.40/agent-2.10.40-release/bin jelexjelexxudeMacBook-Pro bin % ./Agent.…

达梦数据库的系统视图v$sessions

达梦数据库的系统视图v$sessions 达梦数据库&#xff08;DM Database&#xff09;是中国的一款国产数据库管理系统&#xff0c;它提供了类似于Oracle的系统视图来监控和管理数据库。V$SESSIONS 是达梦数据库中的一个系统视图&#xff0c;用于显示当前数据库会话的信息。 以下…

全自主巡航无人机项目思路:STM32/PX4 + ROS + AI 实现从传感融合到智能规划的端到端解决方案

1. 项目概述 本项目旨在设计并实现一款高度自主的自动巡航无人机系统。该系统能够按照预设路径自主飞行&#xff0c;完成各种巡航任务&#xff0c;如电力巡线、森林防火、边境巡逻和灾害监测等。 1.1 系统特点 基于STM32F4和PX4的高性能嵌入式飞控系统多传感器融合技术实现精…

MYSQL--第八次作业

MYSQL–第八次作业 一、备份与恢复 环境搭建&#xff1a; CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

geoServer在windows中下载安装部署详细操作教程

这里写目录标题 1.安装环境检查2.下载安装包&#xff08;1&#xff09;进入下载地址&#xff1a;&#xff08;2&#xff09;以下载最新版为例&#xff0c;点击“Stable GeoServer”下载&#xff08;3&#xff09;安装有两种方式&#xff08;4&#xff09;我这里选择下载war包 3…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

Qt MV架构-视图类

一、基本概念 在MV架构中&#xff0c;视图包含了模型中的数据项&#xff0c;并将它们呈现给用户。数据项的表示方法&#xff0c;可能和数据项在存储时用的数据结构完全不同。 这种内容与表现分离之所以能够实现&#xff0c;是因为使用了 QAbstractItemModel提供的一个标准模…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

基于大语言模型(LLM)的合成数据生成、策展和评估的综述

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…

【图解大数据技术】流式计算:Spark Streaming、Flink

【图解大数据技术】流式计算&#xff1a;Spark Streaming、Flink 批处理 VS 流式计算Spark StreamingFlinkFlink简介Flink入门案例Streaming Dataflow Flink架构Flink任务调度与执行task slot 和 task EventTime、Windows、WatermarksEventTimeWindowsWatermarks 批处理 VS 流式…

如何查找电脑的MAC地址

一. 什么是mac地址&#xff1f; mac地址本质上帮助我们连接到我们遇到的大多数本地网络。每个网络适配器通常由网络接口​​控制器(NIC) 制造商分配一个唯一的 mac 地址。 二. 如何查找mac地址 1.点击网络和Internet设置 2.点击WLAN点击硬件属性 3.即可查看mac地址

智慧城市3d数据可视化系统提升信息汇报的时效和精准度

在信息大爆炸的时代&#xff0c;数据的力量无可估量。而如何将这些数据以直观、高效的方式呈现出来&#xff0c;成为了一个亟待解决的问题。为此&#xff0c;我们推出了全新的3D可视化数据大屏系统&#xff0c;让数据“跃然屏上”&#xff0c;助力您洞察先机&#xff0c;决胜千…

pytorch训练的时候 shm共享内存不足,导致训练停止

1.查看shm情况 df -h /dev/shm内存已经满了&#xff0c;因为之前训练多次训练意外停止到shm中的缓存不能及时被清理 2、手动清理shm 依然没被释放 3、查看关联的进程&#xff0c;一个一个kill lsof |grep deletedkill -9 46619 44618 44617 。。。。。4、搞定

ROS2 + 科大讯飞 初步实现机器人语音控制

环境配置&#xff1a; 电脑端&#xff1a; ubuntu22.04实体机作为上位机 ROS版本&#xff1a;ros2-humble 实体机器人&#xff1a; STM32 思岚A1激光雷达 科大讯飞语音SDK 讯飞开放平台-以语音交互为核心的人工智能开放平台 实现步骤&#xff1a; 1. 下载和处理科大讯飞语音模…

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集&#xff0c;该数据集有两个文件&#xff…

前端工程化10-webpack静态的模块化打包工具之各种loader处理器

9.1、案例编写 我们创建一个component.js 通过JavaScript创建了一个元素&#xff0c;并且希望给它设置一些样式&#xff1b; 我们自己写的css,要把他加入到Webpack的图结构当中&#xff0c;这样才能被webpack检测到进行打包&#xff0c; style.css–>div_cn.js–>main…

Flower花所比特币交易及交易费用科普

在加密货币交易中&#xff0c;选择一个可靠的平台至关重要。Flower花所通过提供比特币交易服务脱颖而出。本文将介绍在Flower花所进行比特币交易的基础知识及其交易费用。 什么是Flower花所&#xff1f; Flower花所是一家加密货币交易平台&#xff0c;为新手和资深交易者提供…

【C++】开源:drogon-web框架配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍drogon-web框架配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;…