JAVA基础篇集合&泛型

本文介绍了JAVA集合的概念,强调其与数组的区别,重点讲解了ArrayList、Collection接口及其常用功能。此外,文章还阐述了迭代器遍历集合的机制及增强for循环的使用。接着,文章深入探讨了泛型的概念,包括泛型的好处、泛型擦除以及泛型在类、方法和接口中的应用。最后,文章提到了泛型通配符和泛型限定,帮助理解泛型的灵活性和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合的概述
集合本质上是一个容器,这个容器可以存放很多数据
数组也是一个容器,集合和数组的区别,数组长度固定,可以存放任何数据类型的数据,集合长度可变,只能存放引用类型
ArrayList是一个集合,本质是在使用一个数组保存数据,他的底层是数组,初始化的时候有一个默认的长度,元素超过长度之后,它会自动扩容

Collection接口 Collection是所有单列集合的根接口
集合的体系图如下

在这里插入图片描述

Collection的常用功能
public boolean add(E e) 把给定的对象添加到当前集合中
public void clear() 清空集合中所有的元素
public boolean remove(E e) 把给定的对象在当前集合中删除
public boolean contains(Object obj) 判断当前集合中是否包含给定的对象
public boolean isEmpty() 判断当前集合是否为空
public int size() 返回集合中元素的个数
public Object[] toArray() 把集合中的元素,存储到数组中

Collection是一个接口,如果要用,需要使用实现类,最常用的实现类是ArrayList

迭代器
有一种通用遍历集合的方式,叫做迭代器遍历,可以遍历所有的单列集合
迭代器就是遍历集合的一个工具,内部有一个光标,这个光标最开始指向了集合的最开头
如何获取集合的迭代器,在集合中有一个方法叫做iterator 这个方法可以获取的迭代器对象

iterator是一个接口表示迭代器, 里面有一些方法用于集合的遍历
HasNext 判断是否有元素可以获取,如果还有元素可以获取,那么返回的结果是true
next方法获取当前光标的元素,然后把光标往后移动

迭代器遍历集合的步骤
1 调用集合的iterator方法,获取集合的迭代器对象
2 调用迭代器的hasNext方法判断当前光标位置是否有元素可以获取
3 如果有元素可以获取,那么就获取该位置上的元素,并且把光标向后移动

注意 如果使用迭代器遍历的过程中,再使用集合的方法对集合进行增删操作,那么会引发并发异常

点单的遍历方式 增强for循环 他可以遍历数组,也可以遍历集合,底层是迭代器
格式
for(数据类型 变量:容器对象 ){ 循环体 }

格式解析
数据类型:要遍历的容器中保存的是什么类型的数据,那么这个数据类型就写什么
变量名: 改变了表示容器中的每一个元素
容器:可以是一个数组,也可以是一个集合

使用for遍历集合 底层是迭代器
增强for的优缺点 优点省略了对索引的操作,语法简洁
缺点 无法对索引操作,如果遍历的过程中需要操作操作索引,还需要普通for

泛型
泛型是一种未知的,不确定的数据类型
比如ArrayList 这个E 就是一个泛型,他是一个未知的,不确定的数据类型,泛型是一种未知的数据类型,但是并不表示一直是未知的,在使用这个类创建对象的时候,会明确这个泛型表示的数据类型是什么

泛型是可以省略的,如果省略泛型,泛型相当于是Object

泛型的好吃 省略了向下转型的操作,将运行时期的问题提前到了编译时期

泛型擦除
在java中,泛型其实都是伪泛型,泛型只是在源代码阶段有效,一旦编译,泛型就会消失,俗称泛型擦除

如果定义类的时候,在类名后面加上,表示在类的范围内定义了一个泛型类T,该类也叫做泛型类,尖括号中的可以是任何字母

如果想要缩小泛型的使用范围,延后泛型的确认时间,那么可以使用泛型方法
如果将一个泛型定义在方法上,那么这个泛型只能在该方法中使用,并且该方法需要调用方法的时候才能确定

泛型方法的定义格式
修饰符<泛型> 返回值类型 方法名(参数列表){ 方法体 }

小结
如果在类上面定义泛型,那么这个泛型在整个类中都可以使用,并且在类上面定义泛型,需要使用这个类的时候才能确定这个泛型真正表示的是什么数据类型

如果在方法上定义泛型,那么这个泛型在整个方法内都可以使用,在方法上定义的泛型,需要调用的时候明确数据类型
如果在定义接口的时候在接口名的后面加上,那么这个接口就是一个泛型接口 表示在接口中定义了一个未知的,不确定的数据类型T

泛型接口的使用
实现类在实现接口的时候直接确定泛型的类型,实现类在实现接口的时候可以在接口名后面直接指定泛型的类型

实现类在实现接口的时候不指定泛型,等到实现类创建对象的时候再指定泛型
只有再定义类或者接口的时候,再当前类或者接口名后面写的尖括号才是定义泛型

泛型通配符
泛型之间没有继承关系的 比如ArrayList 并不是ArrayList的父类

如果想要让参数集合的泛型可以是任何类型,那么可以使用泛型通配符
?表示泛型通配符,可以匹配任何类型的泛型
注意 泛型通配符要用在方法参数未知被动匹配,不能主动使用

泛型限定:对泛型通配符?的取值范围进行限制<? extends A> 泛型的类型要么是A类,要么是子类,上限

<? super A> 泛型的类型要么是A类,要么是A的父类下线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值