黑马程序员_Day01 __方法与数组

----------------------  ASP.Net+Unity开发 .Net培训 、期待与您交流! ----------------------

1、什么是函数?
函数就是定义在 类中具有 特定功能的一段小程序,也叫做方法。
小知识:开发中我们在编写程序,其实就是在不断的实现功能,而java中最小的功能单元就是函数,所以我们在编程的时候尽可能的将一些功能通过函数的形式体现,这样不仅有利于阅读而且便于使用。

2、定义函数的格式?
修饰符返回值类型函数名称(参数类型形式参数1,参数类型形式参数2)
{
执行语句;
return返回值;(谁调用返回给谁)
}
返回值类型:就是该方法运算结束后产生结果的数据类型。
 参数类型:是形式参数的数据类型。
 实际参数:是传递给形式参数的具体数值。
  return:用于结束函数。
 返回值:该值会返回给调用者。
注意:函数中只能调用函数,不可以在函数内部定义函数;
    定义函数时,函数的结果应该返回给调用者,交由调用者处理;
   函数无论放哪都可以,但是执行时要先从主函数开始执行

3、函数的特点
a:定义函数可以将功能代码进行封装
b:便于对该功能进行复用(多次调用)
c:函数只有被调用才会被执行
d:函数的出现提高了代码的复用性
e:对于函数没有具体返回值类型时,返回值类型用关键字void表示,那么该函数中的return语句如果 在最后一行可以省略不写
f:如果一个函数的返回值是void类型的,那么该方法不能再输出语句中打印,因为没有具体返回值 不清楚打印什么,到时候直接在主函数中调用即可

4、如何定义一个函数
首先要明确两点 :第一点 既然函数是一个独立的功能,那么该功能的运算结果是什么先明确( 明确返回值类型
 第二点 再明确,在定义该功能的过程中是否需要那些未知内容参与运算( 明确参数列表
总而言之:就是明确该功能运算结束后产生的结果的数值类型再明确函数的参数列表
eg:class  MethodDemo
        {
public static void main(String[] args) 
{
int num1 = add1();//返回值固定 扩展性差
int num2 = add2(3,4);//参与运算值由用户决定,扩展性强便于使用
}
//方法1 定义一个返回值是3加4的和,该方法不利于扩展不便于使用不能满足用户需求
public static int add1()
{
return 3+4;
}
//方法2 通过用户自己传递参数,大大提高了程序的扩展性而且便于调用
public static int add2(int x,int y)
{
return x+y;
}

}


5、函数的特性——重载(overload)
定义:重载就是在同一个类中 允许存在 一个以上的同名函数,只要它们的参数个数或者参数类型不同即可
特点:与返回值类型无关,只看参数列表(构造函数就是一重载的形式体现的)
好处:方便于阅读,优化了程序设计
:判断两个函数是否是以抽在的形式体现的就看它们的参数列表是否相同即可

6、什么时候用重载?
当定义的功能相同但是参与运算的未知内容不同,那么这时候就定义一个函数的名称以表示其该功能,方便阅读而通过参数列表的不同来区分多个同名函数。例如下面定义的两个方法 都是求和的功能,就是未知能容不固定通过重载的形式体现,方便了阅读。
eg: class overloadDemo
{
//定义一个两个整数相加的方法
int add(int x,int  y)
{
return x+y;
}
//定义一个三个整数相加的方法
int add(int x,int  y,int  z)
{
return x+y+z;
}

}
7、函数练习
(1)通过函数定义一个方法打印矩形
package one;

public class print 
{
public static void main(String[] args) 
{
Print(9,9);
}

//需求:定义一个用*号打印矩形的功能
//思路:第一步明确返回值,没有返回值直接打印了 所以返回值类型是void
//      第二部明确参数列表,该功能需要传递两个int数据
//  通过两个明确该功能已经可以编写
public static void Print(int row,int col)
{
for(int x=0;x<row;x++)               // row控制打印的行数
{
for(int y=0;y<col;y++)       // col控制打印的列数
{
System.out.print("*");
}
System.out.println();      //打印完一行换行一次
}
}


}

(2)定义一个打印99乘法表的内容
package one;

public class printDemo {

public static void main(String[] args) {
print99();
}

//定义一个打印九九乘法表的功能
public static void print99()
{
for(int x=1;x<=9;x++) //x是行 y是列
{
for(int y=1;y<=x;y++)
{
System.out.print(y+"*"+x+"="+(y*x)+"\t");
}
System.out.println();
}
}
}



8、数组的概念、好处和格式
概念:数组是同一种类型数据的集合,其实就是一个容器(菜篮就是蔬菜不能装水果,果篮就只能装水果)。
好处:数组可以自动给数组中的元素从0开始编号,方便操作这些元素(好比宿舍楼里的宿舍从101到124编号一样)
格式1: 元素类型 [ ] 数组名 = new  元素类型 [元素个数或数组长度]
eg:int [ ] arr = new int [5];  //定义了一个可以存5个整形的数组、arr是引用数据类型即数组类型
格式2: 元素类型 [ ] 数组名 = new 元素类型 [ ] {元素1,元素2,元素3,元素4}
eg://显示初始化
int [ ] arr = new int [ ] {3,4,6,7,8,8,9};
int [ ] arr = {4,5,6,7,8,9,9,7};
注:[    ]:中括号[  ]是用来标示数组的
new关键字:new一出现就会在内存中产生一个容器,用来存储许多数据的目的地,用new来完成。


9、内存结构(栈内存和堆内存)
Java在程序运行时,需要在内存中分配空间。为了提高效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据的方式和内存管理方式。内存可以划分为五个区域分别是: 栈内存堆内存方法区本地方法区寄存器(好比房子中有卧室、有厨房、有卫生间功能各部相同)下面看一下栈内存和堆内存的作用:
栈内存是用于存储 局部变量(方法中的变量、方法参数中的变量、for循环中的变量)的,当数据使用完,会自动释放
堆内存是用于存储 数组对象和通过new关键字建立的实例对象;
每一个实体在堆内存中都有 内存地址值(好比门牌号);
实体中的变量都有 默认初始化值(int 为0、double为0.0、float为0.0f、boolean为false);
实体不在被使用就是 没有引用指向实体时,会在不确定时间 被垃圾回收器回收;


10、
  数组int [ ] arr = new int [3];首先在栈内存中开辟一块空间用于存放arr变量,之后在内存中通过new关键字在最内存中建立了一个实体,堆内存为了标记这块空间给它分配了内存地址值,通过赋值把内存地址值赋值给arr,arr变量就指向了堆内存中的实体,也就是arr引用了内存地址值,所以说arr是引用数据类型。引用数据类型才能使用null常量,例如arr=null;意思是arr不在指向实体。
 
11、int [ ] arr = new int [3];  打印arr[3]会报错吗?
该语句编译时期不会报错,因为编译时期只检查语法错误。但是在运行时期会报错,角标越界错误,因为arr数组是从0开始编号的所以只有arr[0],arr[1],arr[2],没有arr[3]。

12、数组的一些操作?
(1)获取数组中的数据通常会用到遍历通过 for循环
(2)数组中有一个属性可直接获取数组元素的个数即 length
格式:数组名 . length
(3)但凡用到数组的情况下,大多都要用到for循环
eg://需求:求给出数组中数据的和
//思路:通过for循环遍历数组进行累加
class ArrayDemo 
{
public static void main(String[] args) 
{
//定义一个数组并对其进行显示初始化
int[] arr = new int[]{3,4,5,6,7,8,9,7};
int sum = 0;
for (int x=0;x<arr.length ;x++ )
{
sum += arr[x];
}

System.out.println("sum="+sum);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------
//打印数组中的数据并用逗号隔开 
 public static void pringtArray(int[] arr)
 { 
 for (int x=0;x<=arr.length-1 ;x++ )//注意数组的最后一个角标数值是length-1 
 { 
 if(x!=arr.length-1)//length-1是数组的最后一个元素 
 System.out.print(arr[x]+","); 
 else 
 System.out.print(arr[x]); 
 }
 System.out.println(); //打完一个数组换行一次
  }
------------------------------------------------------------------------------------------------------------------------------------------------------------
/*需求:给定一个数组 获取数组中的最大值
思路:
1.获取最值需要进行比较,每一次比较都会有一个较大的值,因为该值不确定
需要通过一个变量进行存储
2、让数组中的每一个元素和这个变量进行比较
如果大于了就将数组中的这个元素赋值给变量,记录较大值
3、当所有的元素都比较完成,那么该变量中存储的就是数组中的最大值

步骤:
1、定义一个变量,初始化为数组中的任意一个元素即可
2、通过循环遍历数组中的每一个元素
3、在遍历过程中定义判断条件,如果遍历到的元素比变量中的元素大,就赋值给变量

需要定义一个功能来完成(方法/函数)一边复用
1、明确结果,数组中的最大值 int
2、位置内容 一个数组 int[]
*/
public static int max(int[] arr)
{
int max = arr[0];
for (int x=0;x<=arr.length-1 ;x++ )
{  int temp=arr[x];
if(temp>max)
max=temp;
}
return max;
}

//需求:给定一个数组 获取数组中的最小值
public static int min(int[] arr)
{
int min = arr[0];
for (int x=0;x<=arr.length-1 ;x++ )
{  int temp=arr[x];
if(temp<min)
min=temp;
}
return min;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
13、数组——选择排序

 
/*需求:对给定的数组进行排序(升序)
思路:
1、让0角标元素逐个与其他角标进行比较
首先0角标与1角标比较,再与2角标,3角标比较,4角标比较
    1角标与2角标比较,在于3角标, 4角标比较,5角标比较
在比较过程中如果0角标元素小于其他就不用换位,否则交换位置
最后打印数组,数组还是原来的数组。所以返回值类型是void
步骤:定义一个方法
  嵌套循环进行比较
  定义临时变量进行位置互换
*/
public static void selectSort(int[] arr)
{
//外循环控制第一个角标,内循环控制遍历
for (int x=0;x<arr.length-1 ;x++ )
{
for (int y=x+1;y<arr.length ;y++ )
{
if(arr[x]>arr[y])//如果是降序将>换成<即可
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}

14、数组——冒泡排序

 
//冒泡排序
//相邻元素进行比较 如果符合条件就进行换位
//如果第一位的数据大于第二位置数据,就交换位置
public static void bubbleSort(int[] arr)
{
//第一圈 第二圈 剩最后一个元素时就不用参与比较所以length-1
for (int x=0;x<arr.length-1 ;x++ )
{
//第一圈循环完 最大的元素就能确定
//第二圈循环完 第二大元素就确定...直到结束
//所以每一圈循环结束后最后一个元素就不用参与比较所以length-x
for (int y=0;y<arr.length-1-x ;y++ )//减1是防止角标越界
{
if(arr[y]>arr[y+1])
{
int temp=arr[y];
arr[y]=arr[y+1];
arr[y+1]=temp;
}

}
}

}

15、数组——折半查找
/*
折半查找(数组必须是有序的,可以演化为给定元素插入到数组中哪个位置还能保持有序)
需求:给定元素,获取该元素在数组中的位置
思路;
1、拿给定的元素与数组中间角标位置进行比较
2、给定元素如果大于中间角标元素,就从中间角标加1到角标最后查找
3、给定元素如果小于中间角标元素,就从0角标开始到中间角标减1查找
4、如果最小的角标超过了最大的角标就意味没有找到指定元素,返回-1
步骤:
1、定义三个变量用于存储角标位置
2、定义循环,循环内进行判断
*/
public static int halfSearch(int[] arr,int key)
{
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
//定义一个循环 进行判断
while(key!=arr[mid])
{
if(key > arr[mid])
min = mid+1;
else if (key < arr[mid])
max = mid-1;
if(min>max)  //最小的角标超过了最大的角标就意味没有找到指定元素
return -1;
mid=(min+max)/2;
}

return mid;
}

16、进制转换
进制转换-例:十进制-->十六进制
                 public static void toHex(int num)
                 {

                     StringBuffer sb = new StringBuffer();

                     for(int x=0; x<8; x++)//int型四个字节,每次右移四个二进制,最多八次
                     {
                         //求一个数的十六进制方法--"重复右移(四位)并&15"
                         int temp = num & 15;//把一个数二进制的后四位求出,并求出其对应的十六进制数
                         if(temp>9)//如果大于9求出对应的字符    
                            sb.append((char)(temp-10+'A'));
                         else    
                            sb.append(temp);

                         num  = num >>> 4;//控制循环变量,没循环一次往右移四位
                      }
                           System.out.println(sb.reverse());

                 }

17、二维数组
理解:数组中的数组
一维数组好比大箱子里有格子每个格子里放的是元素;
二维数组好比大箱子里有小箱子每个小箱子里有格子;
格式:数据类型  [ ] [ ]  数组名称 = new 数据类型[二维数组的长度] [二维数组中每一个一维数组的长度];
eg:int [ ] [ ]  arr = new int [3] [3];//有三个一维数组每一个一维数组的长度是3;
eg:int [ ] [ ]  arr = new int [3] [ ];//其中arr[0][ ] 的值是null
显示初始化:int [ ] [ ] arr = { {1,2,3,4},{4,5,6,7},{7,8,9,4},{4,5,4,3} };
注:二维数组的长度通过 arr.length获取 二维数组中一维数组的长度通过arr[0].length获取

练习:求二维数组 int [ ] [ ] arr = { {1,2,3,4},{4,5,6,7},{7,8,9,4},{4,5,4,3} };中的所有数据的和 ?
public static int towArraySum(int[][] arr)
{
//大圈套小圈
int sum=0;
for (int x=0;x<arr.length ;x++ )
{
for (int y =0;y<arr[x].length ;y++ )
{
sum += arr[x][y];
}

}
return sum;

}

18、Arrays工具类中操作数组的一些静态方法
 
1、int binarySearch(type[] a, type key)
    使用二分搜索法来搜索key元素在数组中的索引;若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。
 
 2、int binarySearch(type[] a, int fromIndex, int toIndex, type key)
  使用二分搜索法来搜索key元素在数组中从fromIndex到toIndex的索引;
  若a数组不包括key,返回负数。(该方法必须已按升序排列后调用)。

 3、boolean[] copyOf(type[] original, int newLength)
  复制指定的数组

 4、byte[] copyOfRange(type[] original, int from, int to)
  将数组的指定范围复制到一个新数组。 

5、 boolean equals(type[] a, type[] a2)
  如果两个数组长度相等和元素一一相等,则返回 true 

 6、void fill(type[] a, type val)
 将a数组所有元素都赋为val。

 7、void fill(type[] a, int fromIndex, int toIndex, type val)
 将a数组从formIndex 到tiondex索引之间的元素都赋为val
   
8、 void sort(type[] a)
  sort(int[] arr)对指定的数组按数字升序进行排序
 
 9、void sort(type[] a, int fromIndex, int toIndex)
 对指定数组的从formIndex 到tiondex索引之间的元素按数字升序进行排序。
 
 10、String toString(type[] a)
  返回指定数组内容的字符串表示形式。多个数组元素之间用英文逗号或空格隔开。

----------------------  ASP.Net+Unity开发 .Net培训 、期待与您交流! ----------------------
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值