本文共 6585 字,大约阅读时间需要 21 分钟。
程序的执行结构:
顺序结构
分支结构
循环结构
分支流程控制:
if
switch
循环
for循环和while循环的区别
当我们想使用i时,并且已知循环此数时,使用for循环,当我们仅仅是想利用循环判断结束或是不知道循环次数时,使用while循环
do-while和while的区别
do-while不管条件一定先执行一次,但while是先判断条件是否成立再决定执行与否
continue:
作用范围仅限于循环中,表示立即结束本次循环开始下一次循环
break:
作用范围为:循环和switch分支结构中。在循环当中,break表示跳出当前循环,在分支结构中,break表示跳出当前分支
Lable标签:
给循环命名,使用break,continue可以跳出指定的循环
方法
方法的优势:
1.提高代码的复用性
2.使程序的结构变得简单清晰
3.有利于程序的的维护修改
4.提高开发效率
方法的命名规则:
1.方法名见名知意
2.驼峰命名法
方法的声明:
方法的五个要素:访问修饰符,返回值,方法名,参数,方法体
修饰符有四种:public,protected,private,default
返回值:返回值的类型与方法体的类型息息相关
方法名:遵循见名知意,驼峰命名的规则
参数:方法里面的参数是形式参数,就像局部变量,仅限于方法内部使用
方法体:方法的核心,方法的功能全靠方法来实现
方法的调用:
方法名(参数),这里的参数是实际参数,必须和形式参数一一对应
完整的方法必须有方法的声明和方法的调用
方法的返回值:
方法调用处的实际参数在内部传给方法声明处的形参,然后形参在方法内部进行计算,结果通过return返回给返回数据类型处的位置,最后再返回给方法调用处
return的作用:
1.将方法体的运算结果返回
2.结束当前方法
Java的内存分配:
java当中的内存分为堆(heap),栈(stack),方法区,本地方法区,寄存器
堆:存储着实体,例如,对象,数组,或其他引用型数据,堆中数据不会立即释放,而是等待着java中的垃圾回收机制回收
栈:先进后出,里面存储着方法和基本类型数据,用完就立马释放
方法区:存储着程序的.class文件
本地方法区:存放在由外界引入的c,c++等
寄存器:分为代码寄存器和数据寄存器
方法重载:
同一个类中,方法名字相同,参数列表不同,就叫方法重载
参数列表的不同包括,参数个数不同,参数数据类型不同,参数顺序不同
重载的优点:
简化了开发和调用的压力,开发者不必为功能相似的诸多方法思索大量方法名,调用者不必记忆功能相似但方法名不同的诸多方法
递归:
在自己的方法体内,调用方法自己,实现某些循环的功能。
数组
定义:
1.数组是一个数据容器,可以存储基本数据类型的数据,也可以存储引用数据类型的数据
2.数组的长度是不可变的,数组的内存空间是连续的。数组一旦实例化完成,长度就不能再改变
基本数据类型和引用数据类型的比较
1.对于基本数据类型,会直接在栈中的方法区中开辟一块空间存储当前变量,将要存储的数据直接放在这块空间里
2.引用数据类型里面存储的是地址,这个地址是十六进制的数
数组的声明和实例化
/*方式一:先将数组声明并实例化,不赋值此时数组中的元素是默认的5个0*/int[] array = new int[5];/*方式二:先将数组声明,实例化,并赋值*/int[] array = new int[5]{ 1,2,3,4,5};/*将方式二简化*/int[] array = { 1,2,3,4,5};
补充:
数组在实例化时,需要使用new关键字(以后但凡遇到了new,都表示在堆上开辟了空间),数组其实是在堆上开辟的连续的空间,例如new int[5],就是在堆上开辟了5个连续的4字节空间,然后将堆上的内存地址,赋值给栈上的变量array引用
数组的下标:
下标是数组中的元素在数组中存储的位置索引,下标从0开始,一直到数组.length-1
典型异常:ArrayIndexOutOfBoundsException
数组遍历:
for(下标遍历法)
for (int i = 0; i < array.length; i++) { System.out.println(array[i]); }
foreach(增强版for循环)
for (int newArray:array) { System.out.println(newArray); }
二者区别:
1.如果需要在遍历的同时,获取到数组中的元素下标,需要使用下标遍历法
2.如果需要在遍历的同时,修改数组中的元素,需要使用下标遍历法
3.如果仅仅是想要获得数组中的每一个元素,不需要使用下标,也不需要修改数组中的元素,使用foreach,这种遍历方式的效率比下标遍历法高
经典排序算法
冒泡排序:
/*总共遍历n-1趟,每一趟挨个比较前后两个元素,每一趟可以让最大值到达数列末尾*/public static void bubbleSort(int[] array){ //总共遍历n-1趟 for(int i = 0;i < array.length-1;i++){ //挨个比较前后两个元素 for(int j = 1;j < array.length-i;j++){ if(array[j] < array[j-1]){ array[j] = array[j] ^ array[j-1]; array[j-1] = array[j] ^ array[j-1]; array[j] = array[j] ^ array[j-1]; } } }}
选择排序:
/*总共需要n-1趟排序过程,每次排序都可以选择最小的值放到对应的位置上*/public static void selectionSort(int[] array){ //总共遍历n-1次 for(int i = 0;i < array.length -1;i++){ int minIndex = i; for(int j = i+1;j < array.length;j++){ if(array[minIndex] > array[j]){ minIndex = j; } } //判断是否需要交换两值 if(minIndex != i){ array[minIndex] = array[minIndex] ^ array[i]; array[i] = array[minIndex] ^ array[i]; array[minIndex] = array[minIndex] ^ array[i]; } } }
插入排序:
/*需要n-1趟遍历,每次确定一个元素的位置*/public static void insertionSort(int[] array){ int j ; for(int i = 1;i < array.length;i++){ //记录要插入的元素 int temp = array[i] ; //通过循环,为temp寻找正确的位置 for(j = i;j > 0 && temp < array[j-1];j--){ array[j] = array[j-1]; } array[j] = temp; } }
快速排序:
/*快速排序:核心在于确定基准元素的位置,然后进行递归*/public static void quickSort(int[] array,int low,int high){ if(low < high){ int midle = getBasic(array,low,high); quickSort(array,low,midle-1); quickSort(array,midle+1,high); }}public static int getBasic(int[] array,int low,int high){ //由于输入数组是无序的,所以为了简便,选取第一个元素作为基准元素 int temp = array[low]; while(low < high){ //先从最右侧开始判断 while(low < high && array[high] > temp){ high--; } array[low] = array[high]; //再判断左侧 while(low < high && array[low] < temp){ low++; } array[high] = array[low]; } array[low] = temp; return low;}
归并排序:
/*归并排序的核心在于归并:采用分而治之的思想,先分再治*/public static void mergeSort(int[] array,int low,int high){ if(low < high){ int center = (low + high) / 2; //将一个数组分成两个半数组 mergeSort(array,low,center); mergeSort(array,center+1,high); //将两个半数组进行归并 merge(array,low,center,high); }}//归并public static void merge(int[] array,int low,int center,int high){ //定义两个变量,记录两个半数组的起始位置 int start1 = low; int start2 = center + 1; //定义一个辅助数组,存储两个数组归并后的结果 int[] newArray = new int[array.length]; //用来记录辅助数组的起始位置 int temp = low; //现在准备将两个数组里的元素挨个放到辅助数组里 while(start1 <= center && start2 <= high){ if(array[start1] < array[start2]){ newArray[temp++] = array[start1++]; }else{ newArray[temp++] = array[start2++]; } } //将某一个数组里的剩余元素全部放到辅助数组里 while(start1 <= center){ newArray[temp++] = array[start1++]; } while(start2 <= high){ newArray[temp++] = array[start2++]; } //元素全部放到辅助数组里后,再将辅助数组里的数放到原数组里 while(low <= high){ array[low] = newArray[low++]; } }
数组查询
遍历查询
二分查询
/*想要对数组进行二分查询,就必须先对数组进行排序*/public static int binarySearch(int[] array,int num){ //先对数组进行排序 quickSort(array,0,array.length-1); //记录数组的起始位置和结束位置 int low = 0; int high = array.length - 1; while(low <= high){ int mid = (low + high)/2; if(array[mid] > num){ high = mid - 1; }else if(array[mid] < num){ low = mid + 1; }else{ return mid; } } return -1;}/*采用快速排序算法对数组进行排序*/public static void quickSort(int[] array,int low,int high){ if(low < high){ int mid = getBasic(array,low,high); quickSort(array,low,mid-1); quickSort(array,mid+1,high); }}public static int getBasic(int[] array,int low,int high){ int temp = array[low]; while(low < high){ while(low < high && array[high] > temp){ high--; } array[low] = array[high]; while(low < high && array[low] < temp){ low++; } array[high] = array[low]; } array[low] = temp; return low;}
可变长参数
数据类型… 数组名
1.可变长参数必须放到形参列表的最后位置,且只能有一个
2.给可变长参数传值的实参可以直接写,个数不限制,内部会自动将他们放到可变长数组中
3.当具有可变长参数的方法与固定参数方法是重载关系时,固定参数的调用顺序优先于可变长参数。如果出现两个方法都有可变长参数时,那么这两个方法都不能使用
二维数组
数据类型[][] [] [] = new 数据类型[3] [5];
二维数组,第一位=维数组存的是第二维数组的地址,第二维数组就是普通的一维数组
Arrays工具类
转载地址:https://blog.csdn.net/m0_56433040/article/details/117380827 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!