一、集合类体系结构
二、部分Collection类型对象
Collection集合特点
-
List系列集合是有序、可重复、有索引。
- ArrayList:有序、可重复、有索引
- LinkedList:有序、可重复、有索引
-
Set系列集合是无序、不重复、无索引。
- HashSet:无序、不重复、无索引
- LinkedHashSet:有序、不重复、无索引
- TreeSet:按照大小默认升序、不重复、无索引
约束存储数据
- 泛型约束: 集合是支持任意类型进行存储的。
- 引用类型约束: 集合不支持基本类型,但支持引用数据类型。
三、Collection常用API
方法 | 说明 |
---|---|
boolean add(E e) | 添加指定数据并返回添加结果 |
void clear() | 清空数据 |
boolean isEmpty() | 判断数据为空 |
int size() | 获取集合大小 |
boolean contains(Object o) | 判断集合是否包含某个元素 |
boolean remove(E e) | 删除集合中某个元素默认删除第一个 |
Object[] toArray() | 集合转对象数组 |
拓展API
方法 | 说明 |
---|---|
Collection addAll(Collection c) | 合并 |
四、Collection遍历方式
1、迭代器(Iterator)
获取迭代器
方法 | 说明 |
---|---|
Iterator iterator() | 返回迭代器对象,默认指向0索引 |
Iterator中常用方法
方法 | 说明 |
---|---|
boolean hasNext() | 询问当前位置是否有元素 |
E next() | 获取当前元素,并向下移动,注意越界(NoSuchElementException) |
示例
/*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");
/*2、获取迭代器*/
Iterator<String> integer = collection.iterator();
/*循环遍历迭代器*/
while(integer.hasNext()){
//判断有没有值
System.out.print(integer.next()); //获取值并下移
}
/*打印结果*/
我爱中国!
2、foreach
foreach实际上是重写了迭代器进行遍历。
格式:
for(数据类型 element : 数组/集合){
循环体
}
示例
/*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");
/*2、foreach遍历*/
for (String str : collection) {
System.out.print(str);
}
/*打印结果*/
我爱中国!
3、lambda
Collection类提供了一个叫做 forEach() 的方法进行遍历,该方法采用的是匿名类进行重写。
/*1、创建集合对象*/
Collection<String> collection = new ArrayList<>();
collection.add("我");
collection.add("爱");
collection.add("中");
collection.add("国");
collection.add("!");
/*2、forEach()遍历*/
//System.out::print 是将当前元素进行引用打印
collection.forEach(System.out::print);
/*打印结果*/
我爱中国!
五、常见数据结构
概念: 数据结构是计算机底层存储、组织数据的方式,合适的数据结构能提高运行效率和存储效率。
常见结构
1、栈
特点: 后进先出,先进后出。
2、队列
特点: 先进先出,后进后出
三种队列: 单进单出队列,双进单出队列,双进双出队列
3、数组
存储特点: 一块内存连续的空间。
操作特点:
- 查询速度快: 通过地址值和索引定位。
- 删除速率低: 需要移动大量元素。
- 添加速率低: 需要移动大量元素。
4、链表
存储特点: 内存中不连续,每个节点包含数据和下一个元素地址。
操作特点:
- 查询速度慢: 因为内存不连续,所以需要遍历每一个元素。
- 删除速率高: 通过指针指向更变即可完成删除。
- 添加相对速率高: 因为查询慢,所以速率较低,高效添加是通过指针指向更变即可完成删除。
两种链表: 单向链表(数据+下一地址),双向链表(上一地址+数据+下一地址)
5、二叉树
存储特点: 内存不连续,每个节点包含父节点地址,左右节点地址,数据值。
结构特点:
- 只能有一个根节点,每个节点最多支持2个直接子节点。
- 节点的度: 节点拥有的子树个数,二叉树的度不大于2。
- 叶子结点: 度为0的节点,也称为终端节点。
- 高度: 叶子结点高度为1,叶子结点的父节点高度为2,…,根节点高度最高。
- 层: 根节点在第1层,以此类推。
- 兄弟节点: 拥有共同父节点的节点互称兄弟节点。
特殊的二叉树: 二叉排序树。
6、平衡二叉树
原则: 任意节点的左右两个子树高度差不超过1,任意节点的左右两个子树都是平衡二叉树。
7、红黑树
概念: 一种自平衡的二叉排序树,1972年被称为平衡二叉B树,1978年更名为**“红黑树”**。
特点: 每一个节点可以是红或者黑,通过 “红黑规则” 进行平衡。
红黑规则
- 每个节点是红色或黑色,根节点必须是黑色。
- 如果节点没有子节点或父节点,则节点对应指针属性为Nil,这些Nil视为叶节点,叶节点是黑色。
- 如果一个节点是红色,则子节点必须是黑色。
- 每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
六、List集合
特有方法:
方法 | 说明 |
---|---|
void add(int index,E element | 指定位置插入元素 |
E remove(int index | 指定位置的元素,并返回删除元素 |
E set(int index,E element | 修改指定位置的元素,并返回修改元素 |
E get(int index | 获取指定位置的元素 |
List实现类的底层原理
1、ArrayList底层原理:
- 底层基于数组实现,根据索引定位元素,增删需要做大量元素的移位操作。
- 第一次创建集合并添加元素时,默认创建长度为10的数组。
- 当数组满元素时,自动扩容二分之一。
2、LinkedList底层原理
- 基于双链表实现,查询速度慢,增删首尾元素快(最适合实现栈与队列结构)。
- 独有方法
方法 | 说明 |
---|---|
void addFirst(E e) | 首位插入指定元素 |
void addLast(E e) | 末位插入指定元素 |
E getFirst() | 获取首位元素 |
E getLast() | 获取末位元素 |
E removeFirst() | 删除首位元素 |
E removeLast() | 删除末位元素 |
E push() | 压栈/入栈 |
E pop() | 弹栈/出栈 |
E offerLast() | 入队 |
E o |