day18_集合

news2024/11/19 20:31:33

今日内容

零、 复习昨日
一、集合框架体系
二、Collection
三、泛型
四、迭代
五、List
六、ArrayList
七、LinkedList

零、 复习昨日

晨考

一、集合框架体系

数组: 是一个容器,用来存放数据的

  • 定长
  • 只能存储同一种数据类型的数据
  • int[] 可以存储int值,Student[] 可以存储引用类型
  • 只有一个length属性,没有方法,使用时功能简单

集合: 是一个容器,用来存放数据的

  • 不定长
  • 存各种各样类型
  • 只能存储引用类型
  • 提供了操作数据的各种方法

集合体系

image-20230222094006626

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

二、Collection

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

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

ps: Collection是接口,不能创建对象,为了演示这些API,需要使用子实现类,使用最常用的ArrayList集合来实现方法

package com.qf.col;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示Collection接口中的方法
 */
public class TestCollection {

    public static void main(String[] args) {

        Collection col = new ArrayList();
        // 添加元素
        col.add("abc");
        col.add(1);// 1自动装箱成Integer对象1,存入方法
        col.add(new Date());

        System.out.println(col );

        // 添加所有元素
        Collection col2 = new ArrayList();
        col2.add(21);
        col2.add(22);
        col2.add(23);

        col.addAll(col2);

        System.out.println(col );

        // 清空集合
        // col.clear();
        System.out.println(col );

        // 判断是否包含元素
        boolean contains = col.contains(22);
        System.out.println("是否包含22? " + contains );

        Collection col3 = new ArrayList();
        col3.add(21);
        col3.add(22);
        col3.add(24);

        boolean b = col.containsAll(col3);
        System.out.println("是否全部包含? " + b );

        // 判断两个集合是否相等(是指内部元素是否全部相等)
        boolean equals = col2.equals(col3);
        System.out.println("两个集合是否相等: " + equals );

        // 是否为空
        boolean empty = col.isEmpty( );
        System.out.println("是否为空? " + empty );

        // 移除指定元素
        boolean remove = col.remove(22);
        System.out.println("移除22 " + remove );
        System.out.println(col );

        //  boolean removeAll(Collection<?> c)
        //           移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
        //  boolean retainAll(Collection<?> c)
        //           仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

        // 获得集合元素个数
        System.out.println(col.size() );
    }
}

三、迭代[重要]

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

       public static void main(String[] args) {
        Collection col = new ArrayList();
        col.add(11);
        col.add(12);
        col.add(13);
        col.add(14);

        // 返回此集合上的迭代器
        // 迭代器内部就有所有元素了
        Iterator iterator = col.iterator();
        // Object next = iterator.next( );
        // 取出下一个元素
        // System.out.println(next );
        //
        // Object next2 = iterator.next( );
        // System.out.println(next2 );

        while (iterator.hasNext()) {
            Object next = iterator.next( );
            System.out.println(next );
        }
    }

image-20230419105956171

增强for循环(foreach)

        // 增强for循环(foreach)
        /**
         * for(遍历出结果的数据类型 变量 :被遍历的集合/数组) {
         * }
         */
        for(Object o : col) {
            System.out.println(o );
        }
        System.out.println("---------------" );
        int[] arr = {1,2,3,4};
        for(int i : arr){
            System.out.println(i );
        }

四、泛型

泛型在集合中主要是用来规定数据类型的.

语法: 设计时 <类型> , 例如<E> <K> ,<K,V> <T>

​ 使用时<类型>,类型只能写引用类型,例如<String> <Integer>

作用:

  • 约束集合存储的数据类型
  • 避免数据类型转换
    public static void main(String[] args) {
        /**
         * 集合允许存储不同类型
         * 但是开发中一般不会存储其他类型,即只会存同一种类型
         * 此时,就可以使用泛型来约束存储的数据类型
         */
        Collection<Integer> col = new ArrayList<>();
        col.add(1);
        // col.add("a");
        // col.add(1.1);
        // col.add(new Date());
        col.add(2);

        Iterator<Integer> iterator = col.iterator();
        // 使用泛型后,可以避免类型转换
        while(iterator.hasNext()) {
            Integer i = iterator.next();
            System.out.println(i );
        }
        System.out.println("----------" );
        for(Integer i : col){
            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接口有两个常用的实现类:ArrayListLinkedList

六、ArrayList[重点]

ArrayList实现了List接口,即ArrayList也是有序集合,也允许重复元素,且那些关于下标操作集合的方法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)
package com.qf.col;

import java.util.ArrayList;

/**
 * --- 天道酬勤 ---
 *
 * @author QiuShiju
 * @desc 演示ArrayList的方法
 */
public class TestArrayList {

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>( );
        System.out.println(list );

        list.add(11);
        list.add(12);
        list.add(13);

        System.out.println(list );
        ArrayList<Integer> list2 = new ArrayList<>(list);
        System.out.println(list2 );

        // 与Collection接口中一致的方法不再演示
        // 主要演示List特有的方法: 关于下标操作的方法

        // void dd(int index,E e) 在指定下标插入指定元素
        list.add(1,14);
        list.add(1,14);
        System.out.println(list );

        // E get(int index) 根据下标获得指定元素
        Integer i = list.get(1);
        System.out.println(i );

        // E set(int index,E e); 设置指定位置为指定元素,返回旧元素
        Integer old = list.set(2, 15);
        System.out.println(list );
        System.out.println(old );
        
        // E remove(int index); 根据下标删除元素,返回旧元素
        Integer old2 = list.remove(1);
        System.out.println(old2 );
        System.out.println(list );
        // 阅后即焚

        // 迭代/遍历
    }
}

6.2 底层原理

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

如何扩容的?

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdrKQEaK-1682069374810)(https://qiushiju-tuchuang.oss-cn-hangzhou.aliyuncs.com/image/image-20230222160227208.png)]

// jdk源码   
 private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

6.3 特点[记住]

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

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

七、LinkedList

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

底层是使用链表实现.

7.1 演示方法

    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>( );
        System.out.println(list );
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(3);
        list.add(1,4);
        System.out.println(list );
        // 其他List集合中关于下标的方法LinkedList都有,不再演示

        // 重点演示,关于头/尾的操作
        list.addFirst(0);
        list.addLast(5);
        System.out.println(list );
        System.out.println("------------------------------" );
        list.removeFirst();
        list.removeLast();
        System.out.println(list );
        System.out.println("------------------------------" );
        Integer pop = list.pop( );
        System.out.println(pop );
        System.out.println(list );

    }

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接口 方法
记住List的特点: 有序,重复
重点是ArrayList的方法,遍历,底层原理,特点
LinkedList熟悉

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

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

相关文章

知识变现海哥|不具备这三种思维,劝你别做知识变现

&#xff08;本文首发公号跟海哥学知识变现&#xff0c;移步公号与100万知识变现/知识付费创业者&#xff0c;一起学知识变现知识付费干货&#xff0c;回‘领书’获取3本电子书&#xff1a;【知识付费秘籍】【知识创业者成长手册】【100个知识付费成功案例】&#xff09; 经常有…

单位公派|肿瘤科医生远赴英国伦敦大学学院访学交流

鉴于本单位数位同事都是委托知识人网落实的职位&#xff0c;所以F医生也找到我们。几番挑选又历经周转&#xff0c;最终远赴英国伦敦大学学院访学交流。 F医生背景&#xff1a; 申请类型&#xff1a;单位公派访问学者 工作背景&#xff1a;三甲医院 教育背景&#xff1a;博士…

腾讯云im:用户端来实现群组消息的功能

前言&#xff1a; 腾讯云im如果放在服务端来实现是非常便捷的&#xff0c;但是也受腾讯im的并发等限制&#xff0c;这里提供 用户端&#xff0c;也就是前端 来实现群组消息的相关功能。 实现效果&#xff1a; 实现具体功能需求&#xff1a; 1、群组中有主播、用户、助手、导…

Android 实现单指滑动、双指缩放照片

一、前景提示 最近接到一个查看大图的需求&#xff0c;现在图片展示还不够大&#xff0c;要求还要能缩小能放大还能保存照片。直接开始Google实现方式。 二、实现功能 根据查询到的结果分为两种&#xff0c;一个是使用手势监听来实现&#xff0c;第二种监听触摸事件来实现 …

引入Tuning function design的自适应反步控制方法 下篇

引入Tuning function design的自适应反步控制方法 下篇 目录 引入Tuning function design的自适应反步控制方法 下篇利用Turning function解决高阶不匹配系统的控制器设计问题问题描述控制器设计小结总结上一篇文章写了如何通过推迟参数设计的方法来解决不匹配条件下的系统反步…

怎样把flv转换成mp4,4种方法轻松学

怎样把flv转换成mp4&#xff1f;当我们下载到视频格式是flv的时候&#xff0c;我们就要想着把flv转换成mp4&#xff1f;为什么这么说呢&#xff1f;因为FLV流媒体格式是一种全新的视频格式&#xff0c;全称为Flash Video。由于它形成的文件极小、加载速度极快&#xff0c;使得网…

这里有小白最关心的亚马逊防关联问题

账号的安全问题&#xff0c;很多时候和关联问题相关&#xff0c;一旦被检测到关联就会导致账号被永久封号。亚马逊更是官方出过规定&#xff0c;一个卖家只能开一个账号&#xff0c;如果同一个ip登录两个以上的账户&#xff0c;就很容易导致关联。这样讲可能会有点模糊&#xf…

微服务_微服务的架构演进之路

目录 一、前言 二、单体架构 三、分布式架构 四、微服务 五、SpringCloud 六、服务拆分 5.1服务拆分原则 5.2服务拆分示例 一、前言 微服务是一种软件开发架构风格&#xff0c;它将单个应用程序拆分成多个小型服务&#xff0c;每个服务都具有自己的特定功能。这些服务…

用TS写出20个数组方法的声明

前言 前段时间看直播看到狼叔直播驳斥”前端已死论“&#xff0c;前端死没死不知道&#xff0c;反正前端是拿不到以前那么多工资了&#xff1b;好&#xff0c;进入正题&#xff0c;狼叔在直播间提到要求前端写出20个数组上的方法&#xff0c;这确实不太简单&#xff0c;但是只…

(补)4.13每日一题

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题目连接&#xff1a;https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 解题 开始我把这个题目想简单了&#xff0c;我想的是输入一个字符串&#xff0c;从第一…

Day946.厂商定制的Android系统为什么也要解耦? -系统重构实战

厂商定制的Android系统为什么也要解耦&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于厂商定制的Android系统为什么也要解耦&#xff1f;的内容。 一、Android 系统架构 AOSP&#xff0c;全称是 Android Open Source Project&#xff0c;中文译为“An…

永磁同步电机流频比(I/F)控制及Matlab/Simulink仿真分析

文章目录 前言一、流频比I/F控制原理二、永磁同步电机I/F控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1 I/F控制算法2.1.2 电流环2.1.3 输出处理2.1.4 主电路 2.2 仿真结果分析 总结 前言 本章节采用流频比I/F控制方法驱动永磁同步电机的转动&#xff0c;首先分析流频…

传统机器学习(二)逻辑回归算法(一)

传统机器学习(二)逻辑回归算法(一) 1.1 算法概述 1.1.1 逻辑回归及其梯度推导 ​ 线性回归的任务&#xff0c;就是构造一个预测函数来映射输入的特征矩阵x和标签值y的线性关系&#xff0c;而构造预测函数的核心就是找出模型的参数,著名的最小二乘法就是用来求解线性回归中参…

J-Link不能连接目标MCU几点常见原因

J-Link是嵌入式软件最常用的工具之一&#xff0c;但是&#xff0c;在使用这个工具时&#xff0c;也会遇到各种各样的问题。 J-Link的连接 使用J-Link&#xff0c;首先第一步硬件连接&#xff0c;确认J-Link和PC机之间是否连接正常&#xff0c;并确认上位机能和 J-Link 建立正…

ZedGraph 绘制动态曲线

文章目录 前言&#xff1a;开发环境&#xff1a;1 下载ZedGraph 控件并设置图形界面2 功能实现3 需求升级4 小结 话不多数&#xff0c;先上一个效果图&#xff1a; 前言&#xff1a; 需要采集一些设备的数据以图表的形式展示出来&#xff0c;研究数据的走向是否平稳&#xff0…

mac Homebrew方式安装 activemq

两种方式安装 activemq 一、通过Homebrew管理安装 1. 确保homebrew可用 查看brew版本 brew -v 如果报错&#xff0c;则可能是未启用brew&#xff0c;需要安装或更新 更新并重新查看是否安装成功 brew update brew -v 2. 安装 activemq&#xff1a;下载activemq前 会先下载相…

Direct3D 12——纹理——寻址模式

可将经过常数插值或线性插值的纹理定义为一个返回向量值的函数T&#xff08;u, v&#xff09; &#xff08;r,g,b,a&#xff09;&#xff0c;即给 定纹理坐标&#xff08;u,v&#xff09;∈[0,1]^2,则上述纹理函数T将返回颜色&#xff08;r,g, b, a&#xff09;。 Direct3D允许…

MLCC周期性分析:当前时点处于周期反转前夜

MLCC是电子工业大米&#xff0c;供需波动导致行业成周期性波动 MLCC是最常用的被动元器件之一&#xff0c;终端下游涵盖消费电子、家电、汽车、通信等。在5g、汽车电子、智能硬件的推动下&#xff0c;MLCC行业需求稳步增长。供给端来看&#xff0c;中国大陆厂商合计市场份额不…

MFC加载动态gif图片文件C++语言,基于MFC的动画播放控件

MFC加载动态gif图片&#xff0c;使用VS2015环境 一、将下载的PictureEx.h和PictureEx.cpp放在工程文件的目录下&#xff0c;动态gif图片放在工程文件的res文件夹下&#xff1b;&#xff08;GIF动图下载 https://icons8.com/preloaders/en/search/move&#xff09; &#xff08…

企业级VUE前端项目各目录文件的作用

概述 本文项目是基于Vue CLI3构建工具&#xff08;基于 webpack)生成的脚手架项目。Vue CLI 现已处于维护模式&#xff0c;VUE官方推荐使用 create-vue&#xff08;基于 Vite&#xff09;构建工具。 vue-cli2.0与3.0在目录结构方面&#xff0c;有明显的不同,vue-cli3.0移除了…