首先声明本文均为个人学习笔记,可能会有所差错,
如果发现错误请大佬们在评论区指正,多谢[抱拳.jpg]
数据结构(栈)
特点:后进先出,先进后出
数据进入栈模型的过程称为:压/进栈 或 弹/出栈
数据结构(队列)
特点:先进先出,后进后出
数据从后端进入队列模式的过程称为:入队列
数据从前端离开队列模式的过程称为:出队列

数据结构(数组)
特点:
查询速度快:查询通过地址值和索引定位,查询任意数据耗时相同
删除效率低:删原始数据,同时需要后面数据前移
添加效率极低:添加位置后的每个数据后移,再添加元素
数据结构(链表)

前一个节点记录后一个节点的地址
注:链表中的结点是独立的对象,在内存中不连续,
每一个节点包含数据值和下一个结点的地址
缺点:链表查询速度慢,因为无论查询那个数据都需要从头开始找
优点:链表增删相对快
ex:假设需要在结点1和结点2中间添加一个结点3
那么只需要将结点3后面的地址改为结点2的地址值,并且将
结点1的地址改为结点3的地址值
如果要删除结点3则只需要将节点1的地址指向结点2或者结点n然后删除结点3


数据结构(树)
关于树的一些定义:
度:每一个节点的子节点称之为度,在二叉树中任意节点的度<=2
树高:树的总层树称之为树高
根节点:最顶点的节点
左子结点:左下方的节点
右子节点:右下方的节点
数据结构(二叉查找树)
二叉查找树,又称为二叉排序树或者二叉搜索树
① 每一个节点上最多有两个子节点
②任意节点左子树上的值都小于当前节点
③任意节点右子树上的值都大于当前节点
添加节点规则:小的存左边,大的存右边,一样的不存
数据结构(二叉树)前序遍历
从根节点开始,然后按照当前节点,左子结点,右子节点的顺序遍历
中序遍历
从最左边的子节点开始,然后按照左子结点,当前节点,右子节点的顺序遍历
后序遍历
左子结点——>右子节点——>当前节点
层序遍历
一层一层遍历
ArrayList集合底层原理
1.使用空参创建的集合,在底层创建一个默认长度为0的数组
2.添加第一个元素时,底层会创建一个新的长度为10的数组
3.存满时,会扩容1.5倍
4.如果一次性添加多个元素,在原先的1.5倍长度也存储不下时,则新创建数组的长度,以实际为准。 ex:假设n(n>15)条数据同时插入,则长度就是 n+10
LinkedList集合底层原理和迭代器底层原理
额这个还没有总结好以后再发[抱歉.jpg]
泛型深入
泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查
泛型格式:<数据类型>
注:泛型只能支持引用数据类型 ex:Integer Boolean String
好处:1、统一了数据类型
2、把运行时期的问题提前到了编译期间,避免了强制类型转换
可能出现的异常,因为在编译阶段就能确定下来。
注:1.泛型中不能写基本数据类型
2.指定泛型的具体类型后,传递数据时,可以传入该类型或子类类型
ArrayList<Animal> list = new ArrayList<>();
list.add(new Animal());
list.add(new Dog());
list.add(new Cat());
在上述代码中Dog类和Cat类均为Animal类的子类类型所以可以添加到泛型为<Animal>的list中
3.如果不写泛型,则默认为Object类型(几乎不会这样)
泛型的三种形态
一、泛型类
①使用场景:当一个类中,某个数量的数据类型不确定时,就可以定义带有泛型的类
格式: 修饰符 class 类名<泛型类型>{
}
public class ArrayList<E>{
}
二、泛型方法
②方法中形参类型不确定时,可以使用类名后面定义的泛<E>
格式: 修饰符 <泛型类型> 数据类型 方法名 (类型 变量名){
}
public <E> boolean add(E e){
}
方法中形参类型不确定时
法一:使用类名后面定义的泛型 所有方法都可以使用
法二:在方法申明上定义自己的泛型 只有本方法可以使用
三、泛型接口
格式:修饰符 interface 接口名<类型>{
}
public interface List<E>{
}
如何使用?
法一:实现类给出具体类型
ex: public class 接口名 implements List<String>{
重写List接口中所有的抽象方法;
}
法二:实现类延续泛型,创建对象时再确定
ex: public class 接口名<E> implements List<E>{
重写List接口中所有的抽象方法;
}
泛型的继承和通配符
·泛型本身不具备继承性,但是数据具备继承性
package a03mygenerics;
import java.util.ArrayList;
public class GenericsDemo3 {
public static void main(String[] args) {
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
method(list1);
method(list2);
method(list3);
}
/*
此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
写<E>的弊端:
利用泛型方法有一个小弊端,此时他可以接受任意的数据类型
Ye Fu Zi student
希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu Zi
此时我们就可以使用泛型的通配符:
?也可以表示不确定的类型
他可以进行类型的限定
? extends E:表示可以传递E或者E所有的子类类型
? super E:表示可以传递E或者E所有的父类类型
应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符:
关键点:可以限定类型的范围。
*/
public static void method(ArrayList<? extends Ye> list){
}
class Ye{
}
class Fu extends Ye{
}
class Zi extends Fu{
}
}
此时,泛型里面写的是什么类型,那么只能传递什么类型的数据。
写<E>的弊端:
利用泛型方法有一个小弊端,此时他可以接受任意的数据类型
Ye Fu Zi student
希望:本方法虽然不确定类型,但是以后我希望只能传递Ye Fu Zi
此时我们就可以使用泛型的通配符:
?也可以表示不确定的类型
他可以进行类型的限定
? extends E:表示可以传递E或者E所有的子类类型
? super E:表示可以传递E或者E所有的父类类型
应用场景:
1.如果我们在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口。
2.如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以泛型的通配符
泛型的通配符:
关键点:可以限定类型的范围。
泛型深入·总结
1.什么是泛型?
JDK5引入的特性,可以编译阶段约束操作的数据类型,并进行检查
2.泛型的好处?
统一数据类型
把运行时期的问题提前到了编译期间,避免了强制类型转换
可能出现的异常,因为在编译阶段类型就能定下来
3.泛型的细节?
泛型中不能写基本数据类型只能是引用数据类型 ex:String Integer Boolean等
指定泛型的具体类型后,传递数据时,可以传入该类型和它的子类类型
如果不写泛型,那么类型默认是Object
4.哪里定义泛型?
泛型类:在类名的后面定义泛型,然后创建该类对象的时候,确定泛型类型
泛型方法:在修饰符后面写泛型类型定义方法,调用该方法时,确定泛型类型
泛型接口:接口名后面定义泛型,由它的实现类确定泛型类型或者实现类延续泛型
5.泛型的继承和通配符
泛型本身不具备继承性,但是它的数据具备继承性
泛型的通配符:?(表示不确定泛型类型)
?extend E:表示可以传递E或者E所有的子类类型
?super E:表示可以传递E或者E所有的父类类型
6.使用场景
在我们定义类、方法、接口的时候,如果我们不能确定具体类型,那么我们就可以定义泛型
在我们定义泛型方法时,形参中如果不能确定类型,但是我们知道是哪个父类的子类那么我们就可以使用泛型的通配符? extends 父类类名

1245

被折叠的 条评论
为什么被折叠?



