就业班JavaSE高级部分day03List Set
数据结构_栈:
特点: 先进后出 (FILO, First In Last Out)
入口和出口在同一侧
入栈(压栈): 将元素存入栈
出栈(弹栈): 从栈中取出元素
数据结构_队列:
特点: 先进先出 (FIFO, First In First Out)
入口和出口在两端
适用场景: 秒杀, 抢购
在线售票
处理高并发场景
数据结构_数组:
查询快,增删慢
数据结构_链表:
查询慢,增删快
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/dbaceda4bb5b418fb20152423277e1b9/da8a3236f18944beabc811df8443ae78.jpg
List接口特点:
1. 有序集合,存储元素和取出元素的顺序是一致的(存123,取123)
2. 有索引,包含一些有索引的方法
3. 允许存储重复元素
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/95ba7f19a925485087d34275ce70e8fb/d77c312182834c149820e3b27752f47d.jpg
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/eb5a067ad8484972b5ecb152c2010936/9f515adc901e4c8e832bff954b072877.jpg
ArrayList特点:
1. 底层数据类型: 数组
线程不安全,效率高
查询快
增删慢
linkedList集合特点:
1. 底层结构: 列表
2. 查询慢,增删快
3. 线程不安全,效率高
4. 包含大量操作首尾元素的方法
注意: 不能使用多态
Set接口特点:
1. 不允许存储重复元素
2. 没有索引,不能使用for循环
HashSet集合特点:
1. 继承Set方法
2. 不允许存储重复元素
3. 有索引,不能使用普通or循环(能使用迭代器和增强for循环)
4. 无序集合,存取元素的顺序可能不一样
5. 底层是哈希表结构(查询速度非常快)
哈希值:
一个十进制数值,系统随机给出,是通过将该对象的内部地址模拟出来的整数来实现
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/a0fb16655d164d09b7f7e185db86a222/60405357acd746c793d8bb7daf68af95.jpg
HashSet图解:
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/b6ddc6cffafe402bb8b0911c21496877/07e6223b452844688f6a8ffa9a4990f2.jpg
HashSet集合存储元素不重复的原理:
C:/Users/Administrator/AppData/Local/YNote/data/weixinobU7VjkOlFOSrTPAb-ROkG2i_vds/351d60ecbaba42d6a359c8f8be4ddb55/92cae5b1e5d245c795c0db8d11a79dcb.jpg
LinkedHashSet集合:
LinkedHashSet特点:
1. 元素存取有序 (存入和取出顺序一致)
2. 元素不可重复
3. 没有索引
LinkedHashSet底层数据结构:
哈希表 + 链表 (也就是: 数组 + 链表或红黑树 + 链表)
其中, 哈希表用于存储数据, 额外的链表用于记录元素添加时的先后顺序,
以便在获取元素时保持顺序一致
什么时候用List, 什么时候用Set?
要存储的元素可以重复的, 用List集合:
增删少, 用ArrayList
增删多, 用LinkedList
要存储的数据要求不重复, 或者相对一个集合去重, 用Set集合:
不要求存取顺序一致, 用HashSet
要求存取顺序一致, 用LinkedHashSet
可变参数:
JDK 5 出现. 指同一个类型的参数, "个数可变"
可变参数的本质就是一个"数组"
格式: 用在方法的参数中
修饰符 返回值类型 方法名(int... 变量名) {
// 可以直接将 变量名 当作 数组名 使用
}
方法名();
注意事项:
1. 可变参数可以传递的参数个数, 可以是 0个, 1个, 多个
2. 一个方法的参数列表中, 只能有一个可变参数
3. 如果方法的参数有多个, 可变参数必须写在参数列表的最后
java.util.Collections类: 操作集合的工具类
// 静态方法
static <T> boolean addAll(Collection<? super T> c, T... elements):往集合中添加一些元素
static void shuffle(List<?> list): 打乱集合顺序
static <T> void sort(List<T> list): 将集合中元素按照默认规则排序
static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序
sort(List<T> list): 默认按照"升序"将元素排序
数字, 字母, 都可以按照升序排序
自定义JavaBean对象默认不能排序, 因为不知道如何比较哪个对象大, 哪个对象小
自定义JavaBean对象要想排序, 需要实现 Comparable<E> 接口, 重写 int compareTo(E e) 方法
规则:
this-参数: 升序(从小到大)
参数-this: 降序(从大到小)
Collections集合工具类: sort(List<T> list,Comparator<? super T> ):
Comparable接口和Comparator接口区别
Comparable: 让JavaBean自身具有可比较性 (自己和其他人比)
Comparator: 定义一个比较器类, 用比较器对象比 (让第三个人来帮两个人比较)
Comparator使用方式:
1. 定义类实现Comparator<E>接口, 重写 int compare(E o1, E o2) 方法, 泛型为比较元素的类型
规则:
o1-o2: 升序(从小到大)
o2-o1: 降序(从大到小)
2. 在Collections.sort(List<T> list,Comparator<? super T> c)方法中传入自定义比较器对象
|
|