第一章 数据结构
1、常见的数据结构
1. 栈
2. 队列
3. 数组
4. 链表
5. 红黑树
2、各自的特点
1. 栈
特点: 先进后出。 //例如: "后吃的东西 先吐出来"
2. 队列
特点: 先进先出。 //例如: "先吃的东西 先拉出来"
3. 数组
特点: 查询快,增删慢。 //例如: ArrayList 底层就是数组结构
4. 链表
特点: 查询慢,增删快。 //例如: LinkedList 底层就是链表结构
5. 红黑树
特点: 查询速度非常快。 //例如: HashSet 集合的底层有红黑树. 想一想"猜数字游戏"
第二章 List集合
1、List集合的特点
1. 有序 //存放的顺序和取出的顺序是一致的
2. 有重复 //可以存储相同内容的数据
3. 有索引 //拥有带有索引 index 的方法
2、List集合常用的方法
1. 增
public abstract void add(int index, E element); //指定的索引位置,添加元素
2. 删
public abstract E remove(int index); //删除指定索引位置的元素,并且将该元素作为返回值,返回
3. 改
public abstract E set(int index, E element);//修改指定位置的元素,将旧的元素返回
4. 查
public abstract E get(int index); //通过指定的索引,获取对应的元素值
3、LinkedList集合常用的方法
1. 增(添加头、添加尾)
public void addFirst(E e)
public void addLast(E e)
2. 删(删除头、删除尾)
public E removeFirst()
public E removeLast()
3. 查(查询头、查询尾)
public E getFirst()
public E getLast()
4. 特殊的两个方法
public void push(E e) //内部调用的是 添加头的方法
public E pop() //内部调用的是 移除头的方法
备注: 如果想要修改头、修改尾。应该怎么办? 应该“先删除再添加”
第三章 Set集合
1、Set集合的特点
1. 无序 //存放的顺序和取出的顺序,'可能'不一样
2. 无重复 //存放的数据,不能是重复的元素。(前提:需要重写 hashcode和equals方法)
3. 无索引
注意: Set 集合是无重复的。那么我们可以用于【去重操作】
2、Set集合去重代码
//采用Set集合去重操作
public static void main(String[] args) {
//例如:List集合当中存在一些数据,数据可能有重复.想要去掉重复,怎么办?
//思路:List -> Set -> List 通过Set集合过滤一下,筛选掉重复数据!
List<String> mList = new ArrayList<>();
mList.add("真皮沙发");
mList.add("迪丽热巴");
mList.add("古力娜扎");
mList.add("马尔扎哈");
mList.add("马尔扎哈");
mList.add("迪丽热巴");
System.out.println("mList = " + mList);
//mList = [真皮沙发, 迪丽热巴, 古力娜扎, 马尔扎哈, 马尔扎哈, 迪丽热巴]
//=============
//将List集合存放在Set集合当中
Set<String> mSet = new LinkedHashSet<>(); //保证有序,采用 LinkedHashSet
//存在方法,直接将 list 和 set 来回倒手
//来自于父亲的方法Collection
//boolean addAll(Collection<? extends E> c);
//boolean addAll(Collection<E> c);
mSet.addAll(mList);
mList.clear();//清空集合
mList.addAll(mSet);
System.out.println("mList = " + mList);
//mList = [真皮沙发, 迪丽热巴, 古力娜扎, 马尔扎哈]
}
3、 HashSet底层原理
1. hash 值
hash值就是模拟的地址值。
由 hashCode()方法控制的。如果没有重写,由系统计算分配,如果重写,返回的是重写后的值。
后期都是重写的,重写的方式,由成员变量的信息控制。(hash值可能相同) "重地"和"通话" hash值相同。
2. hashSet底层原理
JDK1.8之前。数组+链表
JDK1.8之后。数组+链表+红黑树 (提升查询的效率)链表数目超过8个自动转换红黑树
3. hashSet 存储数据 add()方法原理(执行流程) //注意: 需要依赖两个方法。 hashCode 和 equals
A.先计算hash值,看hash值是否相同。//依赖于 hashCode 方法
a.相同
再比较 equals() 方法。 //依赖于 equals 方法
I. 相同。系统认定为 重复元素,不能存储
II. 不同。系统会存储在 对应hash值的下面,要么是链表,要么是红黑树
b.不同
如果不同,直接存储到 HashSet 集合当中
第四章 Collections 工具类
1、可变参数
1. 格式
修饰符 返回值类型 方法名称(数据类型... 变量名称){
....
}
2. 例如:
public static void method(int... arr){
System.out.println(arr.length); //实际上就是一个数组
}
3. 含义
在小括号里面的参数位置,数据类型的后面打上 三个点。不能多,不能少。本质是一个数组。
4. 注意事项
A. 在一个方法当中,可变参数只能有一个。
//如果有多个,分不清楚,具体的前面几个参数是第一个,后面几个参数是第二个的
B. 在一个方法当中,可变参数只能写在最后一个。
//如果可变参数写在前面,那么系统也懵逼。不清楚到哪里才算是可变参数结尾的位置。
//method(int... arr,int xx). 去调用方法 method(11,22,33,44);
2、Collections工具类对比
Collections 和 Collection 区别:
A. Collections 他是工具类。单列集合的工具类 //带有 s 的是工具类
B. Collection 他是单列集合的顶层父接口
3、Collections 工具类的方法
1. 常用的方法
public static <T> boolean addAll(Collection<? super T> c, T... elements)//向集合当中添加元素
public static void shuffle(List<?> list) //随机置换元素的位置,打乱元素顺序
public static void sort(List<T> list) //默认比较器【内部比较器】
public static void sort(List<T> list, Comparator<? super T> c) //比较器【外部比较器】
2. 比较器规则:
A. 内部比较器
a. 当前this - 传入o //升序排列(从小到大)
b. 传入o - 当前this //降序排列(从大到小)
B. 外部比较器
a. 前 - 后 //升序排列(从小到大)
b. 后 - 前 //降序排列(从大到小)