多态(polymorphism)
一个演员扮演多个不同角色。可以减少if语句的使用。
概念![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/abc83a35aab5481aa10a27fd245e046a.png)
具有接口或者继承关系
A extends B
A implement C
类型一致(IEat)
民间说法:父类的引用指向不同的子类对象(不同时刻)
产生不同结果
调用相同方法,产生不同结果。——方法重写(覆盖)
tips:ASAP–类似中文的“哈哈,呵呵”
匿名内部类
概念:没有类名,也不是单独文件
Fruit类
sort()给水果价格排序
Replace with lambda![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3869e063265248d3b13a7483a65d364a.png)
前后对比
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(和输入顺序一致)