JAVA学习-03-韩顺平老师
JAVA-数组总结
一维数组
-
01-数组初始化
1.动态初始化// 第一种 int a[] = new int[5]; // 第二种 先定义,后初始化大小 int a[]; //空值,还没有分配内存空间 a = new int[5]; // 分配了内存空间
2.静态初始化
// 语法 : 数据类型 数据名[] = {元素值,元素值....} double array1[] = {1,33,32,322,25};
3.注意细节:
-数组是多个相同类型数据的组合
-数组中的元素是任何类型的数据,但是不能混用
-数组创建后,如果没有赋值,有默认值
-数组的下标从0开始
-数组属于引用类型,数组型数据是对象(object) -
02-数组赋值机制
1.基本数据类型赋值,赋值方式为值拷贝,值传递int n1 = 1; int n2 = 2; n2 = 10; // n1 = 1 n2 = 2
2.数组在默认情况下是引用传递,传递的是地址
int arr1[] = {1,2,3}; int arr2[] = arr1; arrr2[1] = 10; // n1 = n2 = {1,10,3}
-
03-数组拷贝
int arr1[] = {1,32,31}; int arr2[] = new int[arr1.length]; // 开辟一个新的空间,获得一个新的地址 for(int i = 0; i < i.length; i++) { arr2[i] = arr1[i]; // for 循环赋值给arr2 }
-
04-数组反转
public class ArrayReserve { public static void main(String[] args) { //方法1 用一个中间值,前后调换顺序 int arr[] = {11,22,33,44,55,66}; for(int i = 0; i < arr.length; i++) { int temp = arr[arr.length-1-i]; arr[arr.length-1-i] = arr[i]; arr[i] = temp; } // 方法2 创建一个数组来完成拷贝 int arr2[] = new int[arr.length]; for(int i = arr.length-1; i >= 0; i--) { arr2[arr.length -1 - i] = arr[i]; } arr = arr2; // 销毁arr原来的地址,释放空间 } }
-
05-数组扩容
public class ArrayAddandSub { public static void main(String[] args) { // 数组扩容 int[] arr = {2,3,4,5}; int[] newArr = new int[arr.length + 1]; for(int i = 0; i < arr.length; i++) { newArr[i] = arr[i]; // 拷贝数组 } newArr[arr.length] = 6; // 插入增加的值 arr = newArr; // 销毁原来创建的数组 for(int i = 0; i <= arr.length; i++) { System.out.println(arr[i]); } } }
-
06-数组缩减
public class ArrayAddandSub { public static void main(String[] args) { // 数组扩容 int[] arr = {2,3,4,5}; int[] newArr = new int[arr.length - 1]; for(int i = 0; i < newArr.length; i++) { newArr[i] = arr[i]; // 拷贝数组 } arr = newArr; // 销毁原来创建的数组 for(int i = 0; i <= arr.length; i++) { System.out.println(arr[i]); } } }
-
07-数组排序
1.内部排序:在数组内部进行排序,不借助其他数组
2.外部排序:借助与其他数组来完成排排序
3.冒泡排序:public class BubbleSorting { public static void main(String[] args) { // 简单的冒泡排序 int[] arr = {132,33,311,22,55}; // 控制冒泡次数 for(int i = 0; i < arr.length - 1; i++) { // 控制比较交换 for(int j = 0; j < arr.length - i -1; j++) { if(arr[j] > arr[j + 1]) { // 前后交换 int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[ j ] = temp; } } } for (int i = 0; i < arr.length; i++) { // 打印输出 System.out.print(arr[i] + "\t"); } } }
-
08-数组查找
1.顺序查找,效率较低public class ArraySearch { public static void main(String[] args) { // 顺序查找 打印下标 int[] arr = {1,2,344,5,52}; int search = 344; // 需要查找的数 int index = -1; // 来判断是否查找到了 for(int i = 0; i < arr.length; i++) { if(arr[i] == search) { index = i; } } if( index == -1 ) { System.out.println(search + "不在数组中~"); } else { System.out.println(search + "在数组中的下标为:" + index); } } }
2.二分查找 (适用于已经排序号的数组)
public class BinarySearch { public static void main(String[] args) { // 二分查找 int[] arr = {11,22,33,44,55,66,77,88}; int searchNum = 33; // 查找的数 int start = 0; // 起始位置 int end = arr.length - 1; // 最后位置 int index = -1; // 记录查找的地址 while( start != end ) { int mid = (start + end) / 2; if(searchNum == arr[mid]) { index = mid; break; } else if (searchNum >arr[mid]) { start = mid; } else { end = mid; } } if( index == -1) { System.out.println("没有找到" + searchNum); } else { System.out.println(searchNum + "的下标为:" + index); } } }
二维数组
-
01-数组初始化
1.动态初始化// 第一种 int[][] a = new int[2][3]; // 第二种 先定义,后初始化大小 int[][] a; //空值,还没有分配内存空间 a = new int[2][3]; // 分配了内存空间
2.静态初始化
// 语法 : 数据类型 数据名[] = {元素值,元素值....} double array1[] = {{1,33,32,322,25},{1,2,3,4,5}};
3.注意细节:
-二维数组的每个元素是一个一维数组
-二维数组的元素存放的实际上是一个个一维数组的地址,每个地址指向一个一位数组
-二维数组的列数可以不相等
-二维数组的三种生名方式// 三种声明方式 // 1 int[][] arr = new int[2][3]; // 2 int arr[][] = new int[2][3]; // 3 int[] arr[] = new int[2][3];
-
数组练习
/* 1.动态创建列数不确定的数组(打印杨辉三角) 1 1 1 1 2 1 1 3 3 1 */ public class YangHui { public static void main(String[] args) { int col = 5; // 杨辉三角行数 int[][] arr = new int[col][]; // 声明行数,不声明列数 for(int i = 0; i < arr.length; i++) { arr[i] = new int[i+1]; // 动态生成列数 for(int j = 0; j < arr[i].length; j++) { // 每行最后一个和第一个为1 if(j == 0 || j == arr[i].length - 1){ arr[i][j] = 1; } else { //上一行两个数相加 arr[i][j] = arr[i-1][j] + arr[i-1][j-1]; } } } for(int i = 0; i < arr.length; i++) { // 打印输出 for(int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + "\t"); } System.out.println(""); } } } /* 已知一个升序数组,插入一个元素,使该数字依然是升序 例如 [10,23,45,56],添加33后,数组为[10,23,33,45,56] */ public class TwodismensionExercise { public static void main(String[] args) { int[] arr = {10,23,45,56}; int insertNum = 33; // 插入的数 // 扩容 int[] newArr = new int[arr.length + 1]; for(int i = 0; i < arr.length; i++) { newArr[i] = arr[i]; } newArr[arr.length] = insertNum; arr = newArr; // 销毁原来数组 // 从后往前排序,类似冒泡 for(int i = arr.length - 1; i > 0; i--) { if(arr[i] < arr[i-1]){ int temp = arr[ i ]; arr[ i ] = arr[i - 1]; arr[i - 1] = temp; } } for (int i = 0; i < arr.length; i++) { // 打印输出 System.out.print(arr[i] + "\t"); } } } /* 随机生产10个 1-100 之间的值保存到数组中,并且倒叙输出 以及求出平均值,最大值和最大值的小标,并查找里面是否有8 */ public class ArrayAddandSub { public static void main(String[] args) { int[] arr = new int[10]; for(int i = 0; i < arr.length; i++) { // 生成随机值,放入到数组中 arr[i] = (int)(Math.random()*100); } for(int i = arr.length - 1; i >= 0; i--) { //倒叙输出 System.out.print(arr[i] + "\t"); } // 查询最大值和它的下标 int max = 0; int maxIndex = 0; for(int i = 0; i < arr.length; i++) { if(arr[i] > max) { max = arr[i]; // 获得最大值 maxIndex = i; // 获得最大值下标 } } System.out.println("最大值为:" + max + "下标为:" + maxIndex); // 查询数组中是否有8 int flag = -1; for(int i = 0; i < arr.length; i++) { if (arr[i] == 8) { System.out.println("8在该数组中~"); } } if(flag == -1) { System.out.println("8不在该数组中~"); } } }