day18_集合_List

news2024/11/28 8:40:17

今日内容

上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、集合框架体系
二、Collection
三、泛型
四、迭代
五、List
六、ArrayList
七、LinkedList

零、 复习昨日

throw和throws什么区别

throwthrows
位置方法内部方法签名上
作用产生异常声明抛出异常
后面跟异常对象后面异常类名
1个对象多个类名

运行时异常有哪些: RuntimeException及其子类
编译期异常有哪些:非RuntimeException及其子类
异常的处理方式: 抛出(被动处理),捕获(主动处理)

一、集合框架体系

集合: 用来存储多个数据一种容器.与数组不同的是…

集合数组
长度可变固定
存储的类型是否固定数据类型不固定数据类型固定
存储的类型只能是存储引用类型基本类型数组,引用类数组
功能有属性和方法没有方法,没有属性(length除外)

集合体系

image-20230222094006626

今天主要学习Collection,List,ArrayList,LinkedList…

二、Collection

Collection是单列集合层次结构中的根接口
一些 集合允许有重复的元素,而另一些则不允许。一些 集合是有序的,而另一些则是无序的
Collection下面的一些子实现类有些有重复元素,有些没有,有些可以有序,有些无序

方法: 每个都很常见,很重要

   private static void testMethod1() {
        // Collection是接口,演示时需要创建子类对象ArrayList
        Collection collection = new ArrayList();
        System.out.println(collection );

        // boolean add(Object obj);  添加1个元素
        collection.add("集合");
        collection.add(new Date());
        collection.add(111); // 111 自动装箱成Integer,Integer赋值给Object
        // ps: 可以存储各种类型的数据,且长度不固定


        System.out.println(collection );

        // boolean addAll(Collection c); 将参数集合中的所有元素,全部添加到当前集合
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");

        Collection c2 = new ArrayList();
        c2.add(1);
        c2.add(2);
        c2.add(3);

        // c2.add(c1);  // 这是将集合当做1个元素放进去
        // System.out.println(c2 );

        // int size(); 返回集合中元素的个数
        // int size = c2.size( );
        // System.out.println(size );


        c2.addAll(c1); // 将集合中的元素取出,1个1个放进去
        System.out.println(c2 );
        System.out.println(c2.size() );


        Collection c3 = new ArrayList();
        c3.add("a");
        c3.add("b");
        c3.add("c");
        System.out.println(c3 );

        // boolean remove(Object obj);
        System.out.println(c3.remove(1));
        System.out.println(c3.remove("a"));
        System.out.println(c3 );


        // boolean removeAll(Collection c);
        Collection c4 = new ArrayList();
        c4.add("a");
        c4.add("b");
        c4.add("c");
        System.out.println(c4 );

        Collection c5 = new ArrayList();
        c5.add("e");
        c5.add("d");

        // 删除的两个集合中有交集的部分元素
        System.out.println(c4.removeAll(c5));
        System.out.println(c4 );
    }
   public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");

        Collection c2 = new ArrayList();
        c2.add("b");
        c2.add("e");

        // retainAll(Collection c); 保留指定元素,删除其他元素
        // 两个集合交集部分全部保留,其他删除
        c1.retainAll(c2);
        System.out.println(c1 );


        Collection c3 = new ArrayList();
        c3.add("a");
        c3.add("b");
        c3.add("c");

        System.out.println(c3.contains("c"));

        System.out.println(c3.size( ));
        // 判断是否为空
        System.out.println(c3.isEmpty( ));

        // clear() 清空集合
        c3.clear();
        System.out.println(c3.size( ));
        // 判断是否为空
        System.out.println(c3.isEmpty( ));
    }

三、泛型

泛型就是一种比较宽泛的类型定义,是一种抽象的类型.
今天使用泛型的主要目的: 为了消除强制类型转换

泛型使用:
在类或方法参数定义时使用泛型字母来取代之前固定数据类型

add(Object obj) --> add(E e)
Collection --> Collection


常见的泛型字母
E (element) T (target) K(key) V(value) ? (未知)

    public static void main(String[] args) {
        // Collection<String> c1 = new ArrayList<String>();
        // 设置泛型
        // 一旦设置泛型,就约束了集合只能存储该类型数据
        Collection<String> c1 = new ArrayList<>();
        // 这么做的目的是:为了消除强制类型转换!!

        c1.add("a");
        // 不能加入其他类型的元素
        // c1.add(1);
        // c1.add(new Object());
        c1.add("b");
    }

四、迭代[重要]

迭代 (遍历), 将集合元素迭代,目的是取出元素.

Collection根接口,提供了一个迭代器规范,iterator(),调用该方法会返回一个集合元素上的迭代器,通过这个迭代器就可以获得集合元素

    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        c.add("e");

        // 获得迭代器(这个迭代器里面就会拥有所有的元素)
        Iterator<String> iterator = c.iterator();
        // 判断有没有下一个
        while(iterator.hasNext()) {
            String e = iterator.next(); // 取出下一个元素
            System.out.println(e );
        }

        // 现在不使用泛型,再来一遍,感受泛型的好处
    }

image-20230222112842117

迭代器使用注意事项:

1、迭代器迭代完成之后,迭代器的位置在最后⼀位。 所以迭代器只能迭代⼀次

2、迭代器在迭代的时候,不要调⽤多次next⽅法,可能会出错NoSuchElementException

3、在迭代器迭代的时候,不能向集合中添加或者删除元素 ,否则报错ConcurrentModificationException (除非使用迭代器自己的方法进行删除/添加)



增强for循环(foreach)

// 语法
for(数据类型 变量名: 要遍历的集合/数组){
    // ...
}
//左侧的数据类型 变量名要根据集合/数组来定,变量是每次循环都代表1个集合元素或者数组元素.不是下标!!!
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("a1");
        c.add("b1");
        c.add("c1");
        c.add("d1");
        c.add("e1");

        // 迭代
        for(String s : c) {
            System.out.println(s );
        }

        // 使用foreach遍历数组
        int[] arr = {1,2,3,4,5};
        for(int i: arr){
            System.out.println(i );
        }
    }

五、List

List是Collection的子接口
List是有序集合: 有序是指集合迭代顺序和插入顺序一致
List集合允许重复元素!!
List集合提供了可以针对索引(下标)操作元素的方法

List接口中的方法大部分与父接口Collection中一致,
但是除此之外的方法,确实提了可以通过下标操作元素(CRUD)的方法

  • void add(int index,E e)
  • E remove(int index)
  • E get(int index)
  • E set(int index,E e)

List是接口,没有办法演示其中的方法

List接口有两个常用的实现类:ArrayList和LinkedList

六、ArrayList[重点]

ArrayList实现了List接口,即ArrayList也是有序集合,也允许重复元素,且那些关于下标操作集合的方法ArrayList都有!

ArrayList底层是数组,大小可变是指它会扩容(不是真正大小可变)

6.1 演示方法

构造方法

  • ArrayList() 创建空集合,默认创建了一个长度为10的数组
  • ArrayList(Collection c) 创建一个集合,集合内直接就有指定的参数
  • ArrayList(int initialCapacity) 创建一个指定初始化容量的数组
 ArrayList<Integer> list = new ArrayList<>( );

方法

  • 其他的方法上午在Collection中已经学过
  • void add(int index,E e)
  • E remove(int index)
  • E get(int index)
  • E set(int index,E e)
   public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>( );
        // System.out.println(list.size() );
        // System.out.println(list.isEmpty() );

        // 有序: 遍历和插入顺序一致
        list.add(4);
        list.add(2);
        // 且允许重复
        list.add(4);
        list.add(1);
        list.add(3);
        // 42413
        // E remove(int index); // 根据下标删除,并返回被删除的元素(阅后即焚)
        //Integer e1 = list.remove(2);
        //System.out.println("要删除的元素: " + e1 );
        //System.out.println(list );

        // 通过下标取出元素
        Integer e2 = list.get(2);
        System.out.println("获得下标2的元素"+e2 );
        System.out.println(list );

        // 根据下标插入元素
        list.add(3,5);

        // 根据下标修改元素,返回旧元素
        list.set(3,50);
        System.out.println(list );
        // 遍历
        // for(Integer i: list){
        //     System.out.println(i );
        // }
    }

6.2 底层原理

ArrayList底层是使用数组,默认长度是10,但是存储元素多于10时会扩容.

如何扩容的?

  • 当加入元素时,先判断加入后会不会超出默认长度
  • 如果没有超出默认长度
    • add(Object o) 元素直接放最后
    • add(int index,Object o) 先将该位置以后的元素依次往后移动一个,然后再将该元素放入该位置
  • 当加入元素时,判断加入后长度会不会超出容量,如果超出就要扩容
  • 扩容是创建一个新的数组,容量是原来的1.5倍
  • 将原来数组的元素依次拷贝到新数组
  • 然后再放入新元素

image-20230222160227208

6.3 特点[记住]

ArrayList特点: 1) 有序 2) 重复 3) 查询更新效率高 4) 删除插入效率低

应用场景: 适合那些查询频率高的地方. 且基本大部分场景都是经常查不经常删除和插入的,所以呢ArrayList就非常常用!!! 如果以后没有特殊说明,直接就使用ArrayList!!

七、LinkedList

LinkedList是List的实现类,那么LinkedList也是允许重复,有序
且LinkedList集合也有关于下标操作集合的方法,但是还提供了一些关于操作开头和结尾的方法

底层是使用链表实现.

7.1 演示方法

    public static void main(String[] args) {
        LinkedList<Integer> ll = new LinkedList<>( );
        ll.add(4);
        ll.add(2);
        ll.add(4);
        ll.add(3);
        ll.add(1);

        // 关于下标操作
        ll.add(3,5);
        System.out.println(ll );

        ll.set(3,50);
        System.out.println(ll );

        Integer i = ll.get(3);
        System.out.println(i );

        ll.remove( 3 );
        System.out.println(ll );

        System.out.println("-------------" );
        // 特殊的,有关于操作头和尾的方法
        // 获得第一个
        System.out.println(ll.getFirst( ));

        // 获得最后一个
        System.out.println(ll.getLast() );

        // 向头插入
        ll.addFirst(0);
        System.out.println(ll );

        // 向尾插入
        ll.addLast(6);
        System.out.println(ll );

        // 删除第一个,删除最后一个
    }

7.2 原理

底层是链表实现

image-20230222171301547

7.3 特点

  1. 有序
  2. 允许重复
  3. 查找,更新时效率比较低
  4. 插入,删除时效率比较高

八、扩展

面试

      // 会出现并发编程问题的
        // Iterator<Integer> iterator = list.iterator( );
        // while(iterator.hasNext()) {
        //     Integer next = iterator.next( );
        //
        //     // 使用集合自己方法进行删除/添加会出现并发修改异常
        //     list.remove(1);
        //
        // }


        System.out.println(list );
        // 不会出现并发编程异常
        ListIterator<Integer> listIterator = list.listIterator( );
        while (listIterator.hasNext()) {
            Integer next = listIterator.next( );

            // 使用迭代器的方法进行对集合内容修改/添加
            //listIterator.remove();
            listIterator.add(100);

        }
        System.out.println(list );

九、总结

Collection 里面的方法都很常见,其中的方法必须记住
泛型会用就行
迭代 Iterator或者foreach都要会
ArrayList全部都是重点(集合创建,方法的使用,原理,特点)
LinkedList主要记住特点,防止面试问

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

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

相关文章

Word中批量调整图片大小

当一个文档中图片较多&#xff0c;又需要调整图片大小时&#xff0c;这时可以通过“宏”执行代码来批量调整。打开一个Word文档。“AltF8"键打开宏。设置“宏名”&#xff0c;并单击“创建”。创建完宏后&#xff0c;将进入Visual Basic 编辑器界面。在代码编辑区全选&…

WebDAV之π-Disk派盘+文件管理器

文件管理器 支持WebDAV方式连接π-Disk派盘。 推荐一款iOS上的免费文件管理器新秀。 文件管理器这是一款功能强大的文件管理工具,支持zip,rar,7z等压缩包的解压和压缩,支持小说,漫画,视频下载及播,极大提升日常办公,娱乐,文件管理的工作效率,使得文档的归档和管理随心…

Android system实战 — Android R(11) 进程保活白名单

Android system实战 — Android R 进程保活白名单0. 前言1. 具体实现1.1 准备工作1.2 源码实现1.2.1 源码1.2.2 diff文件0. 前言 最近在Android R上实现一些需求&#xff0c;进行记录一下&#xff0c;关于进程保活的基础知识可以参考Android system — 进程生命周期与ADJ&#…

纯手动搭建hadoop3.x集群记录002_安装hadoop3.x_创建xsync分发工具_配置ssh免密登录---大数据之Hadoop3.x工作笔记0164

1.首先我有 172.19.126.117 母机 对应 172.19.126.122 虚拟机 172.19.126.116 母机 对应 172.19.126.121 虚拟机 172.19.126.115 母机 对应 172.19.126.120 虚拟机 对吧,然后我们从115上 开始安装hadoop 2. 然后走到这个opt/software文件夹中,然后解压 hadoop-3.1.3.tar.…

nn.Dropout随机丢神经元的用法

前言&#xff1a; pytorch与tensorflow中均有nn.dropout,两者之间的使用方法&#xff0c;下面将介绍。 一、torch.nn.dropout 说明文档&#xff1a; r"""During training, randomly zeroes some of the elements of the input tensor with probability :att…

人员行为识别系统 TensorFlow

人员行为识别系统人员行为识别系统通过TensorFlow深度学习技术&#xff0c;人员行为识别算法对画面中区域人员不按要求穿戴、违规抽烟打电话、睡岗离岗以及作业流程不规范实时分析预警&#xff0c;发现违规行为立即抓拍告警。深度学习应用到实际问题中&#xff0c;一个非常棘手…

2.22 位运算

位运算 预备知识 首先注意二进制位数从0开始记录&#xff0c;即 15&#xff08;1111&#xff09;&#xff0c;位数分别为3210 左移和右移 左移 << 将某个数的二进制向左移动几位&#xff0c;低位补0 如5>>2 即20&#xff0c;左移k位即相当于乘上2的k次方 右移 >…

C++学习笔记-数组

所谓数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;就是把有限个类型相同的变量用一个名字命名&#xff0c;然后用编号区分他们的变量的集合&#xff0c;这个名字称为数组名&#xff0c;编号称为下标。组成数组的各个变量称为数组的分量&#xff0c;…

[面向小白]一篇博客带你认识什么是栈以及如何手撕一个栈

目录 0.前言 1.什么是栈 2.实现栈所选择的基本结构 3.认识栈的小练习 4. 用代码实现一个栈 4.1 用什么可以描述出一个栈 4.2栈接口的设计原则 4.3栈的初始化 4.4栈的插入 4.5 栈的删除 4.6 栈的判空 4.7栈的有效元素的数量 4.8取出栈顶元素 4.9栈的销毁 5. 对实…

BUUCTF-[ACTF新生赛2020]Splendid_MineCraft

题目下载&#xff1a;下载 这道题涉及SMC&#xff0c;动静态调试。 查壳&#xff0c;无壳32位&#xff0c;载入IDA 进入主函数main&#xff1a; 从上面可以看出&#xff0c;flag长度为26&#xff0c;前五个是ACTF{&#xff0c;最后一位是}。 strtok()函数用法&#xff1a;st…

sso单点登录

文章目录 目录 文章目录 前言 一、sso结构实现 二、使用步骤 2.1 建一个spring cloud 项目 2.2 common下的core的配置 2.3 实现系统的业务微服务 2.4 sso模块的编写 总结 前言 单点登录(SingleSignOn&#xff0c;SSO)&#xff0c;就是通过用户的一次性鉴别登录。当用户在身份…

复习知识点三:做人不能半途而废,就算躺平也要躺最舒服的那张床

目录 运算符​编辑 键盘录入: 练习:键盘输入数字并求和 练习: 算术运算符 隐式转换(自动类型提升) 强制转换 练习1: 字符串的 "" 操作 ​编辑 练习 1: 练习2: 练习3: 自增自减运算符 赋值运算符 关系运算符(比较运算符)的分类 练习: 逻辑运算符 短路逻辑运…

电商平台销量查询:2023年1月牛奶乳品热门排行榜

随着人们消费能力的提升以及健康意识的增强&#xff0c;牛奶乳品已经成为居民日常饮食中的重要组成部分&#xff0c;伴随人们整体消费的增长&#xff0c;牛奶乳品行业也越来越成熟。 今年1月份我国牛奶乳品行业的整体趋势如何呢&#xff1f;结合数据我们一同来分析&#xff01;…

国外博士后待遇情况汇总

许多老师再考虑申请国外博士后的时候会顾虑待遇方面的问题&#xff0c;对此知识人网小编整理关于主要国家博士后待遇情况的汇总。美国&#xff1a;美国机会更多&#xff0c;生活质量更高&#xff0c;生活空间也广。美国的年薪一般是3.0-6.5万美金左右&#xff0c;刚博士毕业出来…

无脑霸总漫开播,她穿书变成恶毒女配,本想和霸总离婚摆烂

无脑霸总漫开播&#xff0c;她穿书变成恶毒女配&#xff01;本想和霸总离婚摆烂&#xff0c;不料却被霸总盯上了&#xff5e;虐妻一时爽&#xff0c;追妻火葬场&#xff0c;曾经的我你爱搭不理&#xff0c;现在的我你高攀不起&#xff01;#无脑霸总漫开播 #如何在无脑霸总漫里艰…

Sql Server数据库实现表中字段的列加密研究

1、问题描述 去年6月份的时候做过一个薪酬系统&#xff0c;要对里面的一些敏感字段进行一下加密。Sqlserver列加密可以参考官方文档&#xff1a;SQL Server 技术文档 - SQL Server | Microsoft Learn。主要看下来有三种加密方法&#xff1a;1、利用证书对数据进行加密和解密。2…

Google Guice 3:Bindings(1)

1. 序言 上一篇博客&#xff0c;《Google Guice 2&#xff1a;Mental Model》&#xff0c;讲述了Guice的建模思路&#xff1a;Guice is a map Guice官网认为&#xff1a;binding是一个对象&#xff0c;它对应Guice map中的一个entry&#xff0c;通过创建binding就可以向Guice …

RocketMQTemplate 实现消息发送

代码托管于gitee&#xff1a;easy-rocketmq 文章目录一、前置工作二、消费者三、生产者1. 普通消息2. 过滤消息3. 同步消息4. 延时消息5. 批量消息6. 异步消息7. 单向消息8. 顺序消息9. 事务消息概要Demo源码解读一、前置工作 1、导入依赖 <dependency><groupId>…

《羊驼亡命跑》 NFT 系列:羊驼跑酷套装来袭!

完美的羊驼跑酷&#xff01;这一系列植物、平台、愤怒的农民和神秘物品与你们的 Alpacadabraz 化身都是绝配。 关于 Paca Death Run Alpacadabraz 团队推出的首个主要体验的一切都很吸引&#xff01;这款跑酷游戏垂直填满了一个整个 1x1 The Sandbox LAND&#xff0c;挑战玩家在…

扬帆优配|看多A股!多家外资高调发声

外资看多我国的声响和动作正在增多&#xff01; A股商场迎来全面注册制落地后的首个交易日&#xff0c;三大指数集体走强。业内人士分析称&#xff0c;跟着全面实行股票发行注册制改革正式发动&#xff0c;能够预见&#xff0c;跟着商场化程度逐步进步&#xff0c;外资布局我国…