【JavaSE】集合类01

1、简介

  • 集合和数组一样,都是用来存储多个数据的结构,也可以称作叫容器。
  • 数组长度是不可变化的,一旦在初始化数组时指定了数组长度。这个长度不可变,如果需要处理数量变化的数据,数组就无法实现。而且没有办法保存有映射关系的数据(语文-90 ,数学-80)
  • 为了保存数量不确定的数据,以及具有映射关系的数据,提供了集合类。
  • 集合类主要负责保存、盛装其他数据。
  • 所有的集合类都在java.util包下,提供了一个表示和操作对象集合的统一架构。包含大量的接口和类,并 且包含了这些接口和实现类的操作算法和数据结构。

和数组处理的区别:

  • 数组的长度不可变,集合类的长度可变
  • 数组提供的方法有限,对于添加、删除、插入数据操作非常不方便 ,并且效率不高
  • 数组中存储数据的特点是:有序、可重复的 ,对于无序、不可重复的需求,不能满足。
  • 数组中可以存储基本数据类型,也可以存储引用类型。在集合中只能保存引用类型(保存的是对象 的引用地址)
  • 在集合和数组中所指的存储,指在内存层面的存储,不涉及到持久化数据。

2、泛型

2.1简介

  • 在我们自定义的集合类中,底层是Object类型的数组,在设计和声明时,不能确定这个容器里到底要存储什么类型的数据。从JDK5版本之后,引入一个新的特性——泛型,提供了编译时类型安全检测机制,该允许程序员在编译时检测到非法的数据类型。
  • 泛型允许在定义类、接口时通过一个标识来表示其中某个属性的类型或者某个方法的返回值及参数类型。本质是参数化类型,给类型指定一个参数,然后在使用时再指定参数具体的值,这样类型可以在使用时决定了。
  • 这种参数类型可以用在类、接口、方法中,分别称为泛型类、泛型接口和泛型方法。

2.2 使用泛型好处

  • 保证了类型的安全性
  • 如果没有使用泛型,在集合中存储和读取数据,都是Object类型,要将数据读取成特定类型,需要对每一个对象进行强制转换,如果存储的对象数据类型错误,在转换时会报异常
  • 消除强制转换
  • 使代码可读性更强,减少出错机会
  • 避免了不必要的拆箱封箱操作
  • 提高了代码的重用性

2.3 使用泛型

2.3.1 泛型类

  • 把泛型定义在类上,格式:public class 类名<泛型>
  • 泛型类型必须是引用类型,基本数据类型不可以
  • 定义泛型类,在类后添加一对尖括号,在尖括号中填类型参数,参数可以有多个,多个参数使用逗号分隔。例:public class MyArray< E>

2.3.2规范泛型使用字母的表示信息

  • T:Type(java类)
  • E: Element(在集合中使用,指集合中存放的元素)
  • K: Key (键)
  • V: Value(值)
  • N: Number(数值类型)
  • ? : 表示不确定的java类型

 

2.3.3  泛型接口

  • 定义方式public interface 接口名<泛型>

2.3.3 泛型方法

  • 在调用方法时指明泛型的具体类型(参数和返回值)

2.3.3.1定义格式

  • 没有返回值类型,有参数    →    public < T> void 方法名(T t){}
  • 有返回值类型,可以有参数,也可以没有参数    →    public < T> T 方法名([T t]){}

2.4 泛型通配符

用于解决泛型之间引用传递问题的特殊语法,主要分成三种情况:

  • 1.如果要从集合中获取值,使用上限通配符
  • 2.如果要向集合中放入数据值,使用下限通配符
  • 3.可以为通配符指定上限,也可以指定下限,但不能同时指定两者

<?> :

  • 无边界的通配符,主要作用是让泛型能够接受未知类型的数据。
  • 在没有赋值前,表示可以接受任何的数据类型,赋值之后,不能往里面随便添加元素。因为不知道集合的数据类型,只能做读取操作,并且读到元素当成Object实例操作,但是可以去执行revome移除和clear清空操作。
  • 用于编写可使用Object类中提供的功能使用方法时。
  • 代码使用不依赖于类型参数的泛型类中的方法时。

<? extends E>:

  • 固定上边界的通配符
  • 协变:在使用父类类型场景的地方可以改用子类类型
  • 逆变:在使用子类类型场景的地方可以使用父类类型
  • 不变:不能做到以上两点
  • 数组是可以协变的。泛型不是协变的。这种设计降低了程序的灵活性,为了解决这个问题,设计出固定上边界的通配符。能够接受指定类及其子类类型的数据。
  • 虽然用的是extends关键字,但不限于继承了父类的子类,也可以使用接口的实现类
  • 使用上限通配符只能从集合中获取值,而不能将值放入集合中。

<? super E>:

  • 固定下边界的通配符
  • 接受指定类及其父类类型(或接口)的数据
  • 可以读取到集合的数据,按照Object类型处理
  • 可以向方法中填加元素,填加的只能是指定类或其子类类型的对象,不能填加父类或接口类型的对
  • 象定义格式
  • 没有返回值类型,有参数    →    public < T> void 方法名(T t){}
  • 有返回值类型,可以有参数,也可以没有参数    →    public < T> T 方法名([T t]){}

3.Java集合类框架

3.1 ArrayList

  • CollectionListSet父接口,里面包含了一些公用的方法
  • List: 是一个有序的,不唯一接口
  • ArrayList: List的一个实现类,底层数据结构是数组

3.1.1常用方法

  • add(Object obj):在集合后面加入元素,会返回一个boolean类型的值
  • add(int index,Object obj):在指定索引位置前面插入一个元素
  • size():获取当前集合中元素的个数
  • isEmpty():判断当前集合中是否为空
  • clear(): 从集合中删除所有元素
  • addAll(Collection c):在当前集合中加入另一个集合的元素,要求两个集合使用的泛型相同addAll(intindex,Collection c):在当前集合指定位置之前,加入另一个集合的元素
  • remove(int index):移除指定索引位置的元素,并将该元素返回
  • remove(Object obj): 移除对应元素,如果有多个相同值,只移除第一个找到的元素,如果是整数类型要封装成包装类。返回boolean类型的值,是否移除成功
  • removeAl(Collection c):从当前集合中移除参数集合中所有包含的元素
  • retainAll(Collection c):在当前集合中保留参数集合中所有包含的元素
  • conatins(Object o):判断当前集合中是否包含给定参数的元素,返回boolean类型的值containsAll(Collectionc):判断当前集合中是否包含给定参数集合的所有元素
  • toArray():以正序方式,返回一个包含所有元素的对象数组
  • indexOf(Object):查找参数在当前集合中第一次出现的索引位置
  • lastIndexOf(Object):查找参数在当前集合最后一次出现的索引位置
  • subList(int index,int end):对当前集合进行截取,从起始位置(包含)截取到结束位置(不包含),返回一个新的List集合
  • iterator():获取集合的迭代器
  • Iistlterator0):获取集合的List迭代器
  • set(int index,Object obj):设置索引位置的元素为第2个参数数据

3.2  lterator和Listlterator

  • lterator 可以遍历List集合,也可以遍历Set集合,Listlterator只能遍历List集合
  • lterator只能单向遍历(向后遍历),Listlterator双向遍历(向前/向后遍历)
  • Listlterator继承lterator接口,添加新的方法

常用方法:

  • add(E e):将指定的元素插入集合中,插入位置为迭代器当前位置之前
  • hasNext():正向遍历集合,判断后面是否还有元素,返回boolean类型值
  • next():返回集合中迭代器指向后面位置的元素
  • nextlndex():返回集合中迭代器后面位置元素的索引
  • hasPrevious():反向遍历集合,判断前面是否还有元素,返回boolean类型值
  • previous():返回集合中迭代器指向前面位置的元素
  • previousIndex():返回集合中迭代器前面位置元素的索引
  • set(E e):替换迭代器当前位置的元素

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值