数据结构与算法概述
什么是数据结构
**[数据结构[英语:data structure)]**是计算机中存储、组织数据的方式。
数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。
什么是算法?
**[算法(Algorithm)]**是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。

什么是程序?
开发工具
数据结构算法开发工具: idea
tips: 建议不要开启AI功能,自己去尝试理解算法,自己练一下才能真正理解。
JDK: 1.8+
常用刷题网站
数组
线性和非线性
线性: 除首尾,只有一个唯一前驱和后继。 数组,链表
line list
数组是什么?
数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。它是最简单的数据结构之一,大多数现代编程语言都内置数组支持。

数组的特性
存储类型一致
数组中的类型一致。Java–面向对象 —>继承
A a = new B();
B extends A;
People[] a = new People[10];
a[i] = 小孩;


int[] a = new int[10];
空间长度固定
数组在内存中的空间是固定的,是在定义数组时指定。

int[] a = new int[3];
int[] a = {1,5, 4};
定义数组的方式
-
定义数组,使用类型的初始化
数据类型[ ] 引用名称 = new 数据类型[空间大小];
int a[]={};
int[] a = {};
boolean x; //oracle jdk 1bye
boolean[] x1; // int
基本数据类型(整型): 0;
浮点类型: 0.0
引用类型: null
int[] a = new int[10]; //定义长度为10的数组,数组中的每一个元素初始值为0。
-
定义数组并初始化
int[] a = {1,3,4,5}; //定义数组初始化元素为大括号中的内容。
-
第三种方式
int[] a = new int[]{1,2,3};
通过索引访问数组
通过数组的索引进行数据访问: a[index]

索引的范围
数组索引的范围: [ 0, a.length-1]
int[]a = new int[N+1];
索引起点: 0;
索引终点: a .length - 1;
常见异常
-
NullPointException
空指针异常: 访问的数据不存在。
private int[] a; public void test(){ a[1] = 3; }
-
ArrayIndexOutOfBoundsException
数组越界异常: 访问的索引越界
int[] a = new int[10]; a[10];
常见数组
- 字符串
- 对象数组
- 哈希表
- 等
数组的优点
数组可以使用索引查询,其优势是查询快速。

数组的缺点
数组缺点: 数组一旦定义其长度就已经固定(数组容量不可变)。
动态数组
实现数组的自动扩容能力。
- Vector
- ArrayList
idea Debug设置
设置debug toolsbar
右键点击debug,弹出Customize Toolbar
·
点击"Customer Toolbar"

添加强制进入代码内部的指令

Debug指令
step over

跳过当前断点到下一行代码。tips: 如果下一行是方法则不进入方法,跳过方法。
step into
进入方法内。tips: idea默认step into只进入开发者自己写的方法内,无法直接进入源代码内部。
force step into
强制进入方法体内。
Resume Program

跳转到下一个断点。
可变数组
模拟完成ArrayList的创建。 MyArrayList。
分析Java源代码
以Vector为例,之后分析ArrayList
定义接口(List)

序号 | 方法名称 | 解释 |
---|---|---|
1 | boolean add(E e) | 添加数据 |
2 | boolean contains(Object obj) | 集合中是否有此对象 |
3 | boolean equals(Object) | 对象是否相等 |
4 | void clear() | 删除集合中的数据 |
5 | boolean isEmpty() | 判断集合是否为空 |
6 | E get(int) | 根据索引获取集合中的元素 |
7 | int indexOf(Object) | 获元素在数组的位置 |
8 | E remove(int) | 根据位置删除某个元素 |
9 | sort(Compator<E>) | 对集合的数据进行排序 |
10 | E set(int, E) | 修改指定位置的数据 |
11 | int size() | 获取集合长度 |
12 | void sort(Comparable<? extends E) | 对集合中的元素进行排序 |
动态数组属性
定义对象数组Object[] elementData;
初始化集合
初始化集合内的数组容量
tips: 抛出的异常 IllegalArgumentException ,如果初始化数组的容量为负值则抛出异常。

Vector默认数组的大小
Vector的默认数组大小10: new Vector();
/**
* Constructs an empty vector so that its internal data array
* has size {@code 10} and its standard capacity increment is
* zero.
*/
public Vector() {
this(10);
}
ArrayList默认数组大小
ArrayList的默认数组为一个空数组。
ArrayList是如何初始化数组的???-- 稍后再谈
数据操作
以Vector为例说明集合是如何完成数据的增、删、改、插操作,稍后在研究ArrayList。
添加数据(add)
第一种情况: 数据量没有超过默认容量10;
Vector<Integer> v = new Vector<>();
v.add(1);
第二种情况: 数据量超过10.

