Learning is reassuring and technology is self-confidence.
学习使人心安,技术使人自信。
函数只有被调用才执行。
一个函数中不能定义其它函数,所以不能在主函数里定义函数。但是可以在一个函数中调用其它函数。
函数:封装了某些反复要用的代码。
格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2)
{
执行语句;
return 返回值; //当返回值类型是void的时不写return;
}
真正开发时,所有功能都被定义在相应函数中,而不是定义在主函数中。主函数只负责调用。下面是一个函数从诞生到优化的过程 。(先从两个问题思考:结果什么类型?需要输入求知参数吗?)
当函数没有具体返回值时,返回值类型为void 。
函数是功能集合,只把执行要完成功能的语句写进去,多余的一句也不要加,交给调用它的语句去写。
主函数只负责调用 ,功能都由函数完成。下图是一个代码的简化过程。
写函数先考虑两个问题:有没有求知参数?返回值类型是啥?
注意:定义函数时只写函数该完成的功能,多一句都不必写,比如打印不打印,那是调用者的事,不要写在函数里。函数就是功能,是类中一段独立运行的代码 。
重载overload:同一个类中,允许一个以上的同名函数,只要参数个数和参数类型不同即可。只和参数列表有关系。
应用于:当执行的功能相同只是未知参数不同时,用重载。
重载练习:
数组:相同类型数据集合。java中接触的第一个引用数据类型。
定义:int[] a=new int[10] //定义了一个大小为10的数组。
栈内存和堆内存:
java运行时,局部变量放在栈内存,用完即释放。主动清除。
通过new开辟的内存都在堆内存,每个实体(数组和对象)都有内存地址值。实体中的变量都有默认初始值(布尔型默认是false)实体不再被使用,会在不确定的时间内被垃圾回收器回收。被java虚拟机垃圾回收机制回收。
int[] x=new int[3]这句话发生了什么??
在栈内存里开一个地方存放变量x,在堆内存中新加入一个数组实体,其值默认都是0,其首地址放在变量x中,此时称x为数组的一个引用。当下面代码出现x=null时,变量x就不再引用这个数组,如果此时这个数组已经没有任何引用,它将被视为垃圾,被清理掉。
常见问题:
练习1:
获取数组中最大最小元素。
思路:定义一个变量,用来存储最大值。初始可以是数组中任意一个元素。
未知变量:一个数组。
返回值类型:int.
class arrayUse{
public static void main(String[] args)
{
int[] array={9,3,4,7,46,2,1,90};
int ans=getMax(array);
System.out.println(ans);
}
public static int getMax( int arr[])
{
int max=arr[0];
for (int i=0;i<arr.length;i++)
{
if(arr[i]>max)
{
max=arr[i];
}
}
return max;
}
}
练习2:
用数组实现选择排序:
注:选择排序是每次用一个位置的数与其它所有数相比较,每次选出一个最大或最小的,需比较的数的个数每次少一个。
比如,a[0]=9,a[1]=13,a[2]=45,a[3]=6。第一次用a[0]中的9依次去和剩下的三个数比,假设要求从大到小排,则比完第一次后a[0]里放的是45。再用a[1]和剩余的两个数比,依此类推。选择排序的时间复杂度为o(n^2),排序完成后最值在第一位。
class sortDemo
{
public static void bigSort(int[] arr)
{
for (int x=0;x<arr.length-1;x++) //减1是因为最后剩一个数不用比了
{
for (int y=x+1;y<arr.length;y++) //注意这里是length而不是length-1
{
if(arr[x]<arr[y])
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
}
}
public static void print(int[] arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args)
{
int[] arr={23,89,1110,3,6,2,9,90};
bigSort(arr);
print(arr);
}
}
练习3:
冒泡排序:最值出现在最后一位。每次比较相邻两位。
所有排序中最快的是希尔排序。
真正开发时用的代码:
import java.util.*;
class sortDemo
{
public static void main(String[] args)
{
int[] arr={23,89,1110,3,6,2,9,90};
Arrays.sort(arr);
print(arr);
}
public static void print(int[] arr)
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
练习4:
基础查找和折半查找
//普通版
public static void search(int[] arr,int key)
{
for (int i=0;i<arr.length-1;i++)
{
if(arr[i]==key)
return i;
}
return -1;
}
//折半查找
public static void halfSearch(int[] arr,int key)
{
int min,mid,max;
min=0;
max=arr.length-1;
while(min<=max) //注意这里是<=
{
mid=(min+max)>>1;
if(key>arr[mid])
{
min=mid+1;
}
else if(key<arr[mid])
{
max=mid-1;
}else
return mid;
}
return -1;
}
小技巧:折半查找在面试时还可以应用于顺序插入一个数,把最后的返回-1改成返回min即可。