Day22 集合,ArrayList,泛型

Day22

集合:概念 ;使用(熟悉API);深入底层原理 ;项目中的应用 ;

在这里插入图片描述

1.集合含义

  1. 集合是Java API所提供的一系列类,可以用于动态存放多个对象 (集合只能存对象)

  2. 集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合只能存储引用数据类型,不能放基本数据类型,但可以放基本数据类型的包装类)

  3. 集合类全部支持泛型,是一种数据安全的用法。

  4. 集合就是一组数据的容器,存放多个数据 --> 数组、集合

    有些集合专门用于存放数据,有些集合专门用去排序,有些集合专门去重

  5. 集合:既要存储数据,也要管理数据(增删改查)

2.集合与数组的不同

数组:一旦初始化后长度不可变,元素类型受限定(String类型的数组只能装String的数据),数组可以存储基本数据类型

集合:长度可变的序列,元素类型不受限定(一个集合可以存储多个数据类型的元素),集合只能存储引用数据类型

3.Collection家族(存储单个数据)add() remove()

List接口

特点:有序且可重复(因为List接口中添加了许多针对下标操作的方法)

实现类:

  1. ArrayList (底层 --> 一维数组)
  2. LinkedList
  3. Vector
  4. Stack

Set接口

特点:无序且不可重复 (无序不代表随机)

实现类:

  1. HashSet
  2. LinkedHashSet
  3. TreeSet

4.Map家族(存储键值对 k-v)

注意:Map不能直接遍历,但是可以间接遍历

实现类:

  1. HashMap
  2. LinkedHashMap
  3. Hashtable
  4. ConcurrentHashMap
  5. TreeMap
  6. Properties

注意:Collection,Map都是接口

5.接触ArrayList

感受一个集合可以存储多个类型的数据!!!

经验:平时不会将多个数据类型的数据存入一个集合中,因为不好管理

public class Test01 {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(100);//Integer.valueOf(100)list.add(123.123);//Double.valueOf(123.123)list.add("abc");}
}

6.ArrayList的使用

注意:

集合一旦定义了泛型,就规定了集合存储元素的类型

所以说泛型是一种数据安全的做法

public class Test02 {public static void main(String[] args) {//创建ArrayList集合的对象ArrayList<String> list = new ArrayList<>();//<String> --> 泛型//添加元素list.add("小彭");list.add("小光");list.add("小丽");list.add("小杨");list.add("小王");list.add("小李");list.add("小古");//设置指定下标上的元素list.set(1, "小张");//获取指定下标上的元素String str = list.get(1);System.out.println("获取指定下标上的元素:" + str);//小张//获取元素个数int size = list.size();System.out.println("获取元素个数:" + size);//7//将元素添加到指定下标的位置list.add(4, "小北");ArrayList<String> newList1 = new ArrayList<>();Collections.addAll(newList1, "aaa","bbb","ccc","ccc");//利用Collections工具类给集合做批量添加list.addAll(newList1);//将newList1中所有的元素添加到list集合的末尾ArrayList<String> newList2 = new ArrayList<>();Collections.addAll(newList2, "xxx","yyy","zzz","zzz");//利用Collections工具类给集合做批量添加list.addAll(4, newList2);//将newList2中所有的元素添加到list集合指定下标的位置//清空集合中所有的元素//list.clear();System.out.println("判断集合中是否包含指定元素:" + list.contains("小张"));//trueSystem.out.println("判断集合中是否包含子集合中所有的元素:" + list.containsAll(newList1));//trueSystem.out.println("获取集合中第一次出现该元素的下标:" + list.indexOf("ccc"));//13System.out.println("获取集合中最后一次出现该元素的下标:" + list.lastIndexOf("ccc"));//14System.out.println("判断集合中是否没有元素:" + list.isEmpty());//falselist.remove(0);//根据下标删除元素list.remove("小光");//根据元素删除元素list.removeAll(newList1);//删除list中包含newList1的元素(去除交集)list.retainAll(newList2);//保留list中包含newList2的元素(保留交集)List<String> subList = list.subList(1, 3);//截取开始下标(包含)到结束下标(排他)处的元素,返回新的List集合//将集合转成数组Object[] objs = subList.toArray();System.out.println(Arrays.toString(objs));//将集合转成数组String[] ss = new String[2];subList.toArray(ss);System.out.println(Arrays.toString(ss));System.out.println("--------------------------------");//遍历数据 -- for循环for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("--------------------------------");//遍历数据 -- foreachfor (String element : list) {System.out.println(element);}System.out.println("--------------------------------");//遍历数据 -- IteratorIterator<String> it = list.iterator();while(it.hasNext()){//判断是否有可迭代的元素String element = it.next();//返回下一个元素System.out.println(element);}System.out.println("--------------------------------");//遍历数据 -- ListIteratorListIterator<String> listIterator = list.listIterator();while(listIterator.hasNext()){//判断是否有可迭代的元素(看后面有没有元素,有就继续)String element = listIterator.next();//返回下一个元素System.out.println(element);}}
}

7.泛型

含义:数据安全的做法

E - element - 元素

T - type - 类型

K - key - 键

V - value - 值

注意:泛型可以设置多个,使用逗号隔开

ps:public class HashMap<K,V>{}

泛型限定:规定了泛型类型的范围

?表示什么类型都可以

? extends A 表示元素必须是A类或A的子类

? super A 表示元素必须是A类或A的父类

public class A{}
public class B extends A{}
public class Test01 {public static void main(String[] args) {}//?表示任何类型public ArrayList<?> method01(){//ArrayList<Object> list = new ArrayList<>();//ArrayList<String> list = new ArrayList<>();//ArrayList<Integer> list = new ArrayList<>();//ArrayList<A> list = new ArrayList<>();ArrayList<B> list = new ArrayList<>();return list;}//? extends A 表示A类或其子类public ArrayList<? extends A> method02(){//ArrayList<A> list = new ArrayList<>();ArrayList<B> list = new ArrayList<>();return list;}//? super A 表示A类或其父类public ArrayList<? super A> method03(){//ArrayList<A> list = new ArrayList<>();ArrayList<Object> list = new ArrayList<>();return list;}
}

7.1 泛型在项目中的应用

需求:编写通用的管理系统的接口

分析:
学生管理系统 – 管理学生
淘宝后台管理系统 – 管理用户
OA管理系统 – 管理员工

public class Test01 {public static void main(String[] args) {//用户管理系统 -- 管理的是用户对象UserManagerSystem ums = new UserManagerSystem();ums.add(new User());System.out.println("----------------------");//图书管理系统 -- 管理的是书名BookManagerSystem<String> bms1 = new BookManagerSystem<>();bms1.add("Java从入门到精通");bms1.add("MySQL从删库到跑路");//图书管理系统 -- 管理的是图书类别BookManagerSystem<String> bms2 = new BookManagerSystem<>();bms2.add("小说类");bms2.add("科技类");bms2.add("历史类");}
}

用户管理:

//管理系统的接口
public interface ManagerSystem<T> {public int add(T t);public int delete(T t);public int update(T t,int type,Object val);public int getElementIndex(T t);public T getElement(T t);	}
public class User {}
//用户管理系统
public class UserManagerSystem implements ManagerSystem<User>{@Overridepublic int add(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int delete(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(User t, int type, Object val) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getElementIndex(User t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic User getElement(User t) {// TODO Auto-generated method stubreturn null;}}

图书管理:

public class Book {}
public class BookManagerSystem<T> implements ManagerSystem<T> {@Overridepublic int add(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int delete(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(T t, int type, Object val) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getElementIndex(T t) {// TODO Auto-generated method stubreturn 0;}@Overridepublic T getElement(T t) {// TODO Auto-generated method stubreturn null;}}

注意

1.Collection 与 Map的区别

Collection 存单个值,可以获取迭代器进行遍历

Map存两个值(Key-Value),不可以获取迭代器,不能遍历(Map可以间接遍历)

注意:Collection家族有迭代器,迭代器用于遍历集合;Map家族是没有迭代器,以为着Map家族不能遍历集合,但是可以间接遍历

2.理解Set为什么是无序

无序:存入顺序和取出顺序不一致,无序不等于随机

3.ArrayList 与 LinkedList的区别

使用上的区别:

​ LinkedList添加了

​ 队列模式-先进先出(removeFirst())

​ 栈模式-先进后出(removeLast())

效率上的区别:

ArrayList底层数据结构是一维数组

LinkedList底层数据结构是双向链表

​ 添加 - 不扩容的情况:ArrayList快

​ 添加 - 扩容的情况:LinkedList快

​ 删除:LinkedList快

​ 查询:ArrayList快

​ 修改:ArrayList快

​ 注意:工作中常用ArrayList,因为很多需求都需要使用查询功能,ArrayList查询更快

总结

集合
概念
Collection vs Map
List vs Set
ArrayList的使用

泛型

​ 泛型在项目中的应用

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

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

相关文章

抖音视频评论批量采集软件|视频下载工具

《轻松搞定&#xff01;视频评论批量采集软件&#xff0c;助您高效工作》 在短视频这个充满活力和创意的平台上&#xff0c;了解用户评论是了解市场和观众心声的重要途径之一。为了帮助您快速获取大量视频评论数据&#xff0c;我们推出了一款操作便捷、功能强大的软件&#xff…

Day31|贪心算法1

贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 无固定套路&#xff0c;举不出反例&#xff0c;就可以试试贪心。 一般解题步骤&#xff1a; 1.将问题分解成若干子问题 2.找出适合的贪心策略 3.求解每一个子问题的最优解 4.将局部最优解堆叠成全局最…

Python web框架fastapi中间件与CORS详细教学

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Fastapi 景天的主页&#xff1a;景天科技苑 文章目录 fastapi中间件与CORS1、中间件1.创建中间件方法2.中间件里面添加响应头…

图章制作工具软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; 图章制作工具是一款易于操作的软件&#xff0c;可以帮助您制作各种图章。它具备强大的功能&#xff0c;如连线、内线、图符以及中心框线的设置&#…

我们距离AGI还有多远?

关于HBM那份纪要的其他反馈 上篇文章发了一篇HBM纪要小部分内容&#xff08;星球更新了另一部分&#xff09;&#xff0c;收到很多业内大佬们的反馈&#xff0c;包括颗粒计算、封装订单划分等等&#xff0c;以及是不是某通某电的一个专家。其中倒是出现一个非共识的说法&#…

Jenkins 的安装(详细教程)

文章目录 一、简介二、安装前准备三、windows 安装与启动1. 方式一2. 方式二3. 方式三 四、创建管理员用户五、常用设置1. 配置镜像地址2. 更改工作目录3. 开启可注册用户4. 全局变量配置 一、简介 官网&#xff1a;https://www.jenkins.io 中文文档&#xff1a;https://www.j…

Kubernetes: 本地部署dashboard

本篇文章主要是介绍如何在本地部署kubernetes dashboard, 部署环境是mac m2 下载dashboard.yaml 官网release地址: kubernetes/dashboard/releases 本篇文章下载的是kubernetes-dashboard-v2.7.0的版本&#xff0c;通过wget命令下载到本地: wget https://raw.githubusercont…

高级软件开发知识点

流程 算法题简历上项目用到技术、流程、遇到问题HR 准备 常考的题型和回答思路刷100算法题&#xff0c;理解其思想&#xff0c;不要死记最近一家公司所负责的业务和项目&#xff1a; 项目背景、演进之路&#xff0c;有哪个阶段&#xff0c;每个阶段主要做什么项目中技术选型…

java数据结构与算法刷题-----LeetCode687. 最长同值路径

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 深度优先&#xff0c;用下面的儿子判断2. 深度优先&#xff0…

Pytorch学习 day01(Jupyter安装、常用函数、三种编辑器的对比)

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

开发一套小程序所需的费用取决于多个因素

随着移动互联网的发展&#xff0c;小程序已经成为许多企业和个人推广业务和服务的重要工具。 不过&#xff0c;对于很多想要开发小程序的人来说&#xff0c;最大的疑问就是开发一套小程序要花多少钱。 这个问题的答案并不是固定的&#xff0c;因为开发一个小程序的成本取决于几…

#QT(串口助手-实现)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;在widget.h中加入必要文件&#xff0c;并且定义一个类指针 &#xff08;2&#xff09;如果有类的成员不知道怎么写&#xff0c;可以通过以下途径搜索 &#xff08;2&#xff09;设置串口数据 void Widget…