13.方法和数组
方法
-
方法定义
程序中完成某个独立的功能,可重复使用的一段代码的集合,解决功能重复的问题;
-
方法结构
[修饰符] 返回值类型 方法名([数据类型 变量名1,数据类型 变量名2,...]) { 方法体; [return 值;] }
参数列表:又称为参数清单,包含参数的个数、参数类型、参数顺序。
方法签名:方法名+方法参数列表,判断是否是同一个方法的标准。
-
方法特点
它可以实现独立的功能,必须定义在类里面。
它只有被调用才会执行,它可以被重复使用。
方法结束后方法里的对象失去引用, 变量会消失。
-
方法的重载
在同一个类中,允许多个方法的名字相同,但是他们的参数列表绝对不能相同
遵守的原则:两同一不同
两同:同一个类,方法名相同
一不同:方法的形参列表(参数的个数,参数的类型,参数顺序)
注意:方法重载和方法的返回值类型无关。
-
方法的递归
所谓递归就是方法自己调用自己,可以执行结束(有出口),
-
方法参数的值传递机制
方法被调用时,方法里的参数是以值传递的方式传递的。
所谓值传递,就是将实际参数的副本(复制品)传入方法,而参数本身不受影响。
若是基本数据类型,就直接传递实参值的副本。
若是引用数据类型,就传递实际参数的16进制地址值。
示例代码:
基本类型
需求:定义一个方法change,改变传入实参的值。 public static void main(String[] args) { int x=10; change(x); System.out.println("main中执行change后的x=" + x); //输出 x = 10 } public static void change(int x) { System.out.println("change前...x=" + x); // x = 10 x=20; System.out.println("change后...x=" + x); // x = 20 }
引用类型
案例:定义一个change方法,改变数组索引为1的元素的值。 public static void main(String[] args) { int[] arr = {1,2 }; change(arr); System.out.println("main中执行change后arr[1]= " + arr[1] );// {1,10} } public static void change(int[] arr) { System.out.println("chagne前...arr[1]= " + arr[1] ); // {1,2} arr[1] = 10; System.out.println("chagne后...arr[1]= " + arr[1] ); // {1,10} }
数组
-
数组定义
把具有相同类型的若干变量按有序的形式组织起来, 这些按一定顺序排列的同类型数据的集合称为数组
数组也是一种数据类型.
-
数组初始化
Java中数组必先初始化后才能使用,所谓初始化就是给数组元素分配内存,并为每个元素赋初始值。
初始化数组的两种方式:
-
静态初始化
元素类型[] 数组名 = new 元素类型[]{值1,值2,...} int[] arr = new int[]{1,2,3} 简写语法: 元素类型[] 数组名 = {元素1,元素2,元素3...元素n} int[] arr = {1,2,3}
-
动态初始化
元素类型[] 数组名 = new 元素类型[长度] int[] arr = new int[10];
-
-
二维数组
一维数组中每一个元素都是一个值
-
二维数组:就是里面的每一个元素都是一个一维数组(内存地址值)
int[][] arr = {{1,2,3},{5,6,7},{8}}
三维数组,就是里面是每一个元素都的二维数组(内存地址值)
-
可变参数
public void test(int a,int...ss)
可变参数也是编译器的特性(语法糖),底层依然是数组,和数组的打包
一个方法中可变参数只能有1个,且必须位于最后
二维数组的可变参数是int[]... arr
-
排序算法
-
冒泡排序(Bubble Sort)
这是最简单的排序法,
-
基本思路:
对未排序的各元素从头到尾依次比较相邻的两个元素大小关系,若大于则交换位置,经过第一轮比较排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。
可以看出若有N个元素,那么一共要进行N-1轮比较,第M轮要进行N-M次比较。(若6个元素,要进行6-1轮比较,第一轮比较6-1次,第三轮比较6-3次)。
-
示例代码:
int[] arr = {3, 5, 4, 1, 8, 2}; //外层循环表示要比较多少轮 for (int i = 1; i < arr.length; i++) { //内循环表示每轮比较多少次 for (int j = 0; j < arr.length - i; j++) { //每次比较时,相邻的两个数,前面大于后面的元素,则交换值,得到该次比较的最大值 if (arr[j] > arr[j + 1]) { //异或的位运算,交换值 arr[j] = arr[j] ^ arr[j + 1]; arr[j + 1] = arr[j] ^ arr[j + 1]; arr[j] = arr[j] ^ arr[j + 1]; } } }
-
-
选择排序
-
基本思路
选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。
可以看出选择排序,第一轮会选出最小值,第二轮会选出第二小的值,直到最后。
第一轮从arr[0]和后面元素相比较,第二轮从arr[1]和后面的元素相比较,依次类推。N个数要进行N-1轮。相对于冒泡排序效率高一些。
-
示例代码
int[] arr = {3, 5, 4, 1, 8, 2}; for (int i = 0; i < arr.length - 1; i++) { for (int j = i + 1; j < arr.length; j++) { if (arr[i] > arr[j]) { //异或的位运算,交换值 arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i] = arr[i] ^ arr[j]; } } }
-
-
二分查找
当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的
-
基本思路
每一次都跟数组的中间变量作比较,根据大于或者小于来改动开始和结束的索引
只要中间值和key相同就返回索引
如果循环结束都没有返回那就说明key在数组中不存在,返回-1
-
-
-
数组工具类 Arrays
常用方法
int binarySearch(type[] arr,type key) 使用二分法查找数组里某元素并返回其索引,若找不到返回负数. void sort(type[] arr) 使用调优后的快速法对指定数组排序。 String toString(type[] arr) 返回指定数组内容的字符串表示形式。 public static type[] copyOf(type[] original, int newLength) 复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。