多态(polymorphism)
一个演员扮演多个不同角色。可以减少if语句的使用。
概念
具有接口或者继承关系
A extends B
A implement C
类型一致(IEat)
民间说法:父类的引用指向不同的子类对象(不同时刻)

产生不同结果
调用相同方法,产生不同结果。——方法重写(覆盖)

tips:ASAP–类似中文的“哈哈,呵呵”
匿名内部类
概念:没有类名,也不是单独文件



Fruit类
sort()给水果价格排序

Replace with lambda





前后对比

lambda表达式
------>可以简化函数(方法)的写法
只有一个方法时


灰色表示可以简写/可省略

再写一个方法drink()在接口
此时就用匿名内部类了(接口不用写实现)
力扣:4. 寻找两个正序数组的中位数


简单法
优化下
击败100%
高手刷题建议:不要加sout

集合法:不是很快

集合
两个中心:

框架
帮助类xxxS:Collections,Arrays。。。

有啥用
- 对多个数据的操作数据结构。
数组缺点
- 指定位置增加困难,删除困难。------ LinkList(链表)
- 数组长度固定
和数组有关的集合
将数组包装为一个高级的数据结构 CRUD
List
<泛型>
- 只能放对象,int不行得要包装类Integer

不写<>----没有限定
加上方便取,why规定了类型

实现类

ArrayList古老的数组,但还是数组,
只不过你看不出来这个别人帮你包装好的数组
API
先写main

所有方法:
默认长度:10

grow扩容
本质:创建一个新数组,数组容量在原数组的基础上增加>>1(一半)
即:扩容1.5倍

何时扩容
10–>15

快满的时候扩容:size+1>10

数组过于频繁,效率降低

Api方法介绍
add()
数组尾部添加 ——list.add(e);
package com.ffyc.collection.ListDemo;
import java.util.ArrayList;
import java.util.List;
public class LinkDemo02 {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
List<Integer> list2 = new ArrayList<>();
list2.add(3);
list2.add(4);
list1.addAll(list2);
System.out.println(list1);
}
}

addAll()


remove(index)
for(int i = 0;i<list1.length;i++){
list1.remove(i);
i--;
}
删除所有方法:迭代器——安全(遍历)
//删除all数据:迭代器删法:安全
Iterator<Integer> it = list1.iterator();
while (it.hasNext()){//外面的来删,看有没有下一个
if(it.next() != null){
it.remove();
}
}
高阶:

11

get(index)

set(index,值)

Collections
.sort()
max
api
任务:随机放入10个数(1~20),要求数字不重复,使用迭代器list.forEach()

集合关系图

LinkedList
对比

数据结构与算法


线性

代表:数组,链表
非线性
| 编号 | 操作 | 动态数组ArrayList | 链表LinkedList |
|---|---|---|---|
| 1 | 添加 | 低 | 高 |
| 2 | 删除 | 低 | 高 |
| 3 | 查询 | 高 | 低 |
| 4 | 修改 | 高 | 低 |
Vector向量——检测线程安全
底层数组 ArrayList(1.5),Vector(2*old)



sy:同步
List的三大实现类

Link集合存储自定义对象
Dog类
name ,brand, price ,weight
list

找对象,记得重写equals

index找到对象/字符存在的位置。
删除
- iteaa’r for循环 回减一个

排序

Camparator类,匿名内部类


Set——存储的数据是唯一的,不允许重复。
底层数据结构:Map
Api

一个子接口
如何遍历

27.344任务Set做法
package com.ffyc.collection.Set;
import java.util.*;
public class SetDemo {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
Random random = new Random(System.currentTimeMillis());
Random random1 = new Random(new Date().getTime());
while (set.size()<10){//生成10个随机数
set.add(random1.nextInt(20)+1);
}
System.out.println(set);
set.remove(6);//删对象
System.out.println(set);
//查询
for (int tmp : set){
System.out.println(tmp);
}
System.out.println("-------forEach-----");
set.forEach(t-> System.out.println(t));
System.out.println("-----iterator-------");
Iterator<Integer> it = set.iterator();
System.out.println(set);
// set.stream().sorted();
// System.out.println(set);
}
}

去重原理
对象的equals,hashcode。要重写,add对象的时候是互斥的,后面相同的都进不去,只有第一个进去。
Set自动寻找hashcode和equals。

HashSet是无序的


变有序

隆重推出:LinkedLinkHashSet(和输入顺序一致)









![解决报错【ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问。】](https://i-blog.csdnimg.cn/direct/33d1293178034e9a8065a4390eae3c41.png)











