函数和数组

    科技2022-07-10  177

    函数和数组

    方法的调用的内存分析方法参数的内存结构 方法的重载数组JVM堆和栈 数组在内存中的划分 数组习题第一题:求极值第二题:冒泡排序第三题:二分法查找第四题:数组倒置

    方法的调用的内存分析

    参考类

    public class Demo { public static void main(String[] args){ int c=5; int d=6; int result=compareNumbers(c,d); System.out.println(result+"大"); } public static int compareNumbers(int a,int b){ int result=0; if(a>b){ result=a; }else{ result=b; } return result; } }

    方法参数的内存结构

    在程序编译的时候会在内存中开辟出两个区:主方法区和静态方法区。主方法区会开辟两块内存空间用来存放实参的值。

    静态方法区会开辟出两块空的内存空间。当main方法调用compareNumbers方法的时候,main方法区的实参值会指向静态方法区的两块内存空间(图二)(JAVA语言只有值传递),给他们赋值,然后就会执行compareNumbers方法。

    方法的重载

    重载的目的:在提高代码的可读性和节省命名的词

    例子:

    比较数的大小 public class Demo { public static void main(String[] args){ int a=4; int b=4; int c=4; int result=compareNumbers(a,b,c); if(result==0){ System.out.println("相等"); }else{ System.out.println(result+"大"); } } public static int compareNumbers(int a,int b){ if(a>b){ return a; }else if(a<b){ return b; }else{ return 0; } } public static int compareNumbers(int a,int b,int c){ int result=compareNumbers(a,b); if(result==0){ if(a>c){ return a; }else if(a<c){ return c; }else{ return 0; } }else{ if(result>c){ return result; }else if(result<c){ return c; }else { return c; } } } }

    简化代码如下:

    public class Demo { public static void main(String[] args){ int a=4; int b=5; int c=5; int result=compareNumbers(a,b,c); if(result==0){ System.out.println("相等"); }else{ System.out.println(result+"大"); } } public static int compareNumbers(int a,int b){ if(a>b){ return a; }else if(a<b){ return b; }else{ return 0; } } public static int compareNumbers(int a,int b,int c){ int result=compareNumbers(a,b); if(result==0){ if(a>c){ return a; }else if(a<c){ return c; }else{ return 0; } }else{ int result1=compareNumbers(result,c); if(result1==0){ return result; }else{ return result1; } } } }

    数组

    数组的定义有三种方式:

    第一种:数据类型[] 数组名=new 数据类型[]{};

    int[] array=new int[]{};

    第二种:数据类型[] 数组名={};

    int[] array={};

    第三种:数据类型[] 数组名=new int[数组长度];

    int[] arrass=new int[5];

    JVM

    堆和栈

    JVM中有栈和堆 栈:空间小,主要存储地址和局部变量的数据,存取速度快 堆:空间大,主要存储引用类型的变量,存取速度快

    以数组:int[] array=new int[5];为例进行堆栈分析

    内存图分析如下:

    在栈中存放的是左边的对象,堆中存储的是实例化的对象

    需要注意的是 获得数组的长度使用的是数组的属性length;而获取字符串的长度使用的是字符串的length()方法。这个一定要区别开来

    数组在内存中的划分

    内存区分配: 栈内存:容量小、速度快,数据的生命周期短,先进先出,保存局部变量(方法里的变量,语句块中的变量,以及地址) 堆内存:容量大,速度慢,保存引用数据类型的数据,适合存储生命周期长的数据,适合存储对象 方法区:保存所有对象的共享数据

    内存结构图如下: 以数组:int[] array=new int[5];为例进行堆栈分析 在栈中存储的是该数组的地址,在堆中存放的是该数组的实例对象

    数组习题

    第一题:求极值

    public class Demo{ public static void main(String[] args){ int[] arrays=new int[]{41,349,87,16,51,34,6,54,89,431,3,1}; int maxNumber=findMaxNumber(arrays); System.out.println(maxNumber+"是最大值"); } //求极值 public static int findMaxNumber(int[] arrays){ int result=arrays[0]; int maxNumber=0; for(int i=1;i<arrays.length;i++){ if(result<arrays[i]){ result=arrays[i]; }else{ maxNumber=result; } } return maxNumber; } }

    第二题:冒泡排序

    public class Demo{ public static void main(String[] args){ int[] array=new int[]{12,349,578,91,3,2468,789,4,561,3,2}; sortNumbers(array); printArray(array); } //冒泡排序 public static void sortNumbers(int[] array){ int temp=0; for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } } //打印数组 public static void printArray(int[] array){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } System.out.println(); } }

    第三题:二分法查找

    二分法的查找条件是针对有序的数组

    public class Demo{ public static void main(String[] args){ int[] array=new int[]{1,2,3,4,5,6}; int index=findNumber(array,6); System.out.println(index); } //二分法查找 public static int findNumber(int[] array,int number){ int minIndex=0; int maxIndex=array.length-1; int midIndex=(minIndex+maxIndex)/2; int index=0; for(int i=0;i<array.length;i++){ if(array[midIndex]==number){ index=midIndex; }else if(number<array[midIndex]){ maxIndex=midIndex-1; index=midIndex=(minIndex+maxIndex)/2; }else if(number>array[midIndex]){ minIndex=midIndex+1; index=midIndex=(minIndex+maxIndex)/2; } } return index; } }

    冒泡排序和二分法结合

    public class Demo{ public static void main(String[] args){ int[] array=new int[]{3,15,645,613,24,7,98,79,8,4,64}; sortArrays(array); printArray(array); int index=findNumber(array,613); System.out.println(index); } //冒泡排序 public static void sortArrays(int[] array){ int temp=0; for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++){ if(array[j]>array[j+1]){ temp=array[j+1]; array[j+1]=array[j]; array[j]=temp; } } } } //二分法查找 public static int findNumber(int[] array,int number){ int minIndex=0; int maxIndex=array.length-1; int midIndex=(minIndex+maxIndex)/2; int index=0; for(int i=0;i<array.length;i++){ if(array[midIndex]==number){ index=midIndex; }else if(number<array[midIndex]){ maxIndex=midIndex-1; index=midIndex=(minIndex+maxIndex)/2; }else if(number>array[midIndex]){ minIndex=midIndex+1; index=midIndex=(minIndex+maxIndex)/2; } } return index; } //打印数组 public static void printArray(int[] array){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } System.out.println(); } }

    第四题:数组倒置

    public class Demo{ public static void main(String[] args){ int[] array=new int[]{1,2,3,4,5,6,7}; printArray(array); reverseArray(array); printArray(array); } //数组倒置 public static void reverseArray(int[] array){ for(int i=0;i<array.length/2;i++){ int temp=0; temp=array[i]; array[i]=array[array.length-1-i]; array[array.length-1-i]=temp; } } //数组打印 public static void printArray(int[] array){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } System.out.println(); } }
    Processed: 0.085, SQL: 8