一、方法(函数、过程)
1、语法
返回值类型 方法名(参数列表){方法体}
1 返回值类型 该方法必须返回一个这个类型的对象 2 当一个方法不需要返回任何值 返回值类型就定义为void 3 return 代表方法结束 终止方法的作用 4 void中不能return null 5 void方法可以写return
2、参数
形参:定义方法时,参数列表的参数名 实参:调用方法时实际传入的参数
可变参数 声明 sum(int... a) 使用 将可变参数当做数组使用 注意点: 1 一个方法中最多有一个可变参数 2 可变参数必须在参数列表的最后一个 3 数量可变,类型不可变 4 调用可变参数方法,可以使用数组代替 5 可变参数可以不传
3、重载
在同一个类中,方法名相同,参数列表不同即为重载
参数列表要素: 1 参数类型不同 2 参数的个数不同 3 参数的顺序不同
4、递归
函数调用其本身
二、排序
1、冒泡排序 ※ (Bubble Sort)(邻近对比 - 你行你上)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。(相邻对比交换位置)
时间复杂度O(n^2) 空间复杂度O(1)
2、 选择排序 ※ (Selection Sort)(选择最大或最小 - 最菜的出来)
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。(拿出最大或最小,然后在剩余中再拿最大或最小)
时间复杂度O(n^2) 空间复杂度O(1)
3、插入排序 ※(Insertion Sort)(未排序插已排序 - 插班生)
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。(将未排序的,在已排序中找到位置插进去)
时间复杂度O(n^2) 空间复杂度O(1)
4、希尔排序(Shell Sort)(插入排序升级版- 先分组再插入)
希尔排序的核心在于间隔序列的设定。既可以提前设定好间隔序列,也可以动态的定义间隔序列。动态定义间隔序列的算法是《算法(第4版》的合著者Robert Sedgewick提出的。
时间复杂度O(n^2) ~ O(nlogn) 取决于增量序列 空间复杂度O(1)
5、归并排序(Merge Sort)(两两比后四人组排序,四四比后八人组排序。。- 比赛制)
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
时间复杂度O(nlogn) 空间复杂度O(n)
6、快速排序 ※(Quick Sort)(冒泡排序的改进版)
快速排序的基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
时间复杂度O(nlogn) 空间复杂度O(logn)
7、堆排序(Heap Sort)
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
时间复杂度O(nlogn) 空间复杂度O(1)
从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆函数,二是反复调用建堆函数以选择出剩余未排元素中最大的数来实现排序的函数。
8、计数排序(Counting Sort)
计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
时间复杂度O(n+k) 空间复杂度O(k) k 是最大值与最小值的差值加1
9、桶排序(Bucket Sort)
桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排
时间复杂度O(n+k) 空间复杂度O(k) k 是桶的数量
10、基数排序(Radix Sort)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。
时间复杂度O(n*k) 空间复杂度O(n+g) k是数字的最高数位 g是基数(桶的数量,通常与数字的最大位数相同)
三、类和对象
1、类的声明、创建对象
2、属性、方法
在类中定义属性 又叫做:全局变量 整个类中都可以访问到的变量
类中的方法可以直接调用本类中的属性
3、 构造方法
定义构造方法: 1 没有返回值类型 2 方法名与类名相同 3 如果一个类没有定义任何的构造方法,系统会给与一个默认的空的构造方法 4 类中一旦自定义了任意构造方法,系统给定的默认构造方法就会消失
通过构造方法设置属性: 将参数name设置给name属性 就近原则 优先找一个代码块中的变量 局部变量:方法体或代码块中声明的变量 全局变量:在类中定义的变量 在局部变量和全局变量重名的情况下,可以使用this关键字,标注全局变量
四、面向对象特征(特性)※※
1、封装※
封装即隐藏(类、方法中的)细节,不能让其他类(方法)随意访问
通过四个访问权限修饰符达到封装的效果 public protected default private 公共的 受保护的(家族性的) 默认(本包中访问) 私有的(本类中访问)protected 子类、本包下可访问
getter setter javabean
java语言中大小写敏感
2、继承※
一个类继承父类,子类就具有父类中定义好的属性和方法
不是所有的属性和方法都能访问到 public protected 本包下的父类default作用:
1 代码重用2 多态实现的基础
注意:
1 一个子类只能有一个直接父类
2 java支持多重继承
子类继承父类的:
- 方法和属性:子类可以继承父类中的非私有(non-private)方法和属性。这意味着,如果你在父类中定义了一个public或protected的方法或属性,那么子类将能够访问这些方法或属性。
- 构造器:虽然构造器本身不被继承,但是子类可以调用父类的构造器(通过使用
super
关键字)来初始化父类的部分。- 静态方法:静态方法可以被继承,但是它们的行为与实例方法略有不同。子类可以调用父类的静态方法,但是静态方法的调用是基于类的,而不是基于实例的。
- 嵌套类、接口和枚举:父类中定义的嵌套类、接口和枚举也可以被子类继承。
然而,有一些东西是子类不能继承的:
- 私有成员:子类不能继承父类的私有方法和属性。
- 构造器:如上所述,构造器不被继承,但是可以被调用
子类继承父类 子类对父类中继承过来的方法重新定义:方法重写 可以使用@Override注解,来验证方法是否是重写的方法,否则该注解报错 注意: 返回值,方法名,参数列表不能发生变化 重写的方法的访问权限只能更开放,不能更闭塞
子类的构造方法中,首行必须调用父类的构造方法 默认调用父类的无参构造方法 父类中没有无参构造方法,子类构造方法中必须明文声明调用父类的哪一个构造方法 使用super关键字调用父类的构造方法
向上转型 父类的指针指向子类的对象 调用属性看声明 调用方法看对象
3、多态※
多态是指同一种行为具有多个不同的表现形式或形态的能力。在Java中,多态是指一个对象的实际类型可以是其父类或接口类型,但在运行时会根据其实际类型来调用相应的方法。
多态分类
静态多态:方法重载造成,在类编译时就可以确定调用的是哪一个方法
动态多态:方法重写造成,只有在执行到该行代码,才能确定执行的是那个类中的方法