面向对象进阶5

一、集合概述

集合与数据都是容器

  • 数组定义完成并启动后,类型确定,长度固定
  • 在进行增删数据操作的时候,数组是不太合适的,增删数据都需要放弃原有的数组或者移位。
  • 当业务数据的个数是固定的,且都是同一批数据类型的时候,可以采取定义数组存储。

  • 集合是Java中存储对象数据的一种容器
  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。集合更像气球。
  • 集合适合做元素的增删操作
  • 注意:集合中只能存储引用类型的数据,如果要存储基本类型数据可以选用包装类
  • 数据的个数不确定,需要进行增删元素的时候,选择集合。

二、Collection集合的体系特点

集合类体系结构
集合:Collection–单例、Map–双列

  • Collection单列集合,每个元素(数据)只包含一个值;
  • Map双列集合,每个元素包含两个值(键值对)。
  • 注意:前期先掌握Collection集合体系的使用。

在这里插入图片描述
集合对于泛型的支持

  • 集合支持泛型,可以在编译阶段约束集合只能操作某种数据类型
    在这里插入图片描述
    注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都是认为是对象
    如果集合中要存储基本数据类型怎么办?----使用包装类
    在这里插入图片描述

三、Collection集合常用API

  • Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
    在这里插入图片描述

四、Collection集合的遍历方式

方法1:迭代器

  • 遍历是一个一个的把容器中的元素访问一遍
  • 迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式
    Collection 集合获取迭代器

方法2:foreach/增强for循环

  • 既可以遍历集合也可以遍历数组
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于迭代器的简化写法。
  • 实现一个Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了Iterable接口
    在这里插入图片描述

方法3:lambda表达式

  • 得益于JDK8,更直接的遍历集合的方式
    在这里插入图片描述

五、Collection集合存储自定义类型的对象

在这里插入图片描述

六、常用数据结构

数据结构概述、栈、队列
数组
链表
二叉树、二叉查找树
平衡二叉树
红黑树

七、List系列集合

1.List集合特点、特有API

  • List集合因为支持索引,所以多了很多索引操作的独有API,其他Collection的功能List也都继承了。
    在这里插入图片描述

ArrayList/LinkedList:有序、可重复、有索引

  • ArrayList底层基于数组实现,查询元素快,增删相对慢
  • LinkedList底层基于双链表实现,查询元素慢,增删首尾元素非常快

2.List集合的遍历方式小结

  • 迭代器
  • 增强for循环
  • Lambda表达式
  • for循环(List集合存在索引)

3.ArrayList集合的底层原理(面试热点)
ArrayList底层基于数组实现,根据索引定位元素快,增删做移位操作相对慢;
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

4.LinkedList集合的底层原理
LinkedList底层基于双链表实现,查询元素慢,增删首尾元素非常快,有许多首尾操作的API

在这里插入图片描述

八、补充知识:集合的并发修改异常问题

当从集合找出某个元素并删除时会出现一种并发修改异常问题

  • 迭代器遍历集合且直接用集合删除元素时可能出现
  • 增强for循环遍历集合并直接用集合删除元素的时候可能出现

不会出现问题:

  • 迭代器遍历集合但用迭代器自己的删除方法操作可以解决
  • 使用for循环遍历并删除元素不会存在这个问题

九、补充知识:泛型深入

  1. 泛型的概述和优势
    JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查
    格式:<数据类型>;注意:泛型只支持引用数据类型
    集合体系的全部接口和实现类都是支持泛型的使用的
  • 好处
    统一数据类型
    把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来
  1. 自定义泛型类
  • 泛型类的概述:
    定义类时同时定义泛型的类就是泛型类
    泛型类的格式:修饰符 class 类名<泛型变量>{ }
    此处泛型变量T可以随便写为任意标识,E/T/K/V等
    **作用:**编译阶段可以指定数据类型,类似集合的作用
public class MyArrayList<T>{ }
  1. 自定义泛型方法
    定义方法时同时定义泛型的方法就是泛型方法
    泛型方法的格式:修饰符<泛型变量> 方法返回值 方法名称(形参列表){ }
    **作用:**方法中使用泛型接收一切实际类型的参数,方法更具通用性
public <T> void show(T t){ }
  1. 自定义泛型接口
    使用泛型定义的接口就是泛型接口
    泛型接口的格式:修饰符 interface 接口名称<泛型变量>{ }
    **作用:**泛型接口可以让实现类选择当前功能需要操作的数据类型
public interface Data<E>{ }
  泛型接口的原理:实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都是针对于该类型的操作。
  1. 泛型通配符、上下限
  • 通配符:?
    ?可以在“使用泛型”的时候代表一切类型
    E T K V 是在定义泛型的时候使用的

  • 泛型的上下限
    ?extends Car: ?必须是Car或者其子类 泛型上限
    ? super Car: ?必须是Car或者其父类 泛型下限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值