华杉研发九学习日记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://xiahunao.cn/news/3281770.html

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

相关文章

http代理和socks5代理哪个更适合你的网络需求?

在选择HTTP代理和SOCKS5代理时&#xff0c;哪个更适合你的网络需求主要取决于你的具体使用场景和需求。以下是对两者特点及应用场景的详细分析&#xff0c;以帮助你做出更合适的选择&#xff1a; HTTP代理 特点&#xff1a; 协议层级&#xff1a;http代理工作在应用层&#x…

WebLogic:弱口令,木马反弹连接

weblogic WebLogic 是 Oracle 公司开发的应用服务器&#xff0c;主要用作开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器。它在历史上曾出现过多个安全漏洞&#xff0c;其中包括弱口令、任意文件上传、SSRF、反序列化漏洞等 常见版本&a…

CentOS通过rsync实现文件同步(daemon方式)

rsync介绍 rsync是Liunx下的远程数据同步工具&#xff0c;可快速同步多台服务器间的文件和目录&#xff0c;并可实现增量同步以减少数据的传输。 rsync有两种常用的认证方式&#xff0c;一种是rsync-daemon方式&#xff0c;另外一种是ssh方式。 daemon 方式与 ssh 方式相比有…

Docker 搭建 Minio 容器

Docker 搭建 Minio 容器 (完整详细版) 简介&#xff1a; Minio 是一个基于Apache License v2.0开源协议的对象存储服务&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。 例如图片、视频、日…

【获取Jmeter中正则获取的数据】

获取参数值保存在本地 Jmeter获取参数保存本地【三步走策略】【一】正则表达式提取器【二】BeanShell 后置处理程序【三】执行看结果 Jmeter获取参数保存本地【三步走策略】 节省人工成本之获取参数值保存本地 【一】正则表达式提取器 【二】BeanShell 后置处理程序 FileWri…

归并排序 python C C++ 图解 代码 及解析

一&#xff0c;概念及其介绍 归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效、稳定的排序算法&#xff0c;该算法是采用分治法(Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff…

下载安装docker并解决拉去镜像的connect:connection refused问题(2024.7.31亲测有效)

原文链接&#xff1a;使用国内链接安装最新docker 最近dockerhub已经不能访问了&#xff0c;使用原先的方式安装docker&#xff0c;服务器上也总是连接不上&#xff0c;所以找了种可以在国内正常安装新版docker的方式 适用系统&#xff1a;centos7 先删除本机旧的或者残留的…

书生大模型实战营闯关 - 8GB显存玩转书生大模型demo

创建开发机 创建一个使用10%GPU算力&#xff0c;cuda12.2系统的开发机&#xff0c;并启动。由于开发机的IO性能较差&#xff0c;开发机共享盘中已经创建好了本次实验所需要的conda环境 # 启动共享的conda环境 conda activate /root/share/pre_envs/icamp3_demo部署cli模型 创…

Python安装与环境配置,2024最新,超详细保姆级教程!

安装Python 来到Python官网&#xff1a;https://www.python.org/ Downloads>Windows&#xff1a; 选择想要的版本后点击进去&#xff1a; 下载后点击安装&#xff1a; 在本地电脑输入命令提示符&#xff1a;winR 环境变量配置 若执行命令提示符&#xff0c;输入Python后&…

网工必装软件,SecureCRT从零到精通,不可错过

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我的网工朋友。 相信在平时的日常工作中&#xff0c;大家经常需要通过安全的方式远程访问各种设备和服务。SecureCRT作为一款强…

SSM大学生体质管理系统-计算机毕业设计源码75960

摘要 基于SSM的大学生体质管理系统是一款综合性平台&#xff0c;融合了在线课程、健康知识、体测报告等多项功能&#xff0c;旨在为广大大学生提供全方位的健康管理服务。通过在线课程和健康知识模块&#xff0c;用户可以随时学习健康知识&#xff0c;掌握科学的健康管理方法&a…

前端面试宝典【设计模式】【1】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

C语言典型例题19

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题2.7 检查浮点型数据的舍去误差 C语言知识&#xff1a; 浮点数在C语言用有两个类型&#xff0c;有float和double类型&#xff0c;其中double类型的数据精度更高 解题思路&#xff1a; 可以将一个double类型的…

根据需求修改el-tab的默认样式

根据需求修改el-tab的默认样式 样式代码&#xff1a; <style lang"scss" scoped>//去掉了最下面的那条线:deep(.el-tabs--card > .el-tabs__header){border-bottom: none}//单独给每一项添加下边框、修改背景色:deep(.el-tabs--card > .el-tabs__heade…

【Golang 面试 - 基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

redis集群(高可用)

redis集群&#xff08;高可用&#xff09; redis集群的三种模式 主从复制 奇数 3台 1主2从 哨兵模式 3台 1主2从 cluster 集群 6台 生产中&#xff1a;333 9台 主从复制&#xff1a; 和MySQL的主从复制类似&#xff0c;主可以写&#xff0c;写入主的数据通过RDB方式把数据…

ft232 win10驱动

ft232 win10驱动 https://ftdichip.com/drivers/d2xx-drivers/

Qt for MCUs 2.8 LTS已发布

本文翻译自&#xff1a;Qt for MCUs 2.8 LTS released 原文作者&#xff1a;Qt Group高级产品经理Yoann Lopes 我们很高兴地宣布Qt for MCUs 2.8 LTS版本已发布&#xff0c;该版本带来了激动人心的新变化&#xff0c;如GUI的构建模块、构建工具工作流程的改进、对Infineon TRA…