您的位置:首页 > 编程语言 > Java开发

java基础学习之函数、数组

2018-03-31 14:47 381 查看

1、函数

1、函数的定义

函数是定义在类中有特定功能的一小段程序,也称方法。定义格式:

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

{

执行语句;

return 返回值;

}

2、功能

定义函数可以对功能代码进行封装,提高代码的复用性,减少代码的重复度,提升程序的可读性。函数只有被调用时才会执行。

3、函数的重载

同一个类中可以允许出现同一个函数名的多个函数,只要他们的参数不同即可,函数重载即是函数名相同,参数不同,参数的顺序不同也叫做参数不同。

重载实例:

//返回两个整数的和
int add(int x,int y){return x+y;}
//返回三个整数的和
int add(int x,int y,int z){return x+y+z;}


下面这一句不是重载:

double add(int x,int y){return x+y;}


在同一个类中函数名参数相同,但是返回值不同,这个会引起混乱,是不允许存在于一个类中的。

2、一维数组

1、定义方法

int[] arr = new int[5];
int[] arr1 = {1,2,3};
int[] arr2 = new int[]{1,2,3};
int arr3[] = new int[3];


这四种方法都可以。

2、内存分配

如果这个数组是在方法中定义一句int[] arr = new int[5];,那么他的内存分配如下:



并且默认情况下,数组元素的值为0,内存是连续的。

3、常见异常

①、越界

int[] arr = new int
4000
[5];
System.out.println(arr[5]);


②、空指针

int[] arr = null;
System.out.println(arr[5]);


4、获取最值

public int getMax(int[] arr){
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max)  //最小值这里改为小于就可以
max = arr[i];
}
return max;
}


5、简单排序(从小到大)

①、选择排序(将小的放在前面)

思路:从第一个数开始,不停与后面的数比较,随小就放在第一位,然后类似的第二个数,直到倒数第二个数与最后一个数比完后,排序完成。

public static void sort1(int[] arr){
//从第一个数到倒数第二个数
for (int i = 0,temp = 0; i < arr.length-1; i++) {
//与后面一个数到最后一个数比较
for (int j = i+1; j < arr.length; j++) {
if(arr[i] > arr[j]){
//顺序交换
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}


②、冒泡排序(将大的放在后面)

思路:从标号0开始将前一个数和后一个数比较,大的放后面,然后标号加1,再比,比到最后两个一轮结束,然后从标号0开始比到倒数第二个和倒数第三个。。。。最后从标号0开始和标号1比,比完排序完成

public static void sort2(int[] arr){
for (int i = 0,temp =0 ; i < arr.length-1; i++) {
for (int j = 0; j <arr.length - i - 1 ; j++) {
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}


6、进制转化(将十进制转化为其他进制并且用数组保存)

思路:写一个映射表,包含了字符0到字符A总共16个字符,对于二进制每次与上1取出最后一位,保存这个位到数组,然后右移一位,继续与,整个过程通过循环实现,循环结束的条件是十进制的数为0.对于转八进制和十六进制的思路一样,只是十六进制每次与15,右移4位,八进制与7,右移三位。

public static void changeSystem(int num,int base,int offset){
char[] cc = new char[32];
int i = 0;
//当需要转化的数不为0
while(num != 0){
//保存对应的位
cc[i++] = table[num&base];
//将这个数右移
num = num >>>offset;
}
for (int j= i-1; j >= 0; j--) {
System.out.println(cc[j]);
}
}
//转二进制
public static void toBinary(int num){
changeSystem(num,1,1);
}
//转十六进制
public static void toHex(int num){
changeSystem(num,15,4);
}
//转八进制
public static void toOctal(int num){
changeSystem(num,7,3);
}


7、折半查找

思路:用三个变量保存标号,一个是min初始指向0,一个值max默认指向最后一个数,mid等于min+max的和的一半,然后循环中不同比较要找的值和mid指向的值是否相等,相等就返回,大于min的标号等于mid右移一位,再算mid比,如果小于就将max指向mid左边一位,再比,等到min的值大于max的时候,循环退出。

public static int indexOfValue(int num,int[] arr){
int max = arr.length - 1;
int min = 0;
int mid = (max + min)/2;
//min小于max才比较,否则退出,
while(min <= max){
if(num > arr[mid]){
min = mid + 1;
mid = (max + min)/2;
}else if (num <arr[mid]) {
max = mid - 1;
mid = (max + min)/2;
}else {
return mid;
}
}
return -1;
}


8、折半查找可以用于有值要插入到有效数组里面求插入位置的情况

思路:利用上面的折半查找,如果插入的值原来的数列有,那么直接返回mid即可,如果没有就返回min举个例子,在3和5之间插入4,这个时候,min和max都指向了3,那么4和三比大于,那么min加1,退出循环,这个时候的min正好就是需要标号:

public static int getIndexOfInsert(int num,int[] arr){
int max = arr.length - 1;
int min = 0;
int mid = (max + min)/2;
while(min <= max){
if(num > arr[mid]){
min = mid + 1;
mid = (max + min)/2;
}else if (num <arr[mid]) {
max = mid - 1;
mid = (max + min)/2;
}else {
return mid;
}
}
return min;
}


2、二维数组

1、定义格式

二维数组其实就是数组中的数组,一个数组有三个格子,然后每个格子里面又存了一个数组。

定义格式:

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


除了这三格式外,还可以将前面的[]任意移动如:int[] arr[] int arr[][]都可以。

第一种定义方法表示定义了一个二维数组,三行两列,第二个定义方法是定义了一个二维数组,三行,列还没有定义,也就是,这个二维数组分为三个一位数组,arr[0] 指向null,arr[1],指向null,arr[2]指向null;第三种情况表示,arr[0] = {3,8,2},arr[1]={2,7},arr[2]={9,0,1,6}.

2、内存分配

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: