黑马程序员 笔记(四)——函数和数组

------- android培训java培训、期待与您交流! ----------

函数

一、函数的概述

       1、  函数的定义:

                   函数就是定义在类中的具有特定功能的一段独立小程序。函数也称为方法。

       2、  函数的意义:

                 在写程序时,操作不同数据使用的是同一种方法时,可以将这个方法定义成一个函数,这样避免了代码的重复,提

           高了代码的复用性。

       3、  函数的格式:

            修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2)

             {

                           执行语句;

                           return返回值;

             }

        返回值类型:函数运行后的结果的数据类型。

        参数类型:是形式参数的数据类型。

        形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。

        实际参数:传递给形式参数的具体数值。

        return:用于结束函数。

        返回值:该值会返回给调用者。

注:当函数中没有值返回(如直接打印输出结果)时,返回值类型用void,并且可以省略return语句。

4、  函数的特点:

            1)定义函数可以将功能代码进行封装

            2)便于对该功能进行复用

            3)函数只有被调用才会被执行

            4)函数的出现提高了代码的复用性

            5)对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。

注:函数中只能调用函数,不可以在函数内部定义函数。定义函数时,函数的结果应该返回给调用者,交由调用者处理。

 

二、函数的应用

     1、 如何定义函数:

           ①明确该功能运算完的结果是什么类型。

           ②明确是否需要传递参数参与运算。

三、函数的重载

    1、定义:

          在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。

    2、重载的特点:与返回值类型无关,只看参数列表

    3、重载的好处:方便于阅读,优化了程序设计

    4、重载使用的场合:

               当定义的功能相同,但参与运算的未知内容不同。此时只定义一个函数名称,通过参数列表来区分。

   注:函数的参数是有顺序的,顺序不同也算重载,重载和返回值类型没关系。虚拟机会根据参数列表自动匹配想对象的函数。

 

(代码诠释) OverLoadedFunctionDemo

/*
	需求:定义一个函数实现两个或三个整数(int类型)的比较,将较大的值打印输出。
		  通过本例来理解函数重载的定义
	步骤:①明确该功能运算完的结果是什么类型:
				直接打印结果,所以无结果返回 用void修饰
		  ②明确是否需要传递参数参与运算。
				进行数据比较,需要调用者传递参数。

*/
class OverLoadedFunctionDemo 
{
	public static void compare(int x,int y)	
	/*
		自定义函数实现比较功能,因为是在主函数(静态)中调用,所以要用static修饰。
	*/
	{
		int z = (x>y)?x:y;
		System.out.println(x+"和"+y+"中,比较大的数字是"+z);
	}

	public static void compare(int x,int y,int m)
	{
		if (x>y && x>m)
			System.out.println(x+"和"+y+"和"+m+"中最大的数是"+x);
		else if (y>x && y>m)
			System.out.println(x+"和"+y+"和"+m+"中最大的数是"+y);
		else if (m>x && m>y)
			System.out.println(x+"和"+y+"和"+m+"中最大的数是"+m);
	}


	public static void main(String[] args) //主函数
	{
		compare(6,9);	//调用compare函数,虚拟机会根据参数列表自动匹配想对象的函数。
		compare(88,66,99);
	}
}
/*
运行结果
========================================
6和9中,比较大的数字是9
88和66和99中最大的数是99
========================================
*/


 

 

数组

一、数组(概述—内存结构)

         1、定义:同一种类型数据的集合。其实数组就是一个容器。

         2、数组的好处可以自动给数组中的元素从0开始编号,方便操作这些元素。

         3、格式:

                             ①元素类型[]数组名 = new元素类型[元素个数或数组长度];

                                     eg: int[] arr = new int[3];

                             ②元素类型[]数组名 = new 元素类型[]{元素,元素,……};

                注:此格式在明确数组内容时使用。

                                     eg:int[]  arr1 = new int[]{1,3,45,5,6,7};

                                       int[]  arr2 = new int{1,3,45,5,6,7} ;

                           ③元素类型[] 数组名 = {元素,元素, 元素,元素, ……}

         4、数组在内存中的存贮:

                  (1)堆:①存放用new产生的数据。

                                     ② 当引用该数组的变量执行变量名=null 该数组为垃圾值,由虚拟机启动垃圾回收机制进行回收。

                           注:堆内的数据都有默认的初始值。(int是0,double是0.0,long是0.0,boolean是false)

                           如: int[] arr1 = new int[3];中开辟的三个空间

 

                (2)栈:①存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。(数据使用完,会自动释放)

        如:int[] arr1 = new int[3];中的arr1,它保存的是那个三个空间的首地址。称为arr1引用了int[3]数组。

 

二、数组(静态初始化——常见问题)

         1、数组的初始化:

                  静态初始化:创建一个数组实体,并赋值。eg:  int[] arr = new []{1,3,4,6,8};

                   默认初始化:只创建数组实体,不赋值。此时会自动赋默认值。

                    eg: int[] arr1 = new int[3];

         2、常见问题:

                  ArrayIndexOutOfBoundsException:角标越界,访问到了数组中不存在的角标

                                    eg:int[] arr = new int[2];

                                          System.out.println(arr[3]);

                  ②NullPointerException:空指针异常:当引用没有任何指向值为null的情况,该引用还在用于操作实体。

                                   eg:   int[] arr = null;

                                          System.out.println(arr[0]);

四、二维数组

格式1int[][] arr = new int[3][2];

u  定义了名称为arr的二维数组

  •  二维数组中有3个一维数组
  •  每一个一维数组中有2个元素
  • 一维数组的名称分别为arr[0], arr[1], arr[2]
  • 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78

格式2int[][] arr = new int[3][];

  •  二维数组中有3个一维数组
  •  每个一维数组都是默认初始化值null
  •  可以对这个三个一维数组分别进行初始化

格式3int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

  • 定义一个名称为arr的二维数组
  • 二维数组中的有三个一维数组
  • 每一个一维数组中具体元素也都已初始化
  • 第一个一维数组 arr[0] = {3,8,2};
  • 第二个一维数组 arr[1] = {2,7};
  • 第三个一维数组 arr[2] = {9,0,1,6};
  • 第三个一维数组的长度表示方式:arr[2].length;

五、数组的常见操作(通过函数调用来说明)

       1、 获取数组中的值以及求和:遍历

                           可通过for循环获取

                           数组名.length可获取该数组的长度。

      2、 求数组中的最大值(通过函数实现):排序

                        a)  选择排序

                        b)  冒泡排序

     3、 查找:折半查找

 

(代码诠释) OperateArr
   
/*
	 数组的工具类
*/

class ArrTool
{
	//获取最小值的功能
	public static int getMin(int[] arr)
	{
		int min = 0;

		for (int i=1; i<arr.length-1; ++i)
		{
			if (arr[i]<arr[min])
			{
				min =i;
			}
		}
		return arr[min];
	}

	//获取最大值的功能   
	public static int getMax(int[] arr)
	{
		int max = 0;
		
		for (int i=1; i<arr.length; ++i)
		{
			if (arr[max]<arr[i])
			{
				max = i;
			}
		}
		return arr[max];
	}

	//将数组进行从大到小的排列  选择排序
	public static int[] sortMax(int[] arr)
	{
		for (int i=0;i<arr.length-1 ;++i )
		{
			for(int m=i+1;m<arr.length;++m)
			{
				if (arr[i]<arr[m])
				{
					swap(arr,i,m);
				}
				
			}
		}
		return arr;
	}

	//将数组从小到大排列        冒泡排序
	public static int[] sortMin(int[]arr)
	{
		for (int i=0; i<arr.length-1;++i )
		{
			for (int m=0; m<arr.length-i-1;++m)
			{
				if (arr[m]>arr[m+1])
				{
					swap(arr,m,m+1);
				}
			}
		}
		return arr;
	}

	//将数组输出
	public static void print(String s,int[] arr)
	{
		System.out.print(s+"arr = {");
		for (int i=0; i<arr.length; ++i)
		{
			if (i != arr.length-1)
			{
				System.out.print(arr[i]+" ");
			}
			if (i==arr.length-1)
			{
				System.out.print(arr[i]+"}"+"\n");
			}
		}
	}


	public static void print(String s,int x)
	{
		System.out.print(s+x+"\n");	
	}

	//将两个数进行交换
	public static void swap(int[] arr,int x,int y)
	{

		int temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
		
	}

	//折半查找
	public static int halfSearch(int[] arr,int key)
	{
		int min = 0,max = arr.length-1,mid;

		while(min<=max)
		{
			mid = (max+min)>>1;

			if(key>arr[mid])
				min = mid + 1;
			else if(key<arr[mid])
				max = mid - 1;
			else
				return mid;
		}
		return -1;
	}

}

class OperateArr			//主函数
{
	public static void main(String[] args)
	{
		int[] arr = {89,2,8,56,4,7,36,99,66};
		int x = 36;
		
		ArrTool.print("最小值是",ArrTool.getMin(arr));  //调用工具类中的获取最小值的函数,并打印
		ArrTool.print("最大值是",ArrTool.getMax(arr));//调用工具类中的获取最大值的函数,并打印
		ArrTool.print("原数组是",arr);					//调用工具类中的打印函数
		ArrTool.print("从小到大排序是",ArrTool.sortMin(arr));	//调用工具类中的从小到大排序的函数,并打印
		ArrTool.print("从大到小排序是",ArrTool.sortMax(arr));	//调用工具类中的从大到小排序的函数,并打印
		ArrTool.print("在数组中与该数相匹配的元素的角标是",ArrTool.halfSearch(ArrTool.sortMin(arr),x));	//调用工具类中的折半查找的函数,并打印
	
	}
}
/*
执行结果
============================================
最小值是2
最大值是99
原数组是arr = {89 2 8 56 4 7 36 99 66}
从小到大排序是arr = {2 4 7 8 36 56 66 89 99}
从大到小排序是arr = {99 89 66 56 36 8 7 4 2}
在数组中与该数相匹配的元素的角标是4

============================================
*/

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值