华杉研发九学习日记18 集合 泛型

news2024/12/23 17:43:08

华杉研发九学习日记18

一,集合框架

1.1 集合和数组的区别

集合就是在java中用来保存多个对象的容器

集合是数组的升级版,集合中只能放置对象[object].

数组: 在java中用来保存多个具有相同数据类型数据的容器

数组弊端:

  • 1.数组只能保存相同的数据类型的数据
  • 2.数组的长度一旦定义永不可变

数组可以保存所有的数据类型的数据 (基本数据和引用数据)

集合只能保存引用数据类型

集合的优势:

  • 1.集合中可以保存多个不同数据类型的数据
  • 2.集合的长度不定,可以随着数据增加而扩容

集合在后期的开发项目中,经常使用。

集合框架指的是java.util 包中定义的各种容器类、相关的工具类、接口的统称。不同的容器存储不同结构的数据。使用时要进行导包操作。

在这里插入图片描述

上图是集合框架的整个家族体系
点线框是接口,虚线框是抽象类,实线框是类

简图:

在这里插入图片描述

集合一共分为两大类(3小类):
Collection…即集合,它是像数组一样的单值容器,容器的容量可以动态变化(数组的容量是固定的) ----单列

  • List…-…列表,可以简单理解为有序数组。
  • set-…–集合,类似于数学中的集合,容器中不允许出现重复元素
  • Map…-即映射(或字典) ,它是键值对容器,容量可以动态变化

二,Collection

Collection是单列集合的总的父接口,我们就不需要去直接操作接口,而是学习其方法即可.

在这里插入图片描述

三,List接口

List接口规定了有序集合应该具有什么功能。有序不是内容有序,而是存放顺序有序。既然有序,意味着有下标的概念

List集合是一个有序的,可以包含重复元素的集合。

List集合是接口,该接口中除了继承了Collection父接口中的所有的方法之外,也自己扩展自己独有的方法。

List是接口,不能用来创建对象,所用我们只需要学习其方法即可

四,ArrayList

4.1 方法

ArravList是List接口的实现子类,因为List接口继承了Collection接口,Collection接口继承了Iterable接口,因此ArrayList会实现List、Collection、Iterable中全部的方法

ArrayLlist之所以叫ArrayList,是因为ArrayList底层是靠数组来存放元素的。与我们之前所学数组不同的是,之前学习的数组长度不能改变,ArrayList是长度可变的数组,长度不足时会自动扩充容量

由于底层是靠数组完成的数据存取,所以查询效率高(根据index查询),增删效率低.(类似于顺序表)

数组增加或者删除元素时,需要移动元素,所以效率偏低

对单个数据:

//  创建一个List集合对象
//        ArrayList list = new ArrayList();   //  10
        List list =new ArrayList();
        //  继承的Collection的方法
        System.out.println(list.size());        //  0
        System.out.println(list.isEmpty());     //  true
        list.add("小猫"); //  向上转型   -->Object
        list.add("小咪");
        list.add(123);   // 自动装箱-->Integer    向上转型-->Object
		list.add(123);
        list.add(1,"小猫咪");
		//  get 获取
        System.out.println(list);
        Object o = list.get(1);
        System.out.println(o);
        //  indexOf 获取下标
        System.out.println(list.indexOf("小咪"));
        System.out.println(list.lastIndexOf(123));
        //  remove  移除
        list.remove(2);
        //  set 设置值
        System.out.println(list);
        list.set(3,"大猫咪");
        System.out.println(list);
        //  subList 截取集合
        List list2 =list.subList(0,2);
        System.out.println(list2);
        System.out.println(list.size());        //  3
        System.out.println(list.isEmpty());     //  false
        System.out.println(list.contains("小猫"));    //比对数据  true
        list.remove("小猫");      //  移除数据
        System.out.println(list.contains("小猫"));    //  false
        list.clear();           //  清楚所有
        System.out.println(list.size());        //  0

对批量数据:

List list1 = new ArrayList();
list1.add("小猫");
list1.add("小咪");
System.out.println(list1);

List list2 = new ArrayList();
list2.add("小猫咪");
list2.add("小狗");
System.out.println(list2);
//  在集合后面直接追加一个集合
list2.addAll(list1);
System.out.println(list2);
//  判断一个集合是否包含另一个集合全部
System.out.println(list2.containsAll(list1));
//  删除所有list1的元素
list2.removeAll(list1);
System.out.println(list2);
//  按照索引添加
list2.addAll(1,list1);
System.out.println(list2);
//  如果要移除数字类型的对象,需要用到包装类包装
//  否则视为移除数字对应的索引下标
list2.add(123);
list2.remove(new Integer(123));

4.2 遍历

  • 普通for循环
  • 加强for循环
  • 迭代器
List list = new ArrayList();
list.add("小孤鸡");
list.add(111);
list.add(true);
//  遍历
//  方式一,普通for循环
for(int i=0;i<list.size();i++){
    Object o = list.get(i);
    System.out.println(o);
}
System.out.println("==============");
//  方式二,加强for循环
for(Object o:list){
    System.out.println(o);
}
System.out.println("==============");
//  方式三,迭代器
Iterator it = list.iterator();
while(it.hasNext()){
    Object o = it.next();
    System.out.println(o);
}

五,泛型

什么是泛型?

泛型就是广泛的数据类型,参数化类型,它的作用就是把变量或者属性或者方法的参数或者方法的返回值等的类型看做是一个参数。这样就可以写出来通用的代码,让代码更加简洁。在使用的时候,传入真正的类型。这个过
程类似于方法的形参和实参

为什么要用泛型?

1.优化代码,让代码更简洁更通用

例如: 拿打印数组来说,我们可以定义一个工具类ArrayTool,ArrayTool提供打印数组的方法

public class ArrayTool <T>{   
// T : 泛型,当你创建对象时,来对该不定的类型定义其确定的类型,使于数据的传递
    //如果创建财象时,设有定文其美型。则欢认类型为0bject
    public void printArray(T arr[]) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
        //定义方法,来实现传入数组,遍历数组把其数据的元素打印到控制台
//        public static void printArray(int arr[]){
//            for(int i=0; i<arr.length; i++){
//                System.out.print(arr[i]+" ");
//            }
//        }
//        public static void printArray(String arr[]){
//            for(int i=0; i<arr.length; i++){
//                System.out.print(arr[i]+" ");
//            }
//        }

    public static void main(String[] args) {
//        ArrayTool arrayTool = new ArrayTool();
//        int arr[]={12,21,34,56,7};
//        arrayTool.printArray(arr);
//        String s[]={"小猫","小咪","小猫咪"};
//        arrayTool.printArray(s);
        ArrayTool<String> a = new ArrayTool<String>();
        String s[]={"小猫","小咪","小猫咪"};
        a.printArray(s);
        //将参数类型也传递过去
        ArrayTool<Integer> a1 = new ArrayTool<Integer>();
        Integer arr[]={1,255,32,444,111};
        a1.printArray(arr);
        //  如果没有定义类型,则默认为Object
        ArrayTool at3 = new ArrayTool();
        at3.printArray(arr);

    }
}

2.编写代码期间预报错误,防止运行期间出错,减少运行期间的类型转换

不使用泛型的时候,List中可以存放任意对象类型。会出现以下问题:

​ 1.报了一堆警告

​ 2.有可能取元素的时候,记错类型,进而产生转换类型的时候出现异常

​ 3.取元素需要类型转换 (因为默认object类型)

在Java中,泛型有3种用法:泛型类,泛型方法,泛型接口。

泛型类:
所谓的泛型类,就是对类进行泛型的设定。对类设定泛型,这个泛型将作用于类的属性,类的方法,类的方法的返回值,类中的局部变量。

泛型类的语法格式:
在类名的后面加上<类型占位符>

通配符 ?

限定通配符的上界

<?extends类型>可以限制通配符的上界. 例如:<? extends Animal>意思是?可以是Animal,也可以是Animal的子类(或孙子,重孙等) **限定通配符的下界** <? super类型>可以限定通配符的下界. 例如:<? extends Cat>意思是?可以是Cat,也可以是Cat的父类(或爷爷,或爷爷的父类等) ## 六,LinkedList LinkedList是List接口的实现子类,该类中的集合也是有序的,可以包含重复元素的集合 LinkedList在底层是以双链表的形式保存数据,**查询速度慢,增删数据速度快。** LinkedList除了继承List,Collection中的所有的方法之外,自己也扩展了一部分方法 继承的方法::add()addAll() size() contains() containsAll) remove() clear() get() indexof()lastIndexOf( lterator() subList() isEmpty0 toCharArray0 自己的方法:**addFirst() addLast()** getFirst() getLast() element() offerFirst() offerLast() pollFirst()pollLast( push() removeFirst() removeLast() ```java // 这里向上转型成List,无法用到自己独有的方法 List list = new LinkedList<>(); list.add("张无忌"); list.add("赵敏"); list.add(1,"周芷若"); System.out.println(list); list.set(1,"赵敏"); System.out.println(list); list.remove("赵敏"); System.out.println(list); list.removeAll(list); System.out.println(list); System.out.println(list.isEmpty()); System.out.println("==================="); LinkedList link = new LinkedList<>(); link.add(1); link.add(2); link.add(3); link.add(4); System.out.println(link); link.addFirst(5); link.addLast(111); System.out.println(link); link.removeFirst(); link.removeLast(); System.out.println(link); // 也是加 offer link.offerFirst(99); link.offerLast(88); System.out.println(link); // 也是删 poll link.pollFirst(); link.pollLast(); System.out.println(link); ``` **ArrayList与LinkedList区别** **相同点** ArrayList和LinkedList都实现了List接口(及父接口),因此具有相同的功能。 **不同点** **ArrayList底层数据结构是数组。数组中的元素在物理上连续,逻辑上也连续**。因此ArrayList增、删比较费时。ArrayList在插入元素的时候,需要先将元素整体后移,再插入数据。插入的位置越靠前,移动的元素越多。ArrayList在删除元素的时候,需要将元素整体前移。删除的元素位置越靠前,移动的元素越多。但根据下标查找元素效率极高,因为数组在内存中是连续的存储空间,给出下标能快速定位到元素。

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

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

相关文章

2024AICoding公司全景图及评分

AI Coding背景 AI coding 领域的产品和公司在 2024 年开始爆发了&#xff0c;主要涉及技术进步、市场需求和开发者生态系统的变化。 本文会从技术背景&#xff0c;市场需求&#xff0c;生态以及相关评分为大家完整梳理一下相关内容。 底层技术 大规模预训练模型 技术背景&#…

C#使用OPC组件方式和AB的PLC通信

目录 一、PLC硬件配置 1、创建PLC程序 &#xff08;1&#xff09;程序工程选择 &#xff08;2&#xff09;变量和程序 2、配置程序在模拟器中运行 &#xff08;1&#xff09;打开RSLkin Classic &#xff08;2&#xff09;仿真器配置 &#xff08;3&#xff09;PLC程序…

我终于搭建完成了我的个人网站!(仅分享,非教程)

先看看我的个人网站~ https://yaoqx.pages.devhttps://yaoqx.pages.dev 来看看我搭建的过程吧&#xff01; &#xff08;仅分享&#xff0c;非教程&#xff09; 网站技术 前端框架&#xff1a;Astro主题&#xff1a;Frosti代码托管&#xff1a;Github网页部署&#xff1a;Cl…

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码&#xff0c;中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to 然后我用终端敲ssh的命令连接&#xff0c;结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish connectio…

浮点数如何存储

一、浮点数存储格式 符号&#xff08;sign&#xff09; s是符号位&#xff0c;1表示负&#xff0c;0表示正阶码&#xff08;exponent&#xff09; E的作用是对浮点数加权&#xff0c;这个权重是2的E次幂尾数&#xff08;significand&#xff09; M是一个二进制小数 二、举例说…

被爬网站用fingerprintjs来对selenium进行反爬,怎么破?

闲暇逛乎的时候&#xff0c;看到了这个问题&#xff1a; Fingerprintjs实际上就是专门用来识别和追踪浏览器的&#xff0c;要应对起来&#xff0c;确实并非易事。那么&#xff0c;我们要如何应对FingerprintJS的唯一标记技术呢&#xff1f; 接下来&#xff0c;我们将一起来探讨…

【自学深度学习梳理2】深度学习基础

一、优化方法 上一篇说到,使用梯度下降进行优化模型参数,可能会卡在局部最小值,或优化方法不合适永远找不到具有最优参数的函数。 1、局部最小值 梯度下降如何工作? 梯度下降是一种优化算法,用于最小化损失函数,即寻找一组模型参数,使得损失函数的值最小(局部最小值…

【Python体验】第五天:目录搜索、数据爬虫(评论区里写作业)

文章目录 目录搜索 os、shutil库数据爬虫 request、re作业&#xff1a;爬取案例的top250电影的关键信息&#xff08;名称、类型、日期&#xff09;&#xff0c;并保存在表格中 目录搜索 os、shutil库 os 模块提供了非常丰富的方法用来处理文件和目录。 os.listdir(path)&#x…

STM32的外部中断实现按键控制led灯亮灭(HAL库)

一&#xff1a;stm32外部中断概述 1&#xff1a;stm32的外部中断线 STM32的每个IO都可以作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0~15&#xff1a;对应外部IO口的输入中断。 线16&#xff1a;连接到PVD输出。 线17&#xff1a;连接到R…

后端采用SpringBoot框架开发的:ADR药物不良反应智能监测系统源码,用于监测和收集药品在使用过程中发生的不良反应的系统

ADR药物不良反应智能监测系统是一套用于监测和收集药品在使用过程中发生的不良反应&#xff08;Adverse Drug Reaction, ADR&#xff09;的系统。该系统基于医院临床数据中心&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管理、知识库查询、统计分析等功能&#x…

【Python学习手册(第四版)】学习笔记11.2-表达式语句(print函数)及打印操作(重定向等)详解

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 主要介绍表达式语句&#xff08;print函数&#xff09;及打印操作&#xff08;重定向等&#xff09;。视需要选择目录阅读。 目录 表达式语句 错误示例&#xf…

实验3-7 统计学生成绩

//实验3-7 统计学生成绩 /* 本题要求编写程序读入N个学生的百分制成绩&#xff0c;统计五分制成绩的分布。 百分制成绩到五分制成绩的转换规则&#xff1a;大于等于90分为A&#xff1b;小于90且大于等于80为B&#xff1b;小于80且大于等于70为C&#xff1b;小于70且大于等于60为…

相机标定(Camera Calibration)

什么是 相机标定&#xff08;Camera Calibration&#xff09;&#xff1f; 相机标定&#xff08;CameraCalibration&#xff09;是确定相机内部参数&#xff08;如焦距、光学中心、畸变系数等&#xff09;和外部参数&#xff08;如相机在世界坐标系中的位置和姿态&#xff09;的…

黑马头条vue2.0项目实战(三)——个人中心功能的实现

1. Tabbar 处理 通过分析页面&#xff0c;可以看到&#xff0c;首页、问答、视频、我的 都使用的是同一个底部标签栏&#xff0c;我们没必要在每个页面中都写一个&#xff0c;所以为了通用方便&#xff0c;我们可以使用 Vue Router 的嵌套路由来处理。 父路由&#xff1a;一个…

激发潜能,Vatee万腾平台驱动企业持续发展

在当今这个日新月异的商业环境中&#xff0c;企业要想保持竞争力并实现持续发展&#xff0c;就必须不断挖掘自身潜能&#xff0c;探索新的增长点。而Vatee万腾平台&#xff0c;正是这样一位能够激发企业潜能、驱动其持续发展的强大伙伴。 一、智能化赋能&#xff0c;解锁企业潜…

了解ISO 22301:业务连续性管理的关键

在当今全球化和复杂化的商业环境中&#xff0c;企业面临着各种潜在的风险和灾难&#xff0c;这些可能对其运营和声誉造成严重影响。为了有效地应对这些挑战并保障持续经营&#xff0c;国际标准化组织&#xff08;ISO&#xff09;引入了ISO 22301标准&#xff0c;这是一项专注于…

智能制造与工业物联网CC2530——定时器查询和中断

一、项目目的&#xff1a; 熟悉 ZigBee 模块相关硬件接口。使用 IAR 开发环境设计程序&#xff0c;学习 CC2530 定时器的使用&#xff0c;利用 CC2530 的定时器 T1 查询方式控制 LED 周期性闪烁。 二、项目原理&#xff1a; LED及按键原理图&#xff0c;如下图所示&#xff…

使用“阿里云人工智能平台 PAI”制作数字人

体验 阿里云人工智能平台 PAI PAI-DSW免费试用 https://free.aliyun.com/?spm5176.14066474.J_5834642020.5.7b34754cmRbYhg&productCodelearn https://help.aliyun.com/document_detail/2261126.html 体验PAI-DSW https://help.aliyun.com/document_detail/2261126.…

一文详解香港机房服务器干什么用的

香港机房服务器干什么用的&#xff1f;香港机房服务器是用于数据存储和备份、网络服务、数据处理与分析、云计算服务、游戏托管服务、其他服务等。香港机房服务器在现代互联网业务中扮演着至关重要的角色&#xff0c;其主要用途可以归纳为以下几个方面&#xff1a; 1、数据存储…

卡拉OK歌唱比赛活动策划方案

一、活动详细策划 &#xff08;一&#xff09;、前期工作准备 1、制定详细的策划方案、比赛流程&#xff0c;通知稿。 2、收集各参赛选手详细资料在选手上台前展示出&#xff0c;让各评委及嘉宾对选手有个初步认识。 3、各工作组准备好相关道具&#xff08;音响、无线话筒、低…