参考类
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中有栈和堆 栈:空间小,主要存储地址和局部变量的数据,存取速度快 堆:空间大,主要存储引用类型的变量,存取速度快
以数组:int[] array=new int[5];为例进行堆栈分析内存图分析如下:
在栈中存放的是左边的对象,堆中存储的是实例化的对象
需要注意的是 获得数组的长度使用的是数组的属性length;而获取字符串的长度使用的是字符串的length()方法。这个一定要区别开来
内存区分配: 栈内存:容量小、速度快,数据的生命周期短,先进先出,保存局部变量(方法里的变量,语句块中的变量,以及地址) 堆内存:容量大,速度慢,保存引用数据类型的数据,适合存储生命周期长的数据,适合存储对象 方法区:保存所有对象的共享数据
内存结构图如下: 以数组:int[] array=new int[5];为例进行堆栈分析 在栈中存储的是该数组的地址,在堆中存放的是该数组的实例对象二分法的查找条件是针对有序的数组
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(); } }