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

华杉研发九学习日记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();   //  10List list =new ArrayList();//  继承的Collection的方法System.out.println(list.size());        //  0System.out.println(list.isEmpty());     //  truelist.add("小猫"); //  向上转型   -->Objectlist.add("小咪");list.add(123);   // 自动装箱-->Integer    向上转型-->Objectlist.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());        //  3System.out.println(list.isEmpty());     //  falseSystem.out.println(list.contains("小猫"));    //比对数据  truelist.remove("小猫");      //  移除数据System.out.println(list.contains("小猫"));    //  falselist.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 : 泛型,当你创建对象时,来对该不定的类型定义其确定的类型,使于数据的传递//如果创建财象时,设有定文其美型。则欢认类型为0bjectpublic 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);//  如果没有定义类型,则默认为ObjectArrayTool 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.mzph.cn/pingmian/49883.shtml

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

相关文章

【计算机网络】网络层——IPv4地址(个人笔记)

学习日期&#xff1a;2024.7.24 内容摘要&#xff1a;IPv4地址&#xff0c;分类编址&#xff0c;子网&#xff0c;无分类编址 IPv4地址概述 在TCP/IP体系中&#xff0c;IP地址是一个最基本的概念&#xff0c;IPv4地址就是给因特网上的每一台主机的每一个接口分配一个在全世界…

C语言 之 理解指针(4)

文章目录 1. 字符指针变量2. 数组指针变量2.1 对数组指针变量的理解2.2 数组指针变量的初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用 5. 函数指针数组 1. 字符指针变量 我们在前面使用的主要是整形指针变量&#xff0c;现在要学…

实战练习之Linux上实现shell脚本自动化编程

实验拓扑要求 主机环境描述 注意&#xff1a; 172.25.250.101-172.25.250.105 共 5 个 IP 地址由servera.exam.com服务器进行提供。172.25.250.106 由 serverb.exam.com 服务器进行提供。 需求描述 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com Web站点&#…

A Comprehensive Study of Knowledge Editing for Large Language Models

大型语言模型&#xff08;LLMs&#xff09;在理解和生成与人类交流密切相关的文本方面表现出了非凡的能力。然而&#xff0c;一个主要的限制在于训练期间的大量计算需求&#xff0c;这是由于它们的广泛参数化而产生的。世界的动态性质进一步加剧了这一挑战&#xff0c;需要经常…

Unity UGUI 之Text 控件

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.Text是什么 UI里面写文本的&#xff08;注意是legacy Text&#xff0c;而不是TextmeshP…

前端网页打开PC端本地的应用程序实现方案

最近开发有一个需求&#xff0c;网页端有个入口需要跳转三维大屏&#xff0c;而这个大屏是一个exe应用程序。产品需要点击这个入口&#xff0c;并打开这个应用程序。这个就类似于百度网盘网页跳转到PC端应用程序中。 这里我们采用添加自定义协议的方式打开该应用程序。一开始可…

springboot项目从jdk8升级为jdk17过程记录

背景&#xff1a;公司有升级项目jdk的规划&#xff0c;计划从jdk8升级到jdk11 开始 首先配置本地的java_home 参考文档&#xff1a;Mac环境下切换JDK版本及不同的maven-CSDN博客 将pom.xml中jdk1.8相关的版本全部改为jdk17&#xff0c;主要是maven编译插件之类的&#xff0c…

mysql定时备份

为什么写这篇文章 最近项目里面需要定时备份mysql的数据&#xff0c;网上找了下&#xff0c;找到了一些比较好的解决方案。但是发现有几个地方与自己不匹配&#xff0c;我期望有如下 备份过程不能锁表&#xff0c;网上很多都是会锁表备份定时任务无法执行&#xff0c;但是手动…

【如何在Jenkins的从节点切换NPM镜像源查看和切换】

【问题】 Jenkins打包时&#xff0c;前端npm构建时很慢&#xff0c;所有需要更换镜像源 【自查】 找到Jenkins从节点上的nodejs安装的路径&#xff0c;进入bin目录 执行./npm -v查看是不能正常查看&#xff0c; [rootlocalhost bin]# ./npm -v /usr/bin/env: ‘node’: No su…

redis 基础命令

1.数据库命令 select 库名&#xff1b;切换库 flushdb 清空库 flushall 清空所有库 redis支持的数据类型有很多&#xff0c;使用最频繁的有String 字符串类型&#xff0c;List队列&#xff0c;Hash&#xff0c;Zset有序集合&#xff0c;Set集合。 2.字符串类型命令 表示k…

【Python机器学习】k-近邻算法简单实践——电影分类

k-近邻算法&#xff08;KNN&#xff09;的工作原理是&#xff1a;存在一个样本数据集合&#xff0c;也被称为训练样本集&#xff0c;并且样本集中每个数据都存在标签&#xff0c;即我们知道样本集中每一数据与所属分类的对应关系&#xff0c;输入没有标签的数据后&#xff0c;将…

Flink之重启策略

目录 1、固定延迟重启策略 2、失败率重启策略 3、不重启策略 在设置完 CheckPoint() 检查点机制后&#xff0c;不设置重启策略的话&#xff0c;&#xff0c;可以无限重启程序&#xff0c;那么设置的检查点机制也就没有什么意义了。因此&#xff0c;在生产实践中&#xff0c;…

android手势监听

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、使用四、 如何实…

昇思25天学习打卡营第17天 | CycleGAN图像风格迁移互换

通过深入学习CycleGAN模型&#xff0c;我对无监督图像到图像的转换技术有了更深的理解。CycleGAN不仅能在没有成对训练样本的情况下实现域之间的转换&#xff0c;而且在保持内容结构的同时成功转换图像风格&#xff0c;这在许多应用中都非常有用&#xff0c;如艺术风格转换、季…

VAE、GAN与Transformer核心公式解析

VAE、GAN与Transformer核心公式解析 VAE、GAN与Transformer&#xff1a;三大深度学习模型的异同解析 【表格】VAE、GAN与Transformer的对比分析 序号对比维度VAE&#xff08;变分自编码器&#xff09;GAN&#xff08;生成对抗网络&#xff09;Transformer&#xff08;变换器&…

Python从0到100(四十三):数据库与Django ORM 精讲

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

SpringMVC 控制层框架-下

五、SpringMVC其他扩展 1. 异常处理机制 1.1 异常处理概念 开发过程中是不可避免地会出现各种异常情况&#xff0c;例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题&#xff0c;甚至直接导致程序崩溃。因此&#xff0c;在开发过程中&a…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 小区小朋友统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…

AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘

AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘ 目录 AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的…