集合 (Java)
集合
单列集合
红色:接口
蓝色:实现类
双列集合
数据结构
栈
队列
数组
链表
树
二叉树
二叉查找树
添加节点:
- 小的存左边
- 大的存右边
- 一样的不存
遍历方式:
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
弊端:长短腿 -> 解决方案:平衡二叉树
平衡二叉树
旋转机制
规则:
- 左旋
- 右旋
触发时机:当添加一个节点之后,该树不再是一颗平衡二叉树
左旋:
右旋:
需要旋转的四种情况:
- 左左:一次右旋(当根节点左子树的左子树有节点插入,导致二叉树不平衡。下面同上)
- 左右:先局部左旋,再整体右旋
- 右右:一次左旋
- 右左:先局部右旋,再整体左旋
红黑树
数据结构:
红黑规则:
添加规则:
泛型
1 | import java.util.ArrayList; |
泛型类
1 | import java.util.Arrays; |
泛型方法
1 | import java.util.ArrayList; |
泛型接口
1 | import java.util.Collection; |
通配符
泛型的继承和通配符:
- 泛型不具备继承性,但是数据具备继承性
1 | import java.util.ArrayList; |
Collection
方法
1 | import java.util.ArrayList; |
遍历
遍历方式:
- 迭代器
- 增强for(普通for:依赖于索引,只能用于List系列,Set系列没有索引,无法用)
- Lambda表达式
迭代器
1 | import java.util.ArrayList; |
增强for
快速生成:集合名字 + for
lambda
1 | import java.util.ArrayList; |
List
Vector已经被市场淘汰
方法
1 | import java.util.ArrayList; |
遍历
1 | import java.util.ArrayList; |
ArrayList
ArrayList
类:一个可调整大小的数组,在java.util
包中数组和
ArrayList
的区别:数组大小不能修改,ArrayList可以注意:ArrayList是java已经创建好的类,在底层做了一些处理,打印对象时不是地址值,而是集合中存储的数据内容,以
[]
把所有数据进行包裹
创建
1 | import java.util.ArrayList; |
构造方法:
方法名 | 说明 |
---|---|
public ArrayList() | 创建一个空的集合对象 |
方法
方法名 | 说明 |
---|---|
public boolean add(E e) |
添加元素到末尾,返回值表示是否添加成功 |
public boolean remove(E e) |
删除指定元素,返回值表示是否删除成功 |
public E remove(int index) |
删除指定索引的元素,返回被删除的元素 |
public E set(int index,E e) |
修改指定索引处的元素,返回原来的元素 |
public E get(int index) |
获取指定索引处的元素 |
public int size() |
获取集合中的元素的个数 |
删除所有元素:.clear()
遍历:
for
1
2
3for (int i = 0; i < cars.size(); i++) {
System.out.println(cars.get(i));
}for - each
1
2
3for (String i : cars) {
System.out.println(i);
}
**排序: **
- 升序:
Collections.sort(...);
- 降序:
Collections.sort(..., Collections.reverseOrder());
底层原理
添加第一个元素:
一次添加多个元素:
LinkedList
方法
底层原理
迭代器源码
Set
特点:
- 无序:存取顺序不一致
- 不重复:可以去重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
实现类:
- HashSet:无序、不重复、无索引
- LinkedHashSet:有序、不重复、无索引
- TreeSet:可排序、不重复、无索引
Set接口中的方法上基本与Collection的API一致
方法
遍历
- 迭代器
- 增强for
- lambda
1 | import java.util.HashSet; |
HashSet
底层原理:
- HashSet集合底层采取哈希表存储数据
- 哈希表是一种对于增删改查数据性能都较好的结构
哈希表组成:
- JDK8之前:数组+链表
- JDK8开始:数组+链表+红黑树
底层原理
哈希表:数组+链表+红黑树(JDK8)
1 | import java.util.HashSet; |
LinkedHashSet
TreeSet
特点:
- 不重复、五索引、可排序
- 可排序:按照元素的默认规则(由小到大)排序
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
1 | import java.util.Iterator; |
TreeSet集合默认规则:
- 对于数值类型:Integer,Double,默认按照从小到大的顺序进行排序
- 对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序
- 自定义类型:两种比较方式
两种比较方式
方式一(默认规则):
- Integer,Double默认升序,无法用方法一
- 字符串默认ASCII对应数字排序,无法用方法一
1 | import java.util.TreeSet; |
方式二
1 | import java.util.Comparator; |
Map
方法
1 | import java.util.HashMap; |
遍历
遍历方式:
- 键找值
- 键值对
- lambda
键找值
1 | import java.util.HashMap; |
键值对
1 | public class MapDemo02 { |
lambda
1 | import java.util.HashMap; |
HashMap
LinkedHashMap
1 | import java.util.LinkedHashMap; |
TreeMap
两种比较方式
方式一(默认):无法修改Javabean源码时用方式二(Integer,Double,String等已定义好的对象)
1 | import java.util.TreeMap; |
方式二
1 | import java.util.Comparator; |
可变参数
1 | public class Main { |
Collections
- java.util.Collections:是集合工具类
- 作用:Collections不是集合,而是集合的工具类
1 | import java.util.ArrayList; |
不可变集合
不可变集合:不可以被修改的集合
- 长度不能修改
- 内容不能修改
应用场景:
- 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践
- 或者当集合对象被不可信的库调用时,不可变形式是安全的
不可变的List集合
1 | public class ImmutableDemo1 { |
不可变的Set集合
1 | public class ImmutableDemo2 { |
不可变的Map集合
键值对个数小于等于10
1 | public class ImmutableDemo3 { |
键值对个数大于10
1 | public class ImmutableDemo4 { |
Stream流
使用步骤:
- 先得到一条Stream流(流水线),并把数据放上去
- 使用中间方法对流水线上的数据进行操作
- 使用终结方法对流水线上的数据进行操作
1 | public class StreamDemo { |
获取
1 | import java.util.ArrayList; |
中间方法
1 | import java.util.ArrayList; |
终结方法
收集到数组:
1 | import java.util.ArrayList; |
收集到集合:
1 | import java.util.*; |
方法引用
1 | import java.util.Arrays; |
引用静态方法
1 | import java.util.ArrayList; |
引用成员方法
1 | import java.util.ArrayList; |
引用构造方法
1 | import java.util.ArrayList; |
其他调用方式
类名引用成员方法
1 | import java.util.ArrayList; |
引用数组的构造方法
1 | import java.util.ArrayList; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 zerd1y-Blog!